用插值调整法设计单片机串行口波特率
2006-05-07
摘要:传统方法设计单片机串行口波特率时,往往要使用特殊频率的晶振。本文在分析MCS-51单片机串行口工作原理的基础上,提出基于12MHz晶振的单片机系统,通过编程实现所需波特率的插值调整设计方法。
关键词:单片机 串行口 波特率 调整
引言
单片机在当今的仪表及工业测控设备上应用相当广泛,在构成分布式系统进行较长距离数据通信或是要求用有限的硬件资源进行数据交换时,都要用到串行口。也正是串行口使得MCS-51单片机增色不少,成为单片机开发应用中不可缺少的部分。
1 MCS-51单片机串行口工作原理
MCS-51单片机串行口采用异步通信方式。异步通信方式是以字为单位来传送数据的。每一个字由起始位、数字位、奇偶检验位、停止位等构成,称为一帧,如图1所示。在帧格式中,一个字由起始位开始,至停止位结束。起始位为0,用来通知接收端一个新的字开始到来,同时,起始位还被用作接收端的同步时钟,以保证后面的接收能正确进行。起始位后是5~8位数据,接着是奇偶校验位(可省略),最后是停止位。停止位为1。
图2为接收时序图。在接收时,接收器在每一个接收时钟的上升沿(T1的溢出信号)采样接收数据线RXD。当发现出现负跳变时,16分频计数器就立刻复位,以使计数器满度翻转的刻度恰好与输入位的边沿对准。在以后的接收里,16分频计数器计算T1的溢出,每满度翻转1次就接收1位数据。在计数器第7、8、9状态时,所对应的T1溢出作为位检测采样控制脉冲。每个脉冲控制位检测器对RXD端口采样1次,这3个脉冲理论上对应于每一位的中央段,采样的结果按三中取二法确定RXD的值,以抑制干扰。如果所接收的第一位不是0,说明不是一帧数据的起始位,该位被摒弃,接收电路复位,等待下一个负跳变。
参看串口接收脉冲时序图,若所接收的数据与接收终端自身的波特率设置有差异,即在接收起始位时,由于起始位的同步作用,7、8、9三个位采样检测脉冲处在该数据位的中断。随着接收的进行,检测采样脉冲将逐步偏离接收数据的中央,在接收停止位时偏移达到最大值。但由于下一帧起始接收停止位时偏移达到最大值。但由于一帧起始位的同步作用,致使前面累积的误差对以后的接收不影响。因此只要这种偏移在允许范围内就不至于发生错位或漏码。由分析可知,当检测时钟脉冲对于接收数据的累积误差达50%,则采样的最后一位数据已处于检测时钟有效与无效的临界状态,这时就可能出错。考虑到器件的离散性,累积误差不应大于标准值的25%。因此,对于常用的9位和11位一帧的串行传输,通常规定其最大的波特率允许误差分别为2.8%和2.3%。
2 波特率传统设计方法
MCS-51单片机串行口波特率的传统设计,通常是把定时器T1置于工作方式2(8位自动重装定时初值方式)。这样,只要给T1装入初值,启动T1便会产生相应的溢出,串行口工作方式1、3的波特率计算公式为
整理后,得到定时器T1在相应波特率时的初装值:
式中:SMOD-波特率倍增位;fosc-振荡频率;X-定时器初值
若用户板采用的是常用的12 MHz晶振,即有许多常见的波特率由式(2)算得X值非整数。此,常见的参考资料会使用特定的晶振来获取所需的波特率。
其实,由前面分析可知,数据传输以帧为单位,每帧开关的起始位同时具有同步时钟的作用。因此,只要在每帧内的误差足够小就可以了,追求过高的精度并无多大的意义。表1给出了几种采用12
MHz晶振得到的常用波特率及其误差值。
表1 采用12MHz晶振产生的常用波特率
波特率/Bs-1 | fosc/MHz | SMOD | 定时器T1 | 误差/% | ||
C/T | 方式 | 重装初值 | ||||
方式1、3:62500 4800 2400 1200 137.5 |
12 12 12 12 12 |
1 1 1 1 0 |
0 0 0 0 0 |
2 2 2 2 2 |
FFH F3H E6H CCH 1DH |
0.16 0.16 0.16 0.12 |
3 插值调整法设计波特率的方法
由以上看出,在采用12 MHz晶振的前提下,尚有9600b/s、19 200b/s等常用波特率,采用式(2)所得的结果误差过大而不能实现。当然,一般情况下通过换用晶振来获取所需的波特率是无可非议的,但遇到诸如:(1)所开发的系统要求能随时方便地切换波特率;(2)对单片机用户板成品进行更改串口波特率;(3)选用非整数的晶振会增大程序调试难度等这些应用系统时。通过更换晶振来获取所需要的波特率不是很理想。笔者在应用开发过程中发现,可以通过适当的编程方法来实现所需的波特率。
由串行口的工作原理可知,T1的溢出信号作为串行口的16分频计数器的计数脉冲信号,而计数器的翻转溢出作为串行口的工作时序控制脉冲。故此,如果能在收发每一位数据的时间td内,让T1产生相应的溢出次数作为串行口的工作时序控制脉冲,便可让串行口产生相应的波特率了。
实际应用中,我们采用了常用的12MHz晶振,按常规,让定时器T1作为波特率发生器,工作在方式2,装入整数值X,产生比所需略高的T1溢出。而让定时器T0以传送每一位数据的时间td来产生中断。在T0中断服务程序中,关停定时器T1若干个周期(由计算确定),这样,便可获得与所需波特率相适应的T1溢出。其实质就是让前15个T1溢出计数按原先设定值进行,而在产生第16个T1溢出的计数过程中,根据需要对定时器T1关闭若干个周期,以使T1在第16个计数溢出周期变长,从而达到调整每一位数据传送时间td的目的。
采用插值调整法自身所产生的误差最大值为
ΔT=(1/2)N+nTb
ΔT由两部分组成:(1)由于插值补偿,而造成采样检测时间偏离数据位中间值所致误差Tp,Tp=(1/2)N,N为插值数,Tp为固定值,(2)每一位数据(经调校后的)周期与标准波特率之间误差Tb。Tb为累积值,在接收数据帧的最后一位时达到最大值:nTb,n为每帧数据的位数。
4 应用设计实例
下面以12 MHz晶振设计9600 b/s的波特率为例,说明插值调整法设计波特率的方法。
(1)求取每位代码的传送时间td:
td=1/波特率=(1/9600)=104.17μs
(2)求取定时器初装值X的最大值:
得X=252,算得t=16×(2 8-252)=96
(3)计算每位的偏差值(也即插值数):
N=td-t=104.17-96约等于8
(4)此时每位的误差为
Tb=104.17-96-8=0.17μs
即接收时累积差最大值为
ΔT=(1/2)N+nTb=4+1.87=5.87μs
由此可得累积误差率为ΔT/td=5.87/104.17=5.64%
折算为波特率误差时为0.51%。
发送时波特率误差为(11位/帧)
ΔT=0.17×11=1.87μs,ΔT/td=1.87/104.17=0.16%
由以上可以看到,误差要比允许值小得多。
(5)T0的中断周期收td的近似值104μs。
汇编源程序:
ORG 0000H
JMP MAIN ;主程序入口
ORG 000BH
JMP TINT ;T0中断入口
MAIN:MOV TMOD,#22H;设置T1、T0为工作方式2
MOV TL0,#0A08 ;T0赋初值
MOV TH0,#98H
MOV IE,#10000010B ;允许T0中断,禁止;
T1中断
SETB PT0 ;T0设为高级中断
MOV PCON,#80H ;设置波特率倍增位
MOV TL1,#0FCH ;为T1赋初值
MOV TH1,#0FCH
SETB TR0 ;启动TR0
SETB TR1 ;启动TR1
…… ;进行其他设置及任务执行
TINT:CLR TR1 ;关停TR1
SETB TR1 ;重新启动T1
RETI ;中断返回
注意,由于T0中断响应要3~8个机器周期。为使T0中断发生在T1的第16次溢出计数中,故此T0的预装值为0A8H。
结束语
插值调整法,是通过编程的方法来获得所需的波特率的,省却了传统方法修改硬件的麻烦,使变换串行口波特率显得很方便。但由于该方案采用中断方式处理,因此,系统会产生较频繁的中断。在设计单片机系统时,要充分考虑相关的问题。
- CGD和QORVO将彻底改变电机控制解决方案
- 博世与清华大学续签人工智能研究合作协议 共同推进工业领域人工智能发展
- 兆易创新MCU新品重磅揭幕,以多元产品和方案深度解锁工业应用场景
- 当AI遇上边缘计算,研华以Edge AI推进嵌入式产业变革
- 研华科技:投身Edge AI创新,驱动智能未来
- 英飞凌推出全球首款非接触式支付卡技术SECORA™ Pay Green,最多减少100%的塑料垃圾
- 凝心聚力推动创新转型,清洁能源时代下特高压领域谱写更多可能性
- 恩智浦开展技术日巡回研讨会,全维赋能大众市场创新发展
- ACM6754 24V/4.8A三相无感无刷直流BLDC电机驱动芯片方案
- 罗克韦尔自动化亮相第七届进博会,三大引擎链动可持续未来