微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机模拟串口发送和波特率问题

单片机模拟串口发送和波特率问题

时间:11-27 来源:互联网 点击:

波特率的研究


通常情况下,8051系列单片机外接晶振频率一般是12MHz、24MHz、48MHz如图7-6-1,为什么会这样选取呢?从前面的章节已经介绍8051系列单片机的每12个时钟周期为一个指令周期,当8051系列单片机外接12MHz晶振时,指令周期=12/12MHz=1us;若外接24MHz晶振时,指令周期=12/24MHz=0.5us;若外接48MHz晶振时,指令周期=12/48MHz=0.25us。8051系列单片机外接能够被除尽的晶振,在使用单片机内部的定时器/计数器资源时作定时器使用时能够得到精确定时应用;当使用汇编语言编程时,可以清楚知道当前每一行代码执行的时间。
8051系列单片机外接能够被除尽的晶振即12MHz、24MHz、48MHz这些晶振时,波特率的精确性就得不到保证。

假若现在单片机外接的晶振为12MHz时,以T/C2作波特率发生器,根据波特率公式:
波特率=Fosc/2x16x(65536-t)
9600=12MHz/2x16x(65536-t)
t=65496.9375
“65496.9375”不是一个整数值,是一个带有小数点的数值。对于常用的8位、9位、11位一帧的数据接收与传输,最大的允许误差分别是6.25%、5.56%、4.5%。虽然波特率允许误差,但是这样通信时便会产生积累误差,进而影响数据的正确性。唯一的解决办法就是更改单片机外接的晶振频率,更改为常用于产生精确波特率的晶振如11.0592MHz、22.1184MHz。
假若现在单片机外接的晶振为11.0592MHz时,以T/C2作波特率发生器,根据波特率公式:
波特率=Fosc/2x16x(65536-t)
9600=11.0592MHz/2x16x(65536-t)
t=65500=0xFFDC

虽然使用11.0592MHz、22.1184MHz的晶振能够产生精确的波特率,但是用于系统精确的定时服务不是十分的理想。例如单片机外接11.0592MHz晶振时,指令周期=12/11.0592MHz≈1.085us,是一个无限循环的小数。当单片机外接22.1184MHz晶振时,指令周期=12/22.1184MHz≈0.5425us,也是一个无限循环的小数。

串口工作在方式1时分别采用T/C1和T/C2产生常用波特率初值表如下。

波特率
(11.0592MHz)
初值波特率
(12MHz)
初值
TH1、TL1
(SMOD=0)
TH1、TL1
(SMOD=1)
TH1、TL1
(SMOD=0)
TH1、TL1
(SMOD=1)
12000xE70xD012000xE50xCB
24000xF30xE724000xF20xE5
48000xF90xF348000xF90xF2
96000xFC0xF996000xFC0xF9
144000xFD0xFB144000xFD0xFB
192000xFE0xFC192000xFE0xFC


波特率
(11.0592MHz)
初值波特率
(12MHz)
初值
RCAL2HRCAL2LRCAL2HRCAL2L
12000xFE0xE012000xFE0xC8
24000xFF0x7024000xFF0x64
48000xFF0xD848000xFF0xB2
96000xFF0xDC96000xFF0xD9
144000xFF0xE8144000xFF0xE6
192000xFF0xEE192000xFF0xED

如果大家想通过设置不同的晶振获取更加多的波特率的值,可以下载以下工具进行计算:
软件下载地址:http://files.cnblogs.com/wenziqi/单片机多功能助手.rar


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top