暑假工作日志——关于51的串口的小问题

今天应厉行同学要求,帮忙调试一段51的串口代码。对于我这种早已抛弃了51的人来说觉得没什么技术含量,但是后来调试的过程也是让我费了些心思。

硬件时钟是12M,由于习惯了STM32的库函数,所以有点不喜欢51的还需要自己根据波特率来计算计数器初值。

51的初值计算有一个公式:

其中SMOD指的是波特率加倍位,是特殊功能寄存器-----电源控制寄存器PCON中的最高位,,当SMOD=0时表示波特率不加倍,SMOD=1时表示波特率加倍。Fosc表示的是系统时钟频率。在本设计中系统时钟是12M。

万事俱备只欠东风,本设计波特率采用9600,经过计算在12M晶振下要实现波特率为9600的串口通信,定时器初值应该设为0xF9;设定完毕之后,下载到单片机里,与PC进行通信,发现数据乱码。于是检查代码,没有发现问题。

绞尽脑汁,试着将波特率设为119200试试,我们将定时器初始值改为0xFD,然后下载代码到目标器件,发现结果仍然乱码。

思考良久,突然想起以前郭天祥老师讲过一句话,大概就是说,用于串口通信时最好选用11.0592的晶振,于是我怀疑是晶振的问题。因为在计算波特率时,我也发现结果是有误差的。于是我思考着将波特率设为4800,结果正确。这也证明了我的猜想,也就是说用12M晶振时最好将波特率设置在9600以下。通过查看相关资料,我们发现了这样一张表,这也证明了我的猜想。如下:

原文地址:https://www.cnblogs.com/wan0807/p/4791799.html