admin管理员组文章数量:1597898
目录
一、理论介绍
1. SCON(Serial Control 串口控制)(可位寻址)
1): SM0、SM1(Serial Mode)
2): SM2
3): REN (Receive Enable)
4): TB8、RB8
5): TI、RI
2. SUBF(Serial Buffer 串行数据缓冲器)
3. PCON(Power Control 电源控制)(不可位寻址):
二、串口配置代码实例
1. 串口初始化函数
2. 串口发送函数
3. 串口接收设置
三、进一步了解串口
1. 硬件电路
2. 常见通信接口比较
3. 串口时序图、相关参数(可在串口助手中设置)
4. 串口内部模式图
51单片机内部有1个UART(Univer Asynchronous Receiver Transmittier,通用异步收发器)可以实现单片机的串口通信;串口相关引脚有RXD和TXD,在STC89C52单片机上,RXD与P3.0寄存器共用引脚10,TXD与寄存器P3.1共用引脚11
一、理论介绍
51串口相关寄存器
下面按顺序对每个寄存器进行解析(基于操作手册):
1. SCON(Serial Control 串口控制)(可位寻址)
位序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
位符号 | SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
含义 | 工作模式控制位 | 接收控制位 | 方式2或3,发送和接收的第9位数据 | 发送和接收中断请求标志位 |
1): SM0、SM1(Serial Mode)
常配置UART的工作模式为方式1(8位UART,波特率可变),则令SM0=0; SM=1,本文以该模式为例进行串口配置
2): SM2
使用模式1时不起作用,配置为0
3): REN (Receive Enable)
置1,允许接收
4): TB8、RB8
使用模式1时不起作用,配置为0
5): TI、RI
在初始化时置为0即可,当发送/接收完成时,硬件自动置1,执行中断函数,然后需要软件置0使复位。
至此,SCON的所有位寄存器分析完毕,回顾一下整个寄存器:
位序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
位符号 | SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
含义 | 工作模式控制位 | 接收控制位 | 方式2或3,发送和接收的第9位数据 | 发送和接收中断请求标志位 |
若要使用UART的模式1,且允许接收,则配置SCON = 0X50 //0101 0000
2. SUBF(Serial Buffer 串行数据缓冲器)
AKA: 串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址;写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器,在串口初始化时不需要配置(具体工作方式见目录中“串口内部模式图”)
3. PCON(Power Control 电源控制)(不可位寻址):
其中,SMOD表现为“置0时T1溢出率除以2,置1时不操作”(具体工作方式见目录中“串口内部模式图”)
二、串口配置代码实例
1. 串口初始化函数
串口的初始化包括串口本身初始化和波特率配置;前者需配置SCON、PCON寄存器,后者需配置定时器,此处注意串口需要使用定时器1,模式2(8位自动重装模式),而定时器一般配置的是定时器0,模式1,二者配置代码区别如下:
串口定时器配置:定时器1,模式2
定时器定时/记数配置:定时器0,模式1
区分模式1与模式2:
十六位(模式1)记数容量大,但每次都需要自己写的代码赋初值,效率低;
双八位(模式2)将16位分开,8位计数,另8位存放初值,每次计数完成后AR(自动重装)会自动将初值赋给CNT(计数器),不用另做代码处理,效率高。
具体地,模式2时,定时器会在计数值溢出后自动重新赋值,而不用等待定时器溢出后程序响应中断,再执行相应语句,因而能提高效率
也可用串口助手配置波特率,注意89C52中没有AUXR寄存器,相关代码要删除(使用波特率加倍以减小误差):
最终配置代码如下:
代码释义:
SCON、PCON是串口配置,TMOD是关于波特率的定时器模式配置,定时器初值借助软件计算而得,赋值完成后禁止定时器1中断,因为定时器1在用作生成波特率时,只要产生溢出就会产生波特率,不需要中断响应,相应的,ET1=0后自然也不需要对EA置0,最终用TR1=1启动计时器
2. 串口发送函数
函数执行过程:将待发送的数据写入发送缓存 → 循环检测发送中断信号TI,若检测到TI=1则跳出循环,对TI置0复位
至此,我们可以用串口初始化函数、串口发送函数通过串口向电脑发送数据,其主函数如:
void main()
{
UART_Init();
UART_SendByte(0x11); //执行结果:电脑端串口助手接收到数据11
}
注意:使用串口助手时,波特率的配置和串口初始化时的配置要对应,串口要对应;此外,发送速率过快或波特率过大可能产生数据误差,若收发数据不一致,可尝试减慢数据发送速度(如加入延时函数)、更改波特率(如波特率加倍)以减小数据误差
3. 串口接收设置
在上述基础上,如果要实现串口的接收,则初始化时需要这样设置:
不同于仅实现串口发送时的初始化函数,这里在配置SCON中的REN=1的基础上,还需配置EA=1; ES=1; (串口接收要用中断)。即:在原有函数的基础上,添加了“允许接收、中断程序”(原有的发送功能仍然有效)
注意!由于51单片机串口结构及中断原理,串口发送和接收时都会触发中断(同为中断号4),因此,需要通过接收并判断中断信号RI,区分中断信号的具体类别,具体中断函数例如:
上图中,RI=1表示接收到数据,判断后记得软件置0(复位);至此,我们将中断函数写入主程序,就可以实现当串口接收到设定数据时,执行相应操作
三、进一步了解串口
1. 硬件电路
注:“电平标准”是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
1. TTL电平: +5V表示1,0V表示0
2. RS232电平: -3~-15V表示1, +3~+15V表示0
3. RS485电平:两线压差+2~+6V表示1, -2~-6V表示0 (差分信号)例如当USB与单片机串口通信,因电平标准不同,需加入芯片转换电平
2. 常见通信接口比较
注:不同“通信方式”区别如下:
全双工:通信双方可以在同一时刻互相传输数据
半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
单工:通信只能有一方发送到另一方,不能反向传输
异步:通信双方各自约定通信速率
同步:通信双方靠一根时钟线来约定通信速率
总线:连接各个设备的数据传输线路(类似于联通各城市的高速公路)
3. 串口时序图、相关参数(可在串口助手中设置)
相比8位数据格式,9位数据格式多出来一位检验位
4. 串口内部模式图
由上图可以看到,串口利用定时器1(图中T1) 控制波特率。
此外,以下图串口发送数据过程为例,当发送控制器使能控制门,将发送寄存器SBUF中的数据由TXD发送出去的同时,还会产生发送中断请求信号TI(Transmit Interrupt),激活中断程序。
版权声明:本文标题:【51】串行口通信,配置理论和c51代码 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728299207a1152807.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论