历史上的今天
今天是:2025年08月06日(星期三)
2021年08月06日 | 51单片机之UART
2021-08-06 来源:eefocus
串口相关寄存器配置
与51单片机串口相关的寄存器有SBUF,SCON,PCON,以及与定时器1(T1)相关的寄存器。
SBUF:串口缓冲寄存器,物理上实际有两个寄存器,地址重叠而已,一个用来发送,一个用来接受。通过读或者写不同操作,才操作不同寄存器,设计在一起是为了简化操作。写入SBUF寄存器的数据会通过TXD引脚发送出去,从RXD引脚的数据可以通过读SBUF获取。
SCON:串口配置寄存器。

SM0和SM1决定了串口的工作方式

10位UART是我们常用的模式,包括起始位,8个数据位(SBUF),一个停止位。11位UART多了一个数据位(TB8,发送数据的第八位;RB8,接受数据的第八位)。波特率可变是由于此时的定时器1 作为UART的时序信号,定时器1的溢出率决定了波特率,同时也受到PCON种的SMOD位的加倍影响。
SM2是多机通信控制位。只有用到了11位UART才会将SM2置1。
REN是接受使能,REN=1时,允许接收,REN=0时,禁止接收。
TI和RI分别是发送和接受中断标志位,当完成一次发送或者接收会将相应的标志位硬件置1,必须要软件清“0”。当设置了串口中断,还会进入中断函数。注意这两者会进入同一个中断函数,注意判断标志位来区别到底是放松中断还是软件中断。
PCON:电源控制寄存器,其实只有最高位SMOD对串口有影响,SMOD=1,波特率加倍,SMOD=0,波特率不加倍。
T1相关寄存器的配置:使用可变波特率,T1一般用8位自动重装载模式,最关键的是确定T1的自动重装数RELOAD,步骤如下:
计算RELOAD(SMOD=0时)
a) 12T模式的计算公式:RELOAD=256-(int) (Fosc/Baud0/32/12+0.5)
b) 1T模式的计算公式:RELOAD=256-(int) (Fosc/Baud0/32+0.5)
式中: (int) (X+0.5)表示对X进行四舍五入
Fosc晶振频率
Baud0标准波特率
计算用RELOAD产生的波特率
a) 12T Baud = Fosc/(256-RELOAD)/32/12
b) 1T Baud = Fosc/(256-RELOAD)/32
计算误差
error=(Baud-Baud0)/Baud0*100%
如果绝对误差>4.5% 要更换波特率频率或更换晶振频率,再重复1-4
上面的步骤来自于STC的官方手册。上面提到的12T模式是大多数51单片机的工作模式,STC的后续单片机支持1T模式,速度会快12倍。
串口的使用
下图展示了一些常用重装值(RELOAD)配置

对于常用的11.0592Mhz晶体下,9600Baud配置的代码封装成C文件和H文件,方便调用
uart.h文件
#ifndef __UART_H
#define __UART_H
#include void Uart_Init(void); void Uart_SendData(unsigned char dat); void Uart_SendString(unsigned char *s); #endif uart.c文件 #include "uart.h" void Uart_Init(void) { SCON = 0x50; // SCON: 模式 1, 8位UART, 接收使能 TMOD |= 0x20; // TMOD: Timer1,模式2, 8位自动重装 TH1 = 0xFD; // TH1: 重装值 波特率:9600 晶振:11.0592MHz TR1 = 1; // TR1: Timer1打开 EA = 1; //打开总中断 //ES = 1; //打开串口中断 } void Uart_Isr() interrupt 4 using 1 { if (RI) { RI = 0; //清除接收标志位 } if (TI) { TI = 0; //清除发送标志位 } } void Uart_SendData(unsigned char dat) { SBUF = dat; while (!TI); TI=0; } void Uart_SendString(unsigned char *s) { while (*s) Uart_SendData(*s++); }
上一篇:基于8051实现的双倒计时器(Version1.1)
下一篇:51单片机之最简系统
史海拾趣
|
摘 要:讨论基于MFC类库的Windows应用程序设计中,应用程序各种标题的改变方法。 关键词:MFC Windows编程标题Visual C++ 0 引言 有一个演示VC++中的消息处理的单文档应用程序。该程序开始运行的情况如下: 窗口中的初始文档标题竞显示为U ...… 查看全部问答> |
|
最近有个项目,需要用代码实现建立一个拨号连接,我用Ras函数RasSetEntryProperties实现建立拨号连接了,但是好象不能设置波特率和附加拨号命令等APN的一些信息(如: +CGDCONT=1,\"IP\",\"CMNET\",0,0,0);我在网上搜索, ...… 查看全部问答> |
|
修改后的intel PCI-E千兆网卡直接将DMA到用户空间,测试了一下可以达到千兆线速。 问题是如果CPU同时从该DMA缓冲区拷贝数据包到另一片内存区域时速度很慢,只有400Mbit/s。 是不是CPU和网卡争用内存线造成的啊?网卡DMA到底是什么方式啊? 请高人 ...… 查看全部问答> |
|
1.1实例 (1) 一台T9-7.5KW变频器一启动就跳“FL” 分析与维修:打开机盖没有发现任何烧坏的迹象,在线测量IPM模块(FP40R12KE3)基本判断没有问题,故障确定为驱动板JL35GP-250-1DB保护电路起控,为进一步判断问题,将IGBT模块拆下后将FL保护线断开,再 ...… 查看全部问答> |
|
我看到LM317的一个电路图,如下。R1两端1.25V,不接电池,R1和R2两端是7V左右。电流大概5mA.如果R3=1欧,它两端电压5mV,三极管不导通。似乎三极管没有用。接上电池似乎也一样。我知道,这个电路肯定没问题,只是想不通。我是菜鸟,请高手指教。谢 ...… 查看全部问答> |
|
msp430 MSP-FET430UIF firmware update 问题 开始我用的是cce3.1 因为有16KB 限制用了破解4.1.2 当编译后 下载程序提示 update 之后就和很多人一样程序烧不进去,cce3.1也烧不进去 现在我把ccs4.1.2卸载掉 cce3.1还是烧不进去 现在端口 是 msp ...… 查看全部问答> |




