11.4.2 模式2的数据发送及C51程序设计

在串行口的工作模式2中,TXD引脚为数据发送端。模式2的发送共有9位有效的数据,在启动发送之前,需要将发送的第9位,即可编程位的数值送入寄存器SCON中的TB8位。这个编程标志位可以由用户自己定义,硬件不做任何规定。例如,用户可以将这一位定义为奇偶校验位或地址/数据标志位。

1.模式2的数据发送流程

在串行口的工作模式2中,C51可以按照如下的流程来进行数据的串行发送。

(1)首先,初始化串口为工作模式2。

(2)设置波特率。

(3)置串行接口控制寄存器SCON的TI=0,启动串行口发送,并装入TB8的值。

(4)执行写发送缓冲器SBUF语句,示例如下。


SBUF=0x46;//将数据0x46写入发送缓冲器


(5)硬件自动发送起始位,起始位为逻辑低电平。发送8位数据,低位首先发送,高位最后发送。发送第9位数据,即TB8中的数值。硬件自动发送停止位,停止位为逻辑高电平,同时置TI=1,发送完毕。

(6)在C51程序中可以采用查询或中断两种方式获知TI。如果TI置位,则需要在软件中清零TI,以便于下一次串行数据发送。

2.采用查询方式的模式2数据发送C51程序设计

如果采用C51语言进行程序设计,则串行模式2的程序示例如下。


01:#include<reg51.h>//头文件

02:

03:void main(void)//主函数

04:{

05:SCON=0x80;//初始化串行口模式2

06:PCON=0x80;//设置波特率倍增位SMOD=1

07:ES=0;//禁止串行中断

08:TB8=ParityCheck(0x46);//奇偶校验位

09:SBUF=0x46;

10:while(!TI)//等待TI=1

11:{

12:TI=0;//TI清零

13:}

14:}


提示以上程序中,第10~12行是一个空循环,用来等待串行数据发送完毕,当数据发送完毕后,TI将置1,从而退出循环。

该程序可以在KeilµVision3集成开发环境中执行。在该程序中,采用TB8作为奇偶校验位。在main主函数中,首先初始化串口为模式2,接着判断数据的奇偶位并送入TB8,然后将数据发送到SBUF。程序中使用while循环查询TI,当发送完毕的时候,清零TI,以便于下一次串行数据发送。

3.采用中断方式的模式2数据发送C51程序设计

对于模式2的串行数据发送,也可以采用中断来进行程序设计,其程序示例如下。


include<reg51.h>//头文件

void SISR(void)interrupt 4//串行中断服务例程

{

TI=0;//清零

}

void main(void)//主函数

{

int i;

SCON=0x80;//初始化串行口模式2

PCON=0x80;//设置波特率倍增位SMOD=1

ES=1;//开启串行中断

EA=1;//开总中断

TB8=ParityCheck(0x46);//奇偶校验位

SBUF=0x46;

while(1)//主循环

{

}

}


该程序可以在KeilµVision3集成开发环境中执行。在该程序中,定义了串行中断服务程序SISR。在main主函数中,首先初始化串行口为模式2,并设置波特率,接着开启串行中断并打开总中断。接着判断数据的奇偶位并送入TB8,然后将数据发送到SBUF,启动串行输出。在主循环中不进行任何操作,CPU等待数据发送完毕后,将置TI=1,进入中断服务例程SISR。在中断服务例程中清零TI,准备下一次数据发送。