串口工作方式
串口工作方式
- 方式0
- 方式0输出
- 方式0输入
- 方式1
- 方式1输出
- 方式1输入
- 方式2或方式3
- 输出
- 输入
- 串口使用方法
- 如何计算波特率
- 串口初始化步骤
- 串口回传实验
- 模拟printf实验
- 串口接收数据不丢失实验
方式0
方式 0 时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输 入或输出口。
数据由 RXD(P3.0)引脚输入或输出,同步移位脉冲由 TXD(P3.1) 引脚输出。发送和接收均为 8 位数据,低位在先,高位在后。波特率固定为 fosc/12
方式0输出

方式0输入

方式1
方式 1 是 10 位数据的异步通信口。TXD 为数据发送引脚,RXD 为数据接收引 脚,传送一帧数据的格式如下所示。其中 1 位起始位,8 位数据位,1 位停止位。

方式1输出

方式1输入

用软件置 REN 为 1 时,接收器以所选择波特率的 16 倍速率采样 RXD 引脚电 平,检测到 RXD 引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入 移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄 存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移 位。当 RI=0,且 SM2=0(或接收到的停止位为 1)时,将接收到的 9 位数据的前 8 位数据装入接收 SBUF,第 9 位(停止位)进入 RB8,并置 RI=1,向 CPU 请求中断。
方式2或方式3
输出
方式 2 或方式 3 时为 11 位数据的异步通信口。TXD 为数据发送引脚,RXD 为 数据接收引脚。

发送开始时,先把起始位 0 输出到 TXD 引脚,然后发送移位寄存器的输出位 (D0)到 TXD 引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由 TXD 引脚输出。第一次移位时,停止位“1”移入输出移位寄存器的第 9 位上, 以后每次移位,左边都移入 0。当停止位移至输出位时,左边其余位全为 0,检 测电路检测到这一条件时,使控制电路进行最后一次移位,并置 TI=1,向 CPU 请求中断。
输入

接收时,数据从右边移入输入移位寄存器,在起始位 0 移到最左边时,控制 电路进行最后一次移位。当 RI=0,且 SM2=0(或接收到的第 9 位数据为 1)时, 接收到的数据装入接收缓冲器 SBUF 和 RB8(接收数据的第 9 位),置 RI=1,向 CPU 请求中断。如果条件不满足,则数据丢失,且不置位 RI,继续搜索 RXD 引脚 的负跳变。
串口使用方法
如何计算波特率

