您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机8051串行接口的C编程
第6章8051串行口的C编程本章主要介绍串行通信概念及51系列单片机的串行口问题,将具体介绍以下内容:51单片机串行口----串行口结构、串行口的控制寄存器、串行口的工作方式、串行口的初始化、应用举例。计算机串行通信基础----基本概念。通信方式§6.1计算机串行通信基础基本概念并行通信方式—空间上区分各位数据及联络控制信号。占用传输线多,速度快。串行通信方式—时间上区分各位数据及联络控制信号。占用传输线少,速度慢。§6.251单片机串行口一、串行口结构8051系列单片机片上有UART(通用异步收发)用于串行通信,发送时数据由TXD端发出,接收时数据由RXD端输入。TTL电平:短距离机间通信RS232电平:与计算机通信。(驱动芯片MAX232)二、串行口的控制寄存器与串行口有关的控制寄存器有:1.串行口控制寄存器SCOND7D6D5D4D3D2D1D0SM0SM1SM2RENTB8RB8TIRI工作方式控制位中断标志接收允许位(硬件置位,软件清0)0禁止1允许(软件设置)工作方式控制位SM0、SM1SM0SM1工作方式说明波特率00方式0同步移位寄存器fosc/1201方式110位异步收发由定时器控制10方式211位异步收发fosc/32或fosc/6411方式311位异步收发由定时器控制2.电源控制寄存器PCOND7D6D5D4D3D2D1D0SMODGF1GF0PDIDLSMOD:串行口波特率加倍位。1方式1,3波特率=定时器1溢出率/16;方式2波特率=fosc/32。0方式1,3波特率=定时器1溢出率/32;方式2波特率=fosc/64。三、串行口的工作方式串行口共有四种工作方式方式1—10位异步通信方式10位=1位起始位(0)+8位数据位+1位停止位(1)其中起始位和停止位在发送时是自动插入的。发送:SBUF=?;SBUF=“abc”;例子:SBUF=“a”;SBUF=0x61;发送条件TI=0;(软件清0)发送完毕TI=1;(硬件置位)接收:?=SBUF;例子:serial_data=SBUF;接收条件REN=1;(软件置位)收到数据RI=1;(硬件置位)读数完毕RI=0;(软件清0)波特率=2SMOD*(定时器1的溢出率)/32例子:波特率=9600,fosc=11.059M,则设置PCON=0x00;//SMOD=0;TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;//启动定时器1ES=1;//开串行口中断EA=1;//开CPU中断四、串行口的初始化1.串行口波特率使用单片机串口时,选用的晶振比较固定6MHz,12MHz,11.0592MHz。常用于和计算机的通信;选用的波特率也相对固定。串行口常用的波特率及相应的设置见表8-3。2.初始化步骤设置产生波特率的定时器1、串行口控制和中断控制。具体步骤:(1)确定定时器1的工作方式,编程TMOD寄存器;(2)计算定时器1的初值,装载TH1和TL1;(4)确定串行口的控制,编程SCON和PCON;(5)开CPU和源中断,编程IE中的ES和EA位。(3)启动定时器1,编程TCON中的TR1位;五、串行口应用举例例1:发送字符串程序#includereg51.h#defineucharunsingnedchar#defineuintunsignedintucharidatatrdata[10]={‘M’,‘C’,‘S’,‘-’,‘5’,‘1’,0x0d,0x0a,0x00};main(){uchari;uintj;/*在11.0592MHz下,设置9600波特率,方式1*/TMOD=0x20;//设置定时器1的方式TH1=0xfd;//设置定时器1的初值TL1=0xfd;SCON=0x50;//设置串行口方式1,并允许接收PCON=0x00;TR1=1;//启动定时器1while(1){i=0;while(trdata[i]!=0x00)//发送字符串{SBUF=trdata[i];while(TI==0);TI=0;i++;}for(j=0;j12500;j++);//延时}}例2:发送单字符子函数voidsend_char(ucharhex){SBUF=hex;while(TI==0);TI=0;}例3:发送字符串子函数voidsend_string(uchar*string){while(*string!=0){send_char(*string);string++;}}例4:发送字符串程序。例1的程序可以改写成调用子函数的方式。main(){uintj;while(1){send_string(trdata);for(j=0;j12500;j++);}}main(){uintj;while(1){send_string(“MCS-51”);send_char(0x0d);send_char(0x0a);for(j=0;j12500;j++);}}或者:例5:串行口发送接收程序,将接收到的字符发送出去。main(){unsignedchara;/*在11.0592MHz下,设置19200波特率,方式1*/TMOD=0x20;//设置定时器1的方式TH1=0xfd;//设置定时器1的初值TL1=0xfd;SCON=0x50;//设置串行口方式1,并允许接收PCON=0x80;TR1=1;//启动定时器1while(1){while(RI==0);RI=0;a=SBUF;SBUF=a;while(TI==0);TI=0;}}例6:单片机fosc=11.0592MHz,波特率9600,设置8个字节的队列缓冲区用于接收。根据接收到的命令执行不同的操作。计算机端发送的命令格式:‘#’+命令+‘*’命令类型:(1)启动#start*(2)停止#stop*(3)暂停#pause*#includereg51.h#defineucharunsignedchar#definebuffer_size8//缓冲区大小ucharcomrxdbuf[buffer_size];//串口接收缓冲区ucharcomrxdwrite;bitcmdbegin,cmdok;//命令起始和结束标志main(){/*在12MHz下,设置4800波特率,方式1*/TMOD=0x20;//设置定时器1的方式TH1=0xf3;//设置定时器1的初值TL1=0xf3;SCON=0x50;//设置串行口方式1,并允许接收PCON=0x80;TR1=1;//启动定时器1ES=1;EA=1;for(;;){if(cmdok){cmdok=0;if(string_compare(“start,5)!=0)…//处理启动命令elseif(string_compare(“stop,4)!=0)…//处理停止命令elseif(string_compare(“pause,5)!=0)…//处理暂停命令}}}voidserial()interrupt4using1{uchara;if(RI){RI=0;a=SBUF;if(a==‘#’){cmdbegin=1;comrxdwrite=0;}elseif(a==‘*’){cmdbegin=0;cmdok=1;}elseif(cmdbegin==1){comrxdbuf[comrxdwrite]=a;comrxdwrite++;if(comrxdwrite=buffer_size)comrxdwrite=0;}}}ucharstring_compare(uchar*string,ucharnumber)//串口字符串比较{ucharb,c;for(b=0;bnumber;b++){c=comrxdbuf[b];if(c!=(*string))return(0);string++;}return(1);}
本文标题:单片机8051串行接口的C编程
链接地址:https://www.777doc.com/doc-2594067 .html