传输率设计在串行通信中,收发双方或接收的数据速率要有一定的约定,通过软件对8051串行口编程可约定4种工作方式
其中,方式0和方式2的波特率是固定的,而方式1和方式3的波持率是可变的,由定时器T1的溢出率来决定
串行口的4种工作方式对应着3种波特率

由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同
波特率的计算方法(1)方式0波特率串行口方式0的波特率由振荡器的频率所确定:方式0波特率=振荡器频率/12(2)方式2波特率串行口方式2的波特率由振荡器的频率和SMOD(PCON.7)所确定:方式2波特率=×振荡器频率_/64SMOD为0时,波特率等于振荡器频率的1/64;SMOD为1时,波特率等于振荡器频率的1/32
(3)方式1和方式3的波特率串行口方式1和方式3的波特率由定时器T1或12(8052等单片机)的溢出率和SMOD所确定

Tl和r12是可编程的,可以选的波特率范围比较大,因此串行口方式l和方式3是最常用的工作方式
波特率的产生(1)用定时器T1产生波特率当定时器T1作为串行口的波特率发生器时,串行口方式1和方式3的波特率由下式确定:方式1和方式3波特率=×(T1溢出率)/32其中,溢出率取决于计数速率和定时器的预置值
计数速率与TMOD寄存器中C/T的状态有关

当C/T=o时,计数速率=振荡器频率/12;当C/T=1时,计数速率取决于外部输入时钟频率
当定时器T1作波特率发生器使用时,通常选用可自动装入初值模式(工作方式2),在工作方式2中,TL1作计数用,而自动装入的初值放在TH1中,设计数初值为X,则每过“256一X”个机器周期,定时器T1就会产生一次溢出
为了避免因溢出而引起中断,此时应禁止T1中断

这时有:溢出周期=12/振荡器频率x(256一X)溢出率为溢出周期的倒数,所以有:波特率=×振荡器频率/[32×12×(256一X)]此时,定时器Tl在工作方式2时的初值为:(2)用定时器T2产生波特率8052等单片机内的定时器12也可以作为串行口的波特率发生器,置位T2CON中的TCLK和RCLK位,T2就工作于串行口的波特率发生器方式
T2的波特率发生器方式和计数初值常数自动再装入方式相似,若C/T2=0,以振荡器的二分频信号作为T2的计数脉冲,C/T2=0时,计数脉冲是外部引脚T2(P1.0)上的输入信号
T2作为波特率发生器时,当T2计数溢出时,将RCAP2H和RCAP2L中常数(由软件设置)自动装入TH2、TL2,使T2从这个初值开始计数,但是并设置“1”TF2,RCAP2H和RCAP2L中的常数由软件设定后,T2的溢出率是严格不变的,因而使串行口方式1和3的波特率非常稳定,其值为方式1和方式3波特率=振荡器频率/32×[65536一(RCAP2H)(RCAP2L)]T2工作于波特率发生器方式时,计数溢出时不会置“l”TF2,不向CPU请求中断,因此不必禁止T2的中断

如果EXEN2为1,当T2EX(P1.1)上输入电平发生“1”至“0”的负跳变时,也不会引起RCAP2H和RCAP2L中的常数装入TH2、TL2,仅仅置位EXF2,向cpu请求中断,因此T2EX可以作为一个外部中断源使用
在T2计数过程中(TR2=1)不应该对TH2、TL2进行读/写
如果读,则读出结果不会精确(因为每个状态加1);如果写,则会影响T2的溢出率,使波特率不稳定

在T2的计数过程中,可以对RCAP2H和RCAP2L进行读,但不能写,如果写也将使波特率不稳定
因此,在初始化中,应先对TH2、TL2、RCAP2H、RCAP2L初始化编程以后才置“1”TR2,启动T2计数
以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。