11.5 串行口工作模式3的C51程序设计
串行口的工作模式3为11位异步发送接收方式,在模式3中数据帧的格式如图11.12所示。一帧数据由11位构成,按照顺序分别为起始位1位、8位串行数据(低位在前)、可编程位1位、停止位1位。在程序中可以通过设置控制寄存器SCON的SM0=1和SM1=1来实现。
图 11.12 模式3的帧格式
11.5.1 模式3的波特率
模式3和模式2的工作方式是一样的,不同的是,模式2仅有两个固定的波特率可选,而模式3的波特率由定时器1的溢出率和波特率倍增位SMOD决定。
串口的工作模式3为11位异步发送接收方式。其串行移位时钟脉冲由定时器T1的溢出率来决定,因此,波特率由定时器T1的溢出率和SMOD来共同决定。模式1和模式3的波特率计算公式如下。
模式3波特率=T1溢出率×2SMOD/32
模式3的波特率需要对定时器T1进行工作方式设置,以便于得到需要的波特率发生器。最常用的是,使T1工作于模式2,这是初值自动加载的定时方式。如果计数器的初始值为X,则每过256-X个机器周期的时候,定时器T1便将产生一次溢出,溢出的周期为(256-X)×12/fosc。
由前面的波特率计算公式可得到如下结果。
反向求解上面的式子可以得出,定时器T1工作在模式2下的初值X如下所示。
模式3下,如果采用定时器T1的工作模式2作为波特率发生器,一些常用波特率的参数及初值设置,如表11.3所示。
和模式1的情况类似,其中很多都是用了11.0592MHz的晶体振荡频率,这是因为这个频率可以使定时器T1的初值设置为整数,便于产生精确的波特率。因此,在使用串行接口的单片机系统中,多采用该晶振。
表中各个数据可以根据前面介绍的公式计算得到,这里仅举一例进行说明。例如,对于8051单片机工作于串行模式3,外接11.0592MHz的晶振,即采用内部振荡器工作模式。这里使用工作于模式2的定时器T1,作为串行通信的波特率发生器,波特率为2400bit/s。
如果不使用波特率倍增位SMOD,则设置SMOD=0,则根据前面的计算公式,可知定时器T1初值如下所示。
因此,程序中可以设置(TH1)=(TL1)=F4H。
如果采用C51语言进行程序设计,串口模式3初始化及波特率初始化的程序示例如下。
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位定时方式。在这种情况下,串行标志位溢出后,必须重新装入初值,从而消耗了多余的CPU时间,波特率将会产生一定的误差。因此,一般不推荐采用定时器的模式0和模式1作为串行模式3的波特率发生器。