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,准备下一次数据发送。