波特率是表征串行通信数据传输快慢的物理量。常用波特率有50bit/s、110bit/s、300bit/s、600bit/s、1200bit/s、2400bit/s、4800bit/s、9600bit/s、19200bit/s、38400bit/s等。
每一位的传输时间定义为波特率的倒数。例如,波特率为9600bit/s的通信系统,其每位的传输时间应为Td=1/9600ms=0.104ms。通常,异步通信的波特率在50~9600bit/s之间。
例7-1:设单片机以1200bit/s的波特率发送120字节的数据,每帧10位,问至少需要多长时间?
解:所谓“至少”,是指串行通信不被打断,且数据帧与帧之间无等待间隔的情况。需传送的二进制位数为10bit×120=1200bit,所需时间T=1200bit/1200(bit/s)=1s。
在串行通信中,为了保证接收方能正确识别数据,收发双方必须事先约定串行通信的波特率。通过软件可对单片机串行接口编程,由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。MCS-51单片机在不同的串口工作方式下,其串行通信的波特率是不同的,串行接口的四种工作方式对应三种波特率。其中,方式0和方式2的波特率是固定的;方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。
1)方式0:波特率与系统时钟频率fCLK有关。一旦系统时钟频率选定且在ISP编程器中设置好,方式0的波特率固定不变。
当用户在烧录应用程序时ISP编程器中设置单片机为6T/双倍速时,其波特率为fOSC的1/6。若设置单片机为12T/单倍速时,其波特率为fOSC的1/12。
例如,方式0的波特率计算公式为
2)方式2:波特率与系统时钟频率、SMOD位的值有关。其计算公式为
3)方式1和方式3:串行接口工作在方式1或方式3时,波特率设置方法相同,采用定时器T1或定位器T2作为波特率发生器。其计算公式为
其中,T1溢出率是指定时器T1每秒溢出的次数。由于T1每溢出一次所需的时间即为T1的定时时间,所以T1溢出率等于T1定时时间的倒数。T1溢出率计算公式为
的定时时间=(2n-计数初值
式中,n是定时器T1的位数,取值与T1的工作方式有关。若定时器T1为方式0,则n=13;若定时器T1为方式1,则n=16;若定时器T1为方式2或方式3,则n=8。分频单元的内部结构如图7-8所示。
图7-8 分频单元的内部结构
设计数初值为X,那么每过256-X个机器周期,T1产生一次溢出。此时,T1溢出率取决于T1的计数初值(TH1),T1溢出脉冲可有两种分频路径,即16分频或32分频,SMOD是决定分频路径的逻辑开关。如果SMOD=0,则为单倍波特率;如果SMOD=1,则为双倍波特率。
计算公式为
例如,使用单倍波特率,即SMOD=0,晶振频率为11.0592MHz,向T1寄存器TH1(=TL1)中载入F3H,即TH1=243,得波特率为
T1溢出率取决于计数速率和定时器的预置值。在单片机的应用中,常用的晶振频率为6MHz或12MHz(11.0592MHz)。所以,选用的波特率也相对固定。常用的串行接口波特率以及各参数的关系见表7-4。
表7-4常用波特率参数
计数速率与(TMOD)的状态有关:=0,计数速率=fOSC/12;=1,计数速率取决于外部输入时钟频率。
当设置定时器T2作为波特率发生器,定时器T2的溢出脉冲经16分频后作为串行接口发送脉冲、接收脉冲。其波特率计算公式为
在使用时钟振荡频率为12MHz时,将初值X带入公式计算出的波特率有一定误差。为减小波特率误差,可使用的时钟频率为11.0592MHz或22.1184MHz,此时定时初值为整数,但该外接晶振用于系统精确的定时服务不是十分的理想。例如,单片机外接11.0592MHz晶振频率时,机器周期=12/11.0592MHz≈1.085μs,是一个无限循环的小数。当单片机外接22.1184MHz晶振频率时,机器周期=12/22.1184MHz≈0.5425μs,也是一个无限循环的小数,因此不能够为定时应用提供精确的定时。
在实际使用时,经常根据已知波特率和时钟频率来计算T1、T2的初值。定时器T1和T2产生的常用波特率见表7-5和表7-6。
表7-5 用定时器T1产生的常用波特率
表7-6 用定时器T2产生的常用波特率
定时器T2作波特率发生器是16位自动重装载初值的,位数比定时器1作为波特率发生器要多(定时器T1作为串口波特率发生器工作在方式2是8位自动重装初值),因此可以支持更高的传输速度。(www.xing528.com)
设置波特率的常用初始化程序如下:
MOV TMOD,#20H;设置定时器T1工作在方式2
MOV TH1,#XXH;装载定时初值
MOV TL1,#XXH
SETB TR1;开启定时器T1
MOV PCON,#80H;波特率倍增
MOV SCON,#50H;设置串行接口工作在方式1
例7-2:设单片机系统时钟频率fOSC为11.0592MHz,T2工作在波特率发生器方式,波特率为9600bit/s。
解:(1)设计分析
根据题意知,T2工作在波特率发生器方式,T2产生发送时钟和接收时钟,则TCLK=1、RCLK=1。
(2)求定时初值
选择T2为定时模式,启动T2工作,即TR2=1,选择向上计数,即DCEN=0,这时波特率计算公式为
取SMOD=0,由于MCU选12T,则n=32,已知波特率为9600bit/s,fOSC为11.0592MHz。令N=(RCAP2H,RCAP2L),则
即TH2=FFH,TL2=DCH,RCAP2H=FF,RCAP2L=DCH。
(3)确定特殊功能寄存器T2CON、T2MOD值
T2CON=34H(即TCLK=1、RCLK=1、TR2=1),T2MOD=00H(即DCEN=0)。
程序如下:
InitUart:MOV SCON,#50H;串行接口工作在方式1
MOV T2MOD,#00;设置T2加法计数,时钟输出不使能
MOV T2CON,#34H;T2为波特率发生器并启动T2计数
MOV TH2,#0FFH;设置定时寄存器计数初值
MOV TL2,#0DCH
MOV RCAP2L,#0DCH;设置自动重装寄存器计数初值
MOV RCAP2H,#0FFH
RET
串行接口工作之前,应对其进行初始化,主要是设置产生波特率的定时器T1、串行接口控制和中断控制。具体步骤如下:①确定T1的工作方式(编程TMOD寄存器);②计算T1的初值,装载TH1、TL1;③启动T1(编程TCON中的TR1位);④确定串行接口控制(编程SCON寄存器);⑤串行接口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。
在串行通信中,收发双方必须采用相同的通信速率,即波特率。单片机串行通信以定时器T1和定时器T2作为波特率信号发生器,其溢出脉冲经过分频单元后送到收、发控制器中。
TMOD=0X20;定时器1工作于方式2
TH1=0XFD,TL1=0XFD;波特率9600bit/s
TR1=1;启动定时器l
SCON=0X50;设定串行接口工作于方式1
PCON=0X80;波特率倍增
IE=0X90;允许中断
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。