11.2.2 模式0的数据发送及C51程序设计

对于模式0的数据发送,单片机的TXD引脚都用于发送同步移位脉冲,而8位串行数据是通过单片机的RXD引脚来输出。

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

在串口模式0下,C51程序可以按照如下的步骤来进行数据的发送。

(1)首先,需要对寄存器SCON进行初始化,即工作模式的设置。由于这里使用的是串行口的模式0,因此,只需将00H送入SCON即可。

(2)置串行接口控制寄存器SCON的TI=0,启动串行口发送。

(3)执行写发送缓冲器指令,示例如下。


SBUF=i;//输出数据i到SBUF,启动串行输出


单片机的CPU执行完这条语句后,在TXD引脚发送同步移位脉冲,8位数据便从RXD端由低位到高位逐个发送出去。当8位数据发送完毕的时候,单片机硬件自动置中断标志TI=1,请求中断,表示发送缓冲器已空。

发送数据时,串行口把SBUF中的8位数据以fosc/12的固定波特率从RXD引脚串行输出,提示低位在前。

(4)准备下一次数据发送。标志位TI不会自动清零,当要发送下一组数据时,必须在软件中置TI=0,然后才能发送下一组数据。串行口模式0的数据输出可以采用查询方式,也可以采用中断方式,分别介绍如下。

❑在查询方式中,通过while语句查询TI的值,如果TI=1则结束查询,可以发送下一组数据;如果TI=0,则继续查询。

❑在中断方式中,在TI置位后产生中断申请,在中断服务程序中发送下一组数据。此时,需要开启相应的中断请求。

2.采用查询方式的模式0数据发送C51程序设计模式0数据发送过程常用于扩展单片机的并行I/O

输出端口。单片机的串行口在模式0下,数据以串行方式逐位发出,如果外接一个串入并出的移位寄存器,例如CD4094芯片,便可以将串行数据转换为并行数据输出,即扩展了一个单片机的并行输出端口。扩展并行输出口的电路图,如图11.8所示。

11.2.2 模式0的数据发送及C51程序设计 - 图1

图 11.8 扩展并行输出口

如果采用C51语言进行程序设计,则串口模式0以及扩展并行接口的程序示例如下。


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

02:

03:sbit STB=P2^1;//声明STB

04:

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

06:{

07:int i;//声明变量

08:i=67;//初始化

09:SCON=0x00;//初始化串行口模式0

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

11:STB=0;//关闭CD4094的并行输出

12:SBUF=i;//输出数据到SBUF,启动串行输出

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

14:{

15:STB=1;//启动CD4094的并行输出

16:TI=0;//TI清零

17:}

18:I=68;//重新赋值

19:STB=0;//关闭CD4094的并行输出

20:SBUF=i;//输出数据到SBUF,启动串行输出

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

22:{

23:STB=1;//启动CD4094的并行输出

24:TI=0;//TI清零

25:}

26:}


提示以上程序中,第13、14行是一个空循环,用来等待串行数据发送完毕,当数据发送完毕后,TI将置1,从而退出循环,进行后面的并行输出。第21、22行的作用与此相同。

该程序可以在KeilµVision3集成开发环境中执行。在该程序中,首先位定义STB用于控制CD4094,由P2.1引脚实现。移位寄存器CD4094的STB为并行数据输出允许控制端,当STB=1时,打开输出控制门,实现数据的并行输出,这样可以避免串行输入时,并行输出端数据的不稳定。

这里采用了查询方式进行程序设计。在main主函数中,首先赋值SCON为0x00,从而初始化串行口模式0,并禁用串行中断,接着将数据发送到SBUF启动串行输出。程序中使用while语句查询TI,当TI=1时,表示发送完毕,启动CD4094的并行输出。最后TI清零,准备下一次数据发送。第二次数据传输同样需要查询TI标志位。

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

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


include<reg51.h>//头文件

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

{

TI=0;

}

void main(void)//主函数

{

int i;

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

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

EA=1;//开总中断

i=0x67;//初始化数据

SBUF=i;//将数据送到SBUF,启动串行输出

while(1)//主循环

{

}

}


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