(256 - TH1) = 11.0592M/12169600,所以TH1=TL1=250;
串口初始化步骤
如何使用串口,大家可以按照以下几个步骤配置。
- ①确定 T1 的工作方式(TMOD 寄存器);
- ②确定串口工作方式(SCON 寄存器);
- ③计算 T1 的初值(设定波特率),装载 TH1、TL1;
- ④启动 T1(TCON 中的 TR1 位);
- ⑤如果使用中断,需开启串口中断控制位(IE 寄存器)。
串口回传实验
//功能:串口回传实验,PC通过串口通讯工具,发送字符a或字符串hello,MCU回复相同内容#include "reg52.h"typedef unsigned int u16;
typedef unsigned char u8;
typedef unsigned long u32;//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(i=ms;i>0;i--)for(j=123;j>0;j--);
}
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void); //串口1的初始化void main()
{Uart1_Init();while(1) //保持应用程序不退出{}
}void Uart1_Init(void)//配置串口为工作方式1,定时器1,工作方式为2,8位自重载
{//串口模块寄存器PCON |= 0x80; //使能波特率倍速位SMODSCON |= 0x50; //配置串口工作方式1,允许接收数据//定时器1相关寄存器TMOD &= 0x0F; //使用定时器1TMOD |= 0x20; //配置工作方式2,8位自重载TL1 = 0xFA; //设置定时计数器的低8位TH1 = 0xFA; //设置定时计数器的高8位TR1 = 1; //开启定时器1//中断相关寄存器ES = 1; //串行口中断允许位EA = 1; //CPU 中断允许(总允许)位
}void Uart1_Isp(void) interrupt 4
{u8 u8RecData = 0;if(RI) //检测串口接收完成中断{u8RecData = SBUF; //将串口模块缓存寄存器中的数据读到用户内存 SBUF = u8RecData; //将用户数据传输到串口缓存寄存器中,准备发送while(TI==0); //用户在等待串口发送单元发送完成RI = 0; //用户清除接收数据完成标志TI = 0; //用户清除发送数据完成标志}
}
模拟printf实验
//功能:实现printf的输出重定向#include "reg52.h"
#include "stdio.h"typedef unsigned int u16;
typedef unsigned char u8;
typedef unsigned long u32;//定义LED的引脚
sbit LED1 = P2^0;//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(i=ms;i>0;i--)for(j=123;j>0;j--);
}
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void); //串口1的初始化
void Uart1_SendData(u8 u8data); //串口1的发送数据void main()
{u16 i = 0;Uart1_Init();while(1) //保持应用程序不退出{i++;delay_ms(1000);printf("i = %03d,hello world!\r\n",i);}
}void Uart1_Init(void)//配置串口为工作方式1,定时器1,工作方式为2,8位自重载
{//串口模块寄存器PCON |= 0x80; //使能波特率倍速位SMODSCON |= 0x50; //配置串口工作方式1,允许接收数据//定时器1相关寄存器TMOD &= 0x0F; //使用定时器1TMOD |= 0x20; //配置工作方式2,8位自重载TL1 = 0xFA; //设置定时计数器的低8位TH1 = 0xFA; //设置定时计数器的高8位TR1 = 1; //开启定时器1//中断相关寄存器ES = 1; //串行口中断允许位EA = 1; //CPU 中断允许(总允许)位
}void Uart1_Isp(void) interrupt 4
{u8 u8RecData = 0;if(RI) //检测串口接收完成中断{u8RecData = SBUF; //将串口模块缓存寄存器中的数据读到用户内存 switch(u8RecData){case 0x10: LED1 = 1;break;case 0x11: LED1 = 0;break;default:break;}RI = 0; //用户清除接收数据完成标志}
}char putchar (char dat) //标准C的输出重定向
{Uart1_SendData(dat);return dat;
}void Uart1_SendData(u8 u8data)
{SBUF = u8data; //串口输出单元开始工作while(TI == 0) //等TI为高电平,输出完成{}TI = 0; //清除发送标志
}
串口接收数据不丢失实验
//功能:串口接收长字符(50以内)不丢失数据,通过printf发送给PC#include "reg52.h"
#include "stdio.h"typedef unsigned int u16;
typedef unsigned char u8;
typedef unsigned long u32;u8 u8Uart_Buffer[50]={0}; //串口缓存池
u8 u8Uart_Rx_STA = 0; //串口接收状态标志
//bit7 0:表示没有接收完成, 1反之
//bit6 0:表示没有接收到'\r', 1反之
//bit5--bit0 表示接收到的有效数据长度//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(i=ms;i>0;i--)for(j=123;j>0;j--);
}
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void); //串口1的初始化
void Uart1_SendData(u8 u8data); //串口1的发送数据
void Uart1_RecvData(void);void main()
{u8 len = 0;Uart1_Init();while(1) //保持应用程序不退出{if(u8Uart_Rx_STA & 0x80) //串口数据接收完成{len = u8Uart_Rx_STA & 0x3f;u8Uart_Buffer[len] = 0;printf("%s\r\n",u8Uart_Buffer);u8Uart_Rx_STA = 0; //清除状态标志}}
}void Uart1_Init(void)//配置串口为工作方式1,定时器1,工作方式为2,8位自重载
{//串口模块寄存器PCON |= 0x80; //使能波特率倍速位SMODSCON |= 0x50; //配置串口工作方式1,允许接收数据//定时器1相关寄存器TMOD &= 0x0F; //使用定时器1TMOD |= 0x20; //配置工作方式2,8位自重载TL1 = 0xFA; //设置定时计数器的低8位TH1 = 0xFA; //设置定时计数器的高8位TR1 = 1; //开启定时器1//中断相关寄存器ES = 1; //串行口中断允许位EA = 1; //CPU 中断允许(总允许)位
}void Uart1_Isp(void) interrupt 4
{u8 u8RecData = 0;if(RI) //检测串口接收完成中断{Uart1_RecvData();RI = 0; //用户清除接收数据完成标志}
}char putchar (char dat) //标准C的输出重定向
{Uart1_SendData(dat);return dat;
}void Uart1_SendData(u8 u8data)
{SBUF = u8data; //串口输出单元开始工作while(!TI); //等TI为高电平,输出完成TI = 0; //清除发送标志
}void Uart1_RecvData(void)
{u8 r = SBUF;if((u8Uart_Rx_STA & 0x80) == 0)//没有接收完成{if(u8Uart_Rx_STA & 0x40){if(r!='\n'){u8Uart_Rx_STA = 0; //将状态清0}else{u8Uart_Rx_STA |= 0x80; //标记数据接收完成}}else //还没有接收过'\r'{if(r == '\r'){u8Uart_Rx_STA |= 0x40; //标记数据接收到\r}else{if((u8Uart_Rx_STA & 0x3f)<48){u8Uart_Buffer[u8Uart_Rx_STA++] = r;}else{u8Uart_Rx_STA = 0;}}}}
}
相关文章:
串口工作方式
串口工作方式 方式0方式0输出方式0输入 方式1方式1输出方式1输入 方式2或方式3输出输入 串口使用方法如何计算波特率串口初始化步骤串口回传实验模拟printf实验串口接收数据不丢失实验 方式0 方式 0 时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输 入…...
统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现。以下是一些常见的方法和步骤: 一、通过命令行工具统计 查看Nginx访问日志: Nginx的访问日志通常默认存储在/var/log/nginx/access.log,但具体位置可能因安装和配置…...
Apache Airflow 快速入门教程
Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反,由于它的简单性和可扩展性,它已经获得了普及。在本文中,我将尝试概述它的主要概念,并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …...
42 基于单片机的智能浇花系统
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采样DHT11温湿度传感器检测温湿度,通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值,温度大于阈值则开启水泵,湿度大于阈值则开启风扇…...
乐橙云小程序插件接入HbuilderX
乐橙插件使用: 1.配置app.json文件,uniapp中在mainfest.json中配置 https://uniapp.dcloud.net.cn/collocation/manifest.html#mp-weixin ** 2、集成插件页面.json文件 ** uniapp在 pages.json 对应页面的 style -> usingComponents 引入组件&…...
VoCo-LLaMA: Towards Vision Compression with Large Language Models
视觉语言模型在各种多模态任务上取得了显著的成功,但经常受到有限上下文窗口和处理高分辨率图像输入和视频的高计算成本的瓶颈。视觉压缩可以通过减少视觉令牌数量避免该问题。先前方法使用额外模块压缩视觉令牌并强制LLM理解压缩的令牌。然而,LLM对视觉…...
Vue+vite 组件开发的环境准备
一.nodejs安装 进入Node.js 官网(Node.js — Run JavaScript Everywhere),点击下载。 双击打开,进行安装 双击打开后,点击 next(下一步),后面也是一直点击 next 无其他设置,直到 …...
基于社区发现的GraphRAG思路
GraphRAG出自2024年4月的论文《From Local to Global: A Graph RAG Approach to Query-Focused Summarization》,其代码也在2024年年中开源 。它在用图结构来完成RAG时,使用社区这个概念并基于社区摘要来回答一些概括性的问题。 Graph RAG流程如论文图1所…...
react学习记录
一、目录结构react优秀代码之react目录结构简洁之道React 作为一个库,不会决定你如何组织项目的结构。这是件好事,因为这样 - 掘金【React】项目的目录结构全面指南_react项目结构-CSDN博客 1、创建项目:开发文档 Getting Started | Create…...
Day2——需求分析与设计
教师端签到应用软件的需求分析; 产品经理如何写好产品需求文档(附模板) 需求分析是软件开发过程中的关键步骤,它确保了开发的软件能够满足用户的需求。以下是进行需求分析的具体步骤: 1. 确定分析目标 明确教师端签到…...
VScode离线下载扩展安装
在使用VScode下在扩展插件时,返现VScode搜索不到插件,网上搜了好多方法,都不是常规操作,解决起来十分麻烦,可以利用离线下载安装的方式安装插件!亲测有效!!! 1.找到VScod…...
【机器学习】机器学习的基本分类-监督学习-决策树(Decision Tree)
决策树是一种树形结构的机器学习模型,适用于分类和回归任务。它通过一系列基于特征的条件判断来将数据分割为多个子区域,从而预测目标变量的值。 1. 决策树的结构 根节点(Root Node) 决策树的起点,包含所有样本。根据某…...
【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤
目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步:定义程序的目标 1.8.2 第 2 步:设计程序 1.8.3 第 3 步:编写代码 1.8.4 第 4 步:编译 1.8.5 第 5 步:运行程序 1.8.6 第 6 步:测试和调试程序 1.8.…...
Docker 使用 Dockerfile 文件打包部署前端项目
编写 Dockerfile 文件: FROM nginx:latest ADD dist /etc/nginx/html/dist COPY nginx.conf /etc/nginx/nginx.conf ENV PATH /usr/sbin:$PATH EXPOSE 80 ENTRYPOINT ["nginx"] CMD ["-g","daemon off;"]编写 nginx.conf 文件&#…...
HTML-全
. CSS css后缀名的文件被html引用 在HTML中,CSS(层叠样式表,Cascading Style Sheets)是一种用于设置网页上的文本内容、图片布局和版面设计等外观样式的样式表语言。简单来说,CSS定义了HTML元素如何显示在浏览器中。…...
高效流程图绘制:开发设计流程图利器
在选择画流程图的工具时,不同的项目和使用场景会决定最佳的工具。以下是几款常见的流程图工具,并结合具体项目使用场景提供建议: 1. Lucidchart 特点: 在线协作:支持多人实时协作,适合团队合作。模板丰富&…...
数据仓库的概念
先用大白话讲一下,数据仓库的主要目的就是存储和分析大量结构化数据的。 > 那么它的核心目的是:支持商业智能(BI)和决策支持系统,也就是说,它不仅仅是为了存储,更重要的是为了分析提供便利。…...
AI - 谈谈RAG中的查询分析(2)
AI - 谈谈RAG中的查询分析(2) 大家好,RAG中的查询分析是比较有趣的一个点,内容丰富,并不是一句话能聊的清楚的。今天接着上一篇,继续探讨RAG中的查询分析,并在功能层面和代码层面持续改进。 功…...
Java基础面试题,46道Java基础八股文(4.8万字,30+手绘图)
Java是一种广泛使用的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)在1995年首次发布。它是一种面向对象的语言,这意味着它支持通过类和对象的概念来构造程序。 Java设计有一个核心理念:“编写一次&am…...
taro小程序马甲包插件
插件名 maloulab/taro-plugins-socksuppet-ci maloulab/taro-plugins-socksuppet-ci安装 yarn add maloulab/taro-plugins-socksuppet-ci or npm i maloulab/taro-plugins-socksuppet-ci插件描述 taro官方是提供了小程序集成插件的tarojs/plugin-mini-ci ,且支持…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
