11.2.3 模式0的数据接收及C51程序设计
对于模式0的数据接收,单片机的TXD引脚都用于发送同步移位脉冲,而8位串行数据是通过RXD引脚来输入。
1.模式0的数据接收流程
在模式0下,C51程序可以按照如下的流程来进行数据的接收。
(1)首先,需要对寄存器SCON进行初始化,即工作模式的设置。由于这里使用的是串行口的模式0,允许接收,因此需将10H送入SCON,即置REN=1。另外,在模式0工作时,寄存器SCON中的SM2必须置0,而RB8位和TB8位都不起作用,一般置0即可。
(2)此时,在TXD端发送同步移位脉冲,在同步脉冲为低电平的时候,8位数据从RXD引脚由低位到高位逐位接收。
(3)当8位数据接收完毕的时候,硬件自动置RI=1,请求中断,表示接收数据已装入接收缓冲器,可以由CPU读取,示例如下。
i=SBUF;//读出数据到变量i中
(4)准备下一次数据接收。由于RI不会自动清零,当需要接收下一组数据的时候,必须在软件中置RI=0,然后才可以接收下一组数据。此时,同样可以采用查询和中断两种方式,分别介绍如下。
❑在查询方式中,使用while语句查询RI的值,如果RI=1则结束查询,可以接收下一组数据;如果RI=0,则继续查询。
❑在中断方式中,在RI置位后产生中断申请,在中断服务程序中接收下一组数据。此时,需要开启相应的中断请求。
2.采用查询方式模式0数据接收的C51程序设计模式0的数据接收过程常用于扩展单片机的并行I/O输入端口。单片机的串行口在模式0下,数据以串行方式逐位接收,此时,如果在单片机串行口外接一个并入/串出的移位寄存器,如CD4014芯片,则可以实现并行数据通过串行口输入,即扩展了并行输入口,利用单片机串口模式0来扩展并行输入口的电路图,如图11.9所示。
图 11.9 扩展并行输入口
如果采用C51语言进行程序设计,则串口模式0以及扩展并行接口的程序示例如下。
01:#include<reg51.h>//头文件
02:
03:sbit P_S=P2^2;//声明P_S
04:
05:void main(void)//主函数
06:{
07:int i;
08:SCON=0x10;//串行口模式0的初始化,RI清零,并启动接收
09:ES=0;//禁止串行中断
10:P_S=1;//并行数据送入CD4014
11:P_S=0;//CD4014串行数据输出
12:while(!RI)//查询RI,等待接收完毕
13:{
14:RI=0;//RI清零
15:i=SBUF;//读出数据
16:}
17:P_S=1;//并行数据送入CD4014,第二次传输
18:P_S=0;//CD4014串行数据输出
19:while(!RI)//查询RI,等待接收完毕
20:{
21:RI=0;//RI清零
22:i=SBUF;//读出数据
23:}
24:}
提示以上程序中,第12、13行是一个空循环,用来等待串行数据接收,当数据接收完毕后,RI将置1,从而退出循环,第15行将缓冲中的数据保存到接收变量中,第14行设RI为0,继续后面的数据接收。第19、20行的作用与此相同。
该程序可以在KeilµVision3集成开发环境中执行。该程序中,首先定义CD4014控制位P_S,由P2.2引脚来实现。串出移位寄存器CD4014的P/S为预置/移位控制端,当P/S=1的时候,8位数据并行置入移位寄存器;当P/S=0的时候,移位寄存器中的数据串行移位输出。
这里采用查询方式进行程序设计。在main主函数中,首先初始化串行口模式0,RI清零,并启动接收。接着使用P_S将CD4014的并行数据串行输入到单片机串口。程序中使用while循环查询RI,当RI=1时,表示接收完毕,清零RI,准备接收下一个数据,并将读取的数据送到变量i中。在第二次数据传输时,同样需要查询RI。
3.采用中断方式模式0数据接收的C51程序设计
对于模式0的串行数据接收,也可以采用中断来进行程序设计,其程序示例如下。
include<reg51.h>//头文件
int i;
void SISR(void)interrupt 4//串行中断服务例程
{
RI=0;//清零
i=SBUF;//读取接收缓冲器
}
void
main(void)//主函数
{
SCON=0x10;//初始化串行口模式0
ES=1;//开启串行中断
EA=1;//开总中断
while(1)//主循环
{
}
}
该程序可以在KeilµVision3集成开发环境中执行。在该程序中,定义了串行中断服务程序SISR。在main主函数中,首先初始化串行口为模式0允许接收,接着开启串行中断并打开总中断。在主循环中不进行任何操作,CPU等待数据接收完毕后,将置RI=1,进入中断服务例程。在中断服务例程中将RI清零,准备下一次数据发送,并将接收缓冲器SBUF中的数据读出。