工业控制
返回首页

用插值调整法设计单片机串行口波特率

2006-05-07

    摘要:传统方法设计单片机串行口波特率时,往往要使用特殊频率的晶振。本文在分析MCS-51单片机串行口工作原理的基础上,提出基于12MHz晶振的单片机系统,通过编程实现所需波特率的插值调整设计方法。

    关键词:单片机 串行口 波特率 调整

引言

单片机在当今的仪表及工业测控设备上应用相当广泛,在构成分布式系统进行较长距离数据通信或是要求用有限的硬件资源进行数据交换时,都要用到串行口。也正是串行口使得MCS-51单片机增色不少,成为单片机开发应用中不可缺少的部分。

1 MCS-51单片机串行口工作原理

MCS-51单片机串行口采用异步通信方式。异步通信方式是以字为单位来传送数据的。每一个字由起始位、数字位、奇偶检验位、停止位等构成,称为一帧,如图1所示。在帧格式中,一个字由起始位开始,至停止位结束。起始位为0,用来通知接收端一个新的字开始到来,同时,起始位还被用作接收端的同步时钟,以保证后面的接收能正确进行。起始位后是5~8位数据,接着是奇偶校验位(可省略),最后是停止位。停止位为1。

    下面以单片机串行口工作方式3为例说明其工作原理。串口在发送时,内部有一个16(当SMOD=1时)分频计数器,用于计算T1的溢出。当16分频计数器每次满度翻转时(由全1变全0)的那个机器周期,即把1位写入“SBUF”中的数据送到TXD口上。

图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。

结束语

插值调整法,是通过编程的方法来获得所需的波特率的,省却了传统方法修改硬件的麻烦,使变换串行口波特率显得很方便。但由于该方案采用中断方式处理,因此,系统会产生较频繁的中断。在设计单片机系统时,要充分考虑相关的问题。

进入工业控制查看更多内容>>
相关视频
  • 控制系统仿真与CAD

  • PLC功能指令应用详解

  • 非线性控制理论(浙大)

  • 对话ADI和世健 看工业市场发展的新机遇

  • 电力工程信号处理应用

  • 周公系列讲座——温度仪表

精选电路图
  • 永不缺相启动运行的电动机控制电路

  • CCFL的工作原理及电子驱动电路解析

  • MT3608构成3.7V转12V的升压电路图

  • 运算放大器IC741的基本工作原理及在电路中的实现方式

  • 基于M66T旋律发​​生器的电路图解析

  • 基于TDA1554的立体声放大器电路

    相关电子头条文章