《单片机8051串行接口的C编程.ppt》由会员分享,可在线阅读,更多相关《单片机8051串行接口的C编程.ppt(27页珍藏版)》请在三一办公上搜索。
1、第6章 8051串行口的C编程,本章主要介绍串行通信概念及51系列单片机的串行口问题,将具体介绍以下内容:,51单片机串行口-串行口结构、串行口的控制寄存器、串行口的工作方式、串行口的初始化、应用举例。,计算机串行通信基础-基本概念。,通信方式,6.1 计算机串行通信基础,基本概念,并行通信方式空间上区分各位数据 及联络控制信号。占 用传输线多,速度快。,串行通信方式时间上区分各位数据 及联络控制信号。占 用传输线少,速度慢。,6.2 51单片机串行口,一、串行口结构,8051系列单片机片上有UART(通用异步收发)用于串行通信,发送时数据由TXD端发出,接收时数据由RXD端输入。,TTL电平
2、:短距离机间通信RS232电平:与计算机通信。(驱动芯片MAX232),二、串行口的控制寄存器,与串行口有关的控制寄存器有:,1串行口控制寄存器SCON,工作方式控制位,中断标志,接收允许位,(硬件置位,软件清0),0 禁止1 允许(软件设置),工作方式控制位SM0、SM1,2电源控制寄存器PCON,SMOD:串行口波特率加倍位。,三、串行口的工作方式,串行口共有四种工作方式,方式110位异步通信方式,10位=1位起始位(0)+8位数据位+1位停止位(1),其中起始位和停止位在发送时是自动插入的。,发送:SBUF=?;,SBUF=“abc”;,发送条件TI=0;(软件清0)发送完毕TI=1;(
3、硬件置位),接收:?=SBUF;,例子:serial_data=SBUF;,接收条件REN=1;(软件置位)收到数据RI=1;(硬件置位)读数完毕RI=0;(软件清0),波特率=2SMOD*(定时器1的溢出率)/32,例子:波特率=9600,fosc=11.059M,则设置 PCON=0 x00;/SMOD=0;TMOD=0 x20;TH1=0 xfd;TL1=0 xfd;TR1=1;/启动定时器1 ES=1;/开串行口中断 EA=1;/开CPU中断,四、串行口的初始化,1.串行口波特率,使用单片机串口时,选用的晶振比较固定6MHz,12MHz,11.0592MHz。常用于和计算机的通信;选用
4、的波特率也相对固定。串行口常用的波特率及相应的设置见表8-3。,2.初始化步骤,设置产生波特率的定时器1、串行口控制和中断控制。,具体步骤:,(1)确定定时器1的工作方式,编程TMOD寄存器;,(2)计算定时器1的初值,装载TH1和TL1;,(4)确定串行口的控制,编程SCON和PCON;,(5)开CPU和源中断,编程IE中的ES和EA位。,(3)启动定时器1,编程TCON中的TR1位;,五、串行口应用举例,例1:发送字符串程序,#include#define uchar unsingned char#define uint unsigned intuchar idata trdata10=M
5、,C,S,-,5,1,0 x0d,0 x0a,0 x00;,main()uchar i;uint j;/*在11.0592MHz下,设置9600波特率,方式1*/TMOD=0 x20;/设置定时器1的方式 TH1=0 xfd;/设置定时器1的初值 TL1=0 xfd;SCON=0 x50;/设置串行口方式1,并允许接收 PCON=0 x00;TR1=1;/启动定时器1,while(1)i=0;while(trdatai!=0 x00)/发送字符串 SBUF=trdatai;while(TI=0);TI=0;i+;for(j=0;j12500;j+);/延时,例2:发送单字符子函数,void s
6、end_char(uchar hex)SBUF=hex;while(TI=0);TI=0;,例3:发送字符串子函数,void send_string(uchar*string)while(*string!=0)send_char(*string);string+;,例4:发送字符串程序。例1的程序可以改写成调用子函数的方式。,main()uint j;while(1)send_string(trdata);for(j=0;j12500;j+);,main()uint j;while(1)send_string(“MCS-51”);send_char(0 x0d);send_char(0 x0a
7、);for(j=0;j12500;j+);,或者:,例5:串行口发送接收程序,将接收到的字符发送出去。,main()unsigned char a;/*在11.0592MHz下,设置19200波特率,方式1*/TMOD=0 x20;/设置定时器1的方式 TH1=0 xfd;/设置定时器1的初值 TL1=0 xfd;SCON=0 x50;/设置串行口方式1,并允许接收 PCON=0 x80;TR1=1;/启动定时器1,while(1)while(RI=0);RI=0;a=SBUF;SBUF=a;while(TI=0);TI=0;,例6:单片机fosc=11.0592MHz,波特率9600,设置8
8、个字节的队列缓冲区用于接收。根据接收到的命令执行不同的操作。,计算机端发送的命令格式:#+命令+*,命令类型:(1)启动#start*(2)停止#stop*(3)暂停#pause*,#include#define uchar unsigned char#define buffer_size 8/缓冲区大小uchar comrxdbufbuffer_size;/串口接收缓冲区uchar comrxdwrite;bit cmdbegin,cmdok;/命令起始和结束标志,main()/*在12MHz下,设置4800波特率,方式1*/TMOD=0 x20;/设置定时器1的方式 TH1=0 xf3;/
9、设置定时器1的初值 TL1=0 xf3;SCON=0 x50;/设置串行口方式1,并允许接收 PCON=0 x80;TR1=1;/启动定时器1 ES=1;EA=1;,for(;)if(cmdok)cmdok=0;if(string_compare(“start,5)!=0)/处理启动命令 else if(string_compare(“stop,4)!=0)/处理停止命令 else if(string_compare(“pause,5)!=0)/处理暂停命令,void serial()interrupt 4 using 1 uchar a;if(RI)RI=0;a=SBUF;if(a=#)cmdbegin=1;comrxdwrite=0;else if(a=*)cmdbegin=0;cmdok=1;else if(cmdbegin=1)comrxdbufcomrxdwrite=a;comrxdwrite+;if(comrxdwrite=buffer_size)comrxdwrite=0;,uchar string_compare(uchar*string,uchar number)/串口字符串比较 uchar b,c;for(b=0;bnumber;b+)c=comrxdbufb;if(c!=(*string)return(0);string+;return(1);,
链接地址:https://www.31ppt.com/p-6449629.html