11.5.2 模式3的数据发送及C51程序设计
在串行口的工作模式3中,单片机的TXD引脚为数据发送端。模式3的发送共有9位有效的数据,在启动发送之前,需要将发送的第9位,即可编程位的数值送入寄存器SCON中的TB8位。这个编程标志位可以由用户自己定义,硬件不做任何规定。例如,用户可以将这一位定义为奇偶校验位或地址/数据标志位。
1.模式3的数据发送流程
在串行口的工作模式3中,C51可以按照如下的流程来进行数据的串行发送。
(1)首先,初始化串口为工作模式3。
(2)初始化定时器,设置波特率。
(3)置串行接口控制寄存器SCON的TI=0,启动串行口发送,并装入TB8的值。
(4)执行写发送缓冲器SBUF语句,示例如下。
SBUF=0x36;//将数据0x36写入发送缓冲器
(5)硬件自动发送起始位,起始位为逻辑低电平。发送8位数据,低位首先发送,高位最后发送。发送第9位数据,即TB8中的数值。硬件自动发送停止位,停止位为逻辑高电平,同时置TI=1,发送完毕。
(6)在C51程序中可以采用查询或中断两种方式获知TI。如果TI置位,则需要在软件中清零TI,以便于下一次串行数据发送。
2.采用查询方式的模式3数据发送C51程序设计
如果采用C51语言进行程序设计,则串行模式3的程序示例如下。
01:#include<reg51.h>//头文件
02:void main(void)//主函数
03:{
04:SCON=0xC0;//初始化串行口模式3
05:PCON=0x80;//设置SMOD=1
06:TL1=0xF4;//波特率4800bit/s,初值
07:TH1=0xF4;
08:ES=0;//禁止串行中断
09:TR1=1;//启动定时器
10:
11:TB8=ParityCheck(0x36);//奇偶校验位
12:SBUF=0x36;//将数据0x36写入发送缓冲器
13:while(!TI)//等待TI=1
14:{
15:TI=0;//TI清零
16:}
17:}
提示以上程序中,第14????????O2@6K?eO.g??@0M?I4@@0Y????????16行是一个空循环,用来等待串行数据发送完毕,当数据发送完毕后,TI将置1,从而退出循环。
该程序可以在KeilµVision3集成开发环境中执行。在该程序中,采用TB8作为奇偶校验位。在main主函数中,首先初始化串口为模式3,并设置波特率,启动定时器。接着判断数据的奇偶位并送入TB8,然后将数据0x36发送到SBUF,启动串行输出。程序中使用while循环查询TI,当发送完毕的时候,清零TI,以便于下一次串行数据发送。
3.采用中断方式的模式3数据发送C51程序设计
对于模式3的串行数据发送,也可以采用中断来进行程序设计,其程序示例如下。
include<reg51.h>//头文件
void SISR(void)interrupt 4//串行中断服务例程
{
TI=0;//清零
}
void main(void)//主函数
{
int i;
SCON=0xC0;//初始化串行口模式3
PCON=0x80;//设置SMOD=1
TL1=0xF4;//波特率4800bit/s,初值
TH1=0xF4;
ES=1;//开启串行中断
EA=1;//开总中断
TR1=1;//启动定时器
TB8=ParityCheck(0x36);//奇偶校验位
SBUF=0x36;//将数据0x36写入发送缓冲器
while(1)//主循环
{
}}
该程序可以在KeilµVision3集成开发环境中执行。在该程序中,定义了串行中断服务程序SISR。在main主函数中,首先初始化串行口为模式3,并设置波特率,接着开启串行中断并打开总中断。接着判断数据的奇偶位并送入TB8,然后将数据0x36发送到SBUF,启动串行数据输出。在while主循环中不进行任何操作,CPU等待数据发送完毕后,将置TI=1,进入中断服务例程SISR。在中断服务例程中清零TI,准备下一次数据发送。