11.3.3 模式1的数据接收及C51程序设计

串行口的工作模式1为10位异步发送接收方式,单片机RXD引脚为数据接收端。模式1接收数据中的定时信号可以有两种,接收移位脉冲和接收字符的检测脉冲。

串行口模式1接收数据时的接收移位脉冲,由定时器1的溢出信号和波特率倍增位SMOD来共同决定,即由定时器1的溢出率经过16分频或32分频得到。

❑接收字符的检测脉冲,其频率是接收移位脉冲的16倍。在接收一位数据的时候,有16个检测脉冲,以其中的第7、8和9个脉冲作为真正的接收信号的采样脉冲。对这3次采样结果采取三中取二的原则来确定所检测到的值。由于采样的信号总是在接收位的中间位置,这样便可以抑制干扰,避免信号两端的边沿失真,也可以防止由于通信双方时钟频率不完全相同而带来的接收错误。

1.模式1的数据接收流程

在串行口的工作模式1中,C51可以按照如下流程进行数据的串行接收。

(1)初始化串口,设置SCON寄存器以及PCON寄存器。这里需要将SCON的REN位置1,启动串行口串行数据接收,RXD引脚便进行串行口的采样。

(2)初始化定时器,设置波特率。

(3)在数据传递的时候RXD引脚的状态为1,当检测到从1到0的跳变的时候,确认数据起始位0。开始接收一帧的串行数据,在接收移位脉冲的控制下,将收到的数据一位一位地送入移位寄存器,直到9位数据完全接收完毕,其中最后一位为停止位。

(4)当RI=0,并且接收到的停止位为1,或者SM2=0的时候,8位数据送入接收缓冲器SBUF中,停止位送入RB8中,同时置RI=1;否则,8位数据不装入SBUF,放弃当前接收到的数据。

(5)此时可以采用查询或者中断两种方式来获知RI是否置位。当数据送入接收缓冲器之后,便可以执行读SBUF语句来读取数据,示例如下。


ch=SBUF;//读取串行数据,并保存在变量ch中


(6)最后,软件中清标志位RI,以便于接收下一次串行数据。

2.采用查询方式的模式1数据接收C51程序设计

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


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

02:

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

04:{

05:int ch;

06:SCON=0x50;//初始化串行口模式1,允许接收

07:TMOD=0x20;//初始化T1为定时功能,模式2

08:PCON=0x80;//设置SMOD=1

09:TL1=0xF4;//波特率4800bit/s,初值

10:TH1=0xF4;

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

12:TR1=1;//启动定时器

13:

14:while(!RI)//等待RI=1

15:{

16:ch=SBUF;//读取串行数据

17:RI=0;//RI清零

18:}

19:}


提示以上程序中,第14~16行是一个空循环,用来等待串行数据接收,当数据接收完毕后,RI将置1,从而退出循环,进行后面的数据接收。

该程序可以在KeilµVision3集成开发环境中执行。在该程序中,主函数首先初始化串口为模式1,允许接收,接着设置波特率,打开定时器。程序中使用while循环来查询RI,当RI=1时,表示串行数据接收完毕,随后将数据读入变量ch,并清零RI,以便于接收下一次串行数据。

3.采用中断方式的模式1数据接收C51程序设计

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


include<reg51.h>//头文件

int ch;

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

{

RI=0;//清零

ch=SBUF;//读取接收缓冲器

}

void main(void)//主函数

{

SCON=0x50;//初始化串行口模式1,允许接收

TMOD=0x20;//初始化T1为定时功能,模式2

PCON=0x80;//设置SMOD=1

TL1=0xF4;//波特率4800bit/s,初值

TH1=0xF4;

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

EA=1;//开总中断

TR1=1;//启动定时器

while(1)//主循环

{

}

}


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