,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,6.3,串行口的应用举例,6.3.1,初始化,设定,SCON,的,SM0、SM1,两位二进制编码。,对于方式2或3,应根据需要在,TB8,中写入待发送的第9位数据。,若选定的操作方式不是方式0,还需设定发送的波特率:,设定,SMOD,的状态,以控制波特率是否加倍。,若选定操作方式1或3,则应对定时器,T1,进行初始化,以设定其溢出率。,6.3 串行口的应用举例6.3.1 初始化,6.3.2,编程步骤,(1),设定,波特率,串行接口的波特率设定方式有两种:固守波特率和可变波特率。当采用可变波特率时,应先确定,T1,的计数初值,并对,T1,进行初始化。当采用固定波特率,(,工作方式,0,和工作方式,2),时,该步可以省略。,(2),填写控制字,设定串行口控制寄存器,SCON,和波特率倍增控制寄存器,PCON。,6.3.2 编程步骤(1)设定波特率,6.3.2,编程步骤,(3),串行通信可采用两种方式,:,查询方式,和,中断方式,。,查询方式发送数据,(,先发后查,),:发送一个数据、查询,TI,、发送下一个数据。,查询方式接收数据,(,先查后收,),:查询,RI,、读入一个数据、查询,RI,、读入下一个数据。,中断方式发送数据,:发送一个数据、等待中断,在中断中再发送下一个数据。,中断方式接收数据,:等待中断、在中断中接收一个数据。,两种方式中,发送与接收数据后都要将,TI,或,RI,清零,。,6.3.2 编程步骤(3)串行通信可采用两种方式:查询方式,【,例,6-9】,波特率计算及初始化编程,设某,51,单片机系统,其串行口工作于方式,3,,要求传送波特率为,1200,。作为波特率发生器的定时器,T1,工作在模式,2,时,请求出计数初值为多少?设单片机的振荡频率为,6MHz,。,X=256-(2,SMOD,fosc)/(384,波特率,),TH1=256,f,osc,/(,波特率,1232/2,SMOD,),=256-2,SMOD,13,当,SMOD=0,时,:,TH1=25613=243=0F3H,。,当,SMOD=1,时,:,TH1=256213=230=0E6H,。,【例6-9】波特率计算及初始化编程设某51单片机系统,其串行,【,例,6-10】,编,程,:,高,4,位灯和低,4,位灯以,1s,亮,1s,灭的频率进行闪烁。,【例6-10】编程:高4位灯和低4位灯以1s亮1s灭的频率进,分析:,(1)4,位亮、,4,位灭的交替数据为,11110000B,和,00001111B,;,(2),串行口采用方式,0,,,SCON=00H,;,(3)1s,由定时器,T0,产生:硬件定时,50ms,,软件计数,20,次;,T0,定时器方式、模式,1,、初值为:,50000=65536-X X=15536=3CB0H,(4)1s,采用中断的方式,,20,次中断到,将输出的数据取反操作。,分析:(1)4位亮、4位灭的交替数据为11110000B和0,#include,unsigned char data i,a;,void main(),SCON=0;,TMOD=0X01;,TH0=-50000/256;TL0=-50000%256;,i=20;,EA=1;ET0=1;TR0=1;,a=0 x0f;,SBUF=a;,while(1);,#include,void t0int()interrupt 1,TH0=-50000/256;TL0=-50000%256;,i=i-1;,while(i=0),i=20;,a=a;,SBUF=a;,修改:,将上述程序改为流水灯形式。,void t0int()interrupt 1,【,例,6-11】,串行口自收自发,将,51,单片机的,TXD,接,RXD,,实现单片机串行口数据自发自收,并将接收的数据通过,P1,口输出到发光二极管显示。系统时钟频率为,11.0592MHz,,自发自收的波特率为,2400bps,。编写程序,要求:单片机串行口工作在方式,1,,从,TXD,发送数据,0 x55,,从,RXD,将该数据读回,并送,P1,口通过,8,个发光二极管显示。,【例6-11】串行口自收自发 将51单片机的TX,单片机C语言第6章串行口的C51编程课件,#include,#define uchar unsigned char,#define uint unsigned int,void main(),uchar i=0 x0F;,uint j=0;,TMOD=0X20,;,/,设定定时器,1,,模式,2,TL1=TH1=0XF4;,PCON=0X00;,SCON=0X50;,TR1=1;,while(1),TI=0;,SBUF=i;,/,发送数据,#include,while(TI=0);,TI=0;,RI=0;,while(RI=0);,i=SBUF;/,读取接收数据,RI=0;,P1=i;,i=i;,for(j=0;j7;,i3=i11;,i1=i2|i3;,while(TI),TI=0;,void t0int()interrupt 1,实验,2,串行口控制的,8,段,LED,显示器,实验目的:,掌握,51,单片机串行口扩展为并行口的基本应用,掌握,51,单片机串行口控制,8,位,LED,显示器的应用。,电路与内容:,51,单片机外部通过串行口扩展两片,74LS164,,,每片,74LS164,连接一个共阳极,8,段,LED,数码管,编程实现显示,12。,实验2 串行口控制的8段LED显示器实验目的:掌握51单片,#include,unsigned char dis_buf2;,unsigned char code table10=0 x0c0,0 x0f9,0 x0a4,0 x0b0,0 x99,0 x92,0 x82,0 x0f8,0 x80,0 x90;,void display(),TI=0;,SBUF=tabledis_buf0;,while(TI=0);,TI=0;,SBUF=tabledis_buf1;,while(TI=0);,TI=0;,void main(),SCON=0 x00;,dis_buf0=1;,dis_buf1=2;,display();,while(1);,#include,