历史上的今天
返回首页

历史上的今天

今天是:2025年08月06日(星期三)

正在发生

2021年08月06日 | 51单片机之UART

2021-08-06 来源:eefocus

串口相关寄存器配置

与51单片机串口相关的寄存器有SBUF,SCON,PCON,以及与定时器1(T1)相关的寄存器。


SBUF:串口缓冲寄存器,物理上实际有两个寄存器,地址重叠而已,一个用来发送,一个用来接受。通过读或者写不同操作,才操作不同寄存器,设计在一起是为了简化操作。写入SBUF寄存器的数据会通过TXD引脚发送出去,从RXD引脚的数据可以通过读SBUF获取。


SCON:串口配置寄存器。

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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)配置

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++); 

}

推荐阅读

史海拾趣

CHIMEI(奇美)公司的发展小趣事

奇美公司自成立以来,始终坚持品质至上的原则。公司注重产品质量和性能的提升,通过引进先进的生产设备和工艺技术,不断提升产品的品质和竞争力。同时,奇美还建立了完善的质量管理体系,从原材料采购到产品出厂,每一个环节都严格把控,确保产品的品质达到客户的要求。这种对品质的执着追求,使得奇美的产品在市场上赢得了良好的口碑。

Hartmann Codier GmbH公司的发展小趣事

随着全球化趋势的加速,奇美公司开始实施全球化战略,积极拓展国际市场。公司通过在海外设立分支机构、参加国际展会等方式,加强与国际客户的交流与合作。同时,奇美还积极引进国际先进的技术和管理经验,提升公司的国际化水平。这种全球化战略使得奇美能够更好地融入全球电子产业链,提升公司的国际竞争力。

Electro-Optical Systems Inc公司的发展小趣事

面对未来,EOS制定了明确的发展战略和规划。他们将继续深耕红外探测器领域,不断提升产品性能和质量。同时,EOS也将积极布局新领域,探索新的增长点。他们关注新兴技术如人工智能、物联网等的发展动态,寻求与这些技术的深度融合和应用。通过不断创新和拓展新领域,EOS将为实现企业的可持续发展注入新的动力。

请注意,以上故事框架是基于EOS在红外探测器领域的发展情况和行业趋势进行构建的,具体细节和数据可能需要根据实际情况进行调整和完善。

Holy Stone公司的发展小趣事

Holy Stone企业股份有限公司创立于1981年,总部位于台北市。创立之初,公司凭借创办人深厚的电子技术背景,迅速在电子元件市场站稳脚跟。起初,Holy Stone主要作为专业的电子零件代理商,为客户提供专业的技术服务与解决方案。这一阶段,公司通过扎实的专业技术基础和敏锐的市场洞察力,逐步建立起稳定的客户基础,为后续的发展奠定了坚实的基础。

台湾三礼(3L)公司的发展小趣事

在技术创新方面,三礼公司一直保持着领先地位。2009年,公司成功完成了UPI、DPI压模型电感量产布线及自制粉料能力,并获得了Texas Instrument认证。同时,公司重新发布了愿景并重新定义了3L,将持续改善、精益生产、以客为尊作为公司的三个核心L。随后,公司成立了精实中心,进一步推进精益生产的自动化配置,实现了生产效率的大幅提升和不良品及库存的减少。

Electric Imp Inc.公司的发展小趣事

为了进一步提升品牌影响力和市场份额,Electric Imp Inc.公司开始实施国际化战略。公司先后在北美、欧洲、亚洲等地设立了研发中心和分支机构,以便更好地了解当地市场需求和技术趋势。同时,公司还积极参加国际展览、研讨会等活动,与全球同行交流经验、分享技术。这些努力使得公司的国际化水平不断提高。

问答坊 | AI 解惑

调音台图纸

MACKIE_CR1604调音台.pdf…

查看全部问答>

改变VC++应用程序窗口的标题[转载]

摘  要:讨论基于MFC类库的Windows应用程序设计中,应用程序各种标题的改变方法。 关键词:MFC Windows编程标题Visual C++ 0 引言 有一个演示VC++中的消息处理的单文档应用程序。该程序开始运行的情况如下: 窗口中的初始文档标题竞显示为U ...…

查看全部问答>

WINCE5.0 建立拨号连接(急)

    最近有个项目,需要用代码实现建立一个拨号连接,我用Ras函数RasSetEntryProperties实现建立拨号连接了,但是好象不能设置波特率和附加拨号命令等APN的一些信息(如:  +CGDCONT=1,\"IP\",\"CMNET\",0,0,0);我在网上搜索, ...…

查看全部问答>

关于网卡DMA的问题

修改后的intel PCI-E千兆网卡直接将DMA到用户空间,测试了一下可以达到千兆线速。 问题是如果CPU同时从该DMA缓冲区拷贝数据包到另一片内存区域时速度很慢,只有400Mbit/s。 是不是CPU和网卡争用内存线造成的啊?网卡DMA到底是什么方式啊? 请高人 ...…

查看全部问答>

串口通讯问题

串口通讯时用3根线和用9根线有什么区别啊? 希望高手指点…

查看全部问答>

驱动问题?

首先声明我从来没有做过WinCE下驱动的开发,只是会做个镜像之类 现在我有一个手机可以做Modem,想做在WinCE下的Modem驱动,USB口的,从对WinCE开发一无所知到开发出驱动一般需要多长时间?需要哪方面的资料?有没有WinCE下USB Modem通用驱动?…

查看全部问答>

佳灵变频器故障与维修

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 ...…

查看全部问答>