11.3.2 模式1的数据发送及C51程序设计

串行口的工作模式1为10位异步发送接收方式,单片机TXD引脚为数据发送端。通信的双方不需要时钟同步,发送方和接收方都有自己的移位脉冲,通过设置共同的波特率来实现同步。

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

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

(1)初始化串口,设置SCON寄存器以及PCON寄存器。

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

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

(4)执行写发送缓冲器SBUF语句,示例如下。


SBUF=0x76;//将0x76送入发送缓冲器


(5)硬件自动发送起始位,起始位为逻辑低电平。在发送移位脉冲的作用下,数据帧依次从TXD引脚发出。在发送8位数据时,低位首先发送,高位最后发送。最后硬件自动发送停止位,停止位为逻辑高电平。

(6)在8位串行数据发送完毕后,也就是在插入停止位的时候,使TI置1,用以通知CPU可以发送下一帧的数据。此时可以采用查询或者中断两种方式来获知TI是否置位。当TI置位后,C51程序中清零TI,以便于发送下一个数据。

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

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


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

02:

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

04:{

05:SCON=0x40;//初始化串行口模式1

06:PCON=0x80;//设置波特率倍增位SMOD=1

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

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

09:TH1=0xF4;

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

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

12:

13:SBUF=0x70;//将0x70送入发送缓冲器

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

15:{

16:

TI=0;//TI清零

17:}

18:

19:SBUF=0x71;//第二次数据发送

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

21:{

22:

TI=0;//TI清零

23:}

24:}


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

该程序可以在KeilµVision3集成开发环境中执行。在该程序中,主函数首先初始化串口为模式1,然后使用定时器T1设置波特率,并且禁止串行中断和启动定时器。接着分别为SBUF赋值,数据将通过串口输出。

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

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


include<reg51.h>//头文件

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

{

TI=0;//清零

}

void main(void)//主函数

{

int i;

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

PCON=0x80;//设置波特率倍增位SMOD=1

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

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

TH1=0xF4;

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

EA=1;//开总中断

TR1=1;//启动定时器

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

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

while(1)//主循环

{

}

}


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