11.4.3 模式2的数据接收及C51程序设计
串口的工作模式2是11位异步发送接收方式,单片机RXD引脚为数据接收端。模式2的串行数据接收过程和模式1基本类似,只不过模式1的第9位为停止位,而这里则是发送的可编程位。
1.模式2的数据接收流程
在串行口的工作模式2中,C51可以按照如下的流程来进行数据的串行接收。
(1)首先,初始化串口为模式2。其中需要设置串行接口控制寄存器SCON的REN=1,启动串行口串行数据接收,引脚RXD便进行串行口的采样。
(2)设置波特率。
(3)在数据传递的时候RXD引脚的状态为1,当检测到从1到0的跳变的时候,确认数据起始位0。开始接收一帧的串行数据,在接收移位脉冲的控制下,将收到的数据逐位地送入移位寄存器,直至9位数据完全接收完毕,其中最后一位为发送的TB8。
(4)当RI=0,且SM2=0或接收到的第9位数据为1时,8位串行数据送入接收缓冲器SBUF中,而第9位数据送入RB8中,同时置RI=1;否则,8位数据不装入SBUF,放弃当前接收到的数据。接收数据真正有效的条件有两个,如下所示。
❑第一个条件是RI=0,表示接收缓冲器已空,即CPU已把SBUF中上次收到的数据读走,可以进行再次写入。
❑第二个条件是SM=0或收到的第9位数据为1,根据SM2的状态和接收到的第9位数据状态来决定接收数据是否有效。
(5)此时可以采用查询或者中断两种方式来获知RI是否置位。当数据送入接收缓冲器之后,便可以执行读SBUF语句来读取数据,示例如下。
ch=SBUF;//读取串行数据,并保存在变量ch中
(6)最后,软件中清零RI,以便于接收下一次串行数据。
一般来说,在单机通信中第9位作为奇偶校验位,应令SM2=0,以保证可靠的接收;在多机通信时,第9位数据一般作为地址/数据区别标志位,应令SM2=1,则当接收到的第9位为1时,接收到的数据为地址帧。
2.采用查询方式的模式2数据接收C51程序设计
如果采用C51语言进行程序设计,且第9位作为奇偶校验位,则串行模式2的程序示例如下。
01:#include<reg51.h>//头文件
02:
03:void main(void)//主函数
04:{
05:int ch;
06:SCON=0x90;//初始化串行口模式2,允许接收
07:PCON=0x80;//设置SMOD=1
08:ES=0;//禁止串行中断
09:
10:while(RI)//等待RI=1
11:{
12:
ch=SBUF;
13:
RI=0;//RI清零
14:}
15:if(RB8==ParityCheck(ch))//判断奇偶校验位
16:{
17://用户处理语句,省略
18:}
19:else//错误处理
20:{
21://错误处理语句,省略
22:}
23:}
提示以上程序中,第10~12行是一个空循环,用来等待串行数据接收,当数据接收完毕后,RI将置1,从而退出循环。
该程序可以在KeilµVision3集成开发环境中执行。在本程序中,首先初始化串口为工作模式2,允许接收。然后使用while语句查询RI标志位,当RI=1时接收串行数据并保存至变量ch,接收完毕后清零RI,以便于接收下一次串行数据。程序中使用if判断语句判断接收到的奇偶位是否一致,并做相应的处理。
3.采用中断方式的模式2数据接收C51程序设计
对于模式2的串行数据接收,也可以采用中断来进行程序设计,其程序示例如下。
include<reg51.h>//头文件
int ch;
void SISR(void)interrupt 4//串行中断服务例程
{
RI=0;//清零
ch=SBUF;//读取接收缓冲器
if(RB8==ParityCheck(ch))//判断奇偶校验位
{
//用户处理语句,省略
}
else//错误处理
{
//错误处理语句,省略
}
}
void
main(void)//主函数
{
SCON=0x90;//初始化串行口模式2,允许接收
PCON=0x80;//设置SMOD=1
ES=1;//开启串行中断
EA=1;//开总中断
while(1)//主循环
{
}
}
该程序可以在KeilµVision3集成开发环境中执行。在该程序中,定义了串行中断服务程序SISR。在main主函数中,首先初始化串行口为模式2允许接收,并设置波特率,接着开启串行中断并打开总中断。在主循环中不进行任何操作,CPU等待数据接收完毕后,将置RI=1,进入中断服务例程。在中断服务例程中将RI清零,准备下一次数据发送,并将接收缓冲器SBUF中的数据读出。程序中同样使用if判断语句判断接收到的奇偶位是否一致,并做相应的处理。