11.3 串行口工作模式1的C51程序设计

串行口的工作模式1是波特率可变的串行异步通信方式,工作模式1下数据帧的格式,如图11.10所示。数据帧由10位组成,按顺序分别为起始位、8位数据位、停止位。数据在传输时,低位在前,高位在后。在程序中,可以设置控制寄存器SCON的SM0=0和SM1=1来将串口设置为工作模式1。

11.3 串行口工作模式1的C51程序设计 - 图1

图 11.10 模式1的帧格式

11.3.1 模式1的波特率

串口的工作模式1为10位异步发送接收方式。其串行移位时钟脉冲由定时器T1的溢出率来决定,因此,波特率由定时器T1的溢出率和波特率倍增位SMOD来共同决定。模式1的波特率计算公式如下。


模式1波特率=T1溢出率×2SMOD/32


设置模式1的波特率,需要对定时器T1进行工作方式设置,以便于得到需要的波特率发生器。一般使T1工作于模式2,此时为初值自动加载的定时方式。如果计数器的初始值为X,则每过256-X个机器周期的时候,定时器T1便将产生一次溢出,溢出的周期为(256-X)×12/fosc

此时,单片机的溢出率即是figure_0311_0152

因此,由前面的波特率计算公式可得如下结果。figure_0311_0153反向求解上面的式子可以得出定时器T1工作在模式2下的初值X。figure_0311_0154模式1下,采用定时器T1的工作模式2作为波特率发生器时,一些常用波特率的参数及初值设置,如表11.2所示。

11.3 串行口工作模式1的C51程序设计 - 图5

其中,很多都是用了11.0592MHz的晶体振荡频率,这是因为这个频率可以使定时器T1的初值设置为整数,便于产生精确的波特率。因此,在使用串行接口的单片机系统中,多采用该晶振。

表中各个数据可以根据前面介绍的公式计算得到,这里仅举一例进行说明。例如,对于8051单片机外接11.0592MHz的晶振,即采用内部振荡器工作模式。这里使用工作于模式2的定时器T1作为串行通信的波特率发生器,波特率为2400bit/s。

如果不使用波特率倍增位SMOD,则设置SMOD=0,则根据前面得到的公式,可知定时器初值如下所示。

11.3 串行口工作模式1的C51程序设计 - 图6

因此,可以设置(TH1)=(TL1)=F4H。

如果采用C51语言进行程序设计,串口模式1初始化及波特率初始化的程序示例如下。


TMOD=0x20;//设置定时/计数器1定时,工作于方式2

TH1=0xF4;//设置定时/计数器1的初始值

TL1=0xF4;

TR1=1;//启动定时/计数器1开始定时计数

PCON=0x00;//设置SMOD为0

SCON=0x50;//设置串行工作方式1,允许接收


以上是使用定时器的工作模式2,有时为了获得很低的串行通信波特率,可以采用定时器T1的模式0和模式1,即采用13位或16位定时方式。在这种情况下,T1溢出后,必须重新装入初值,从而增加了多余语句的执行,消耗了多余的CPU时间,波特率将会产生一定的误差。因此,一般不推荐采用定时器的模式0和模式1作为波特率发生器。