3C51应用编程设计_第1页
3C51应用编程设计_第2页
3C51应用编程设计_第3页
3C51应用编程设计_第4页
3C51应用编程设计_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.1MCS-51机间间通信信的C语言言编程程3.2键键盘盘和数数码显显示人人机交交互的的C语语言编编程三C51应用用编程程设计计3.1MCS-51机间间通信信的C语言言编程程3.1.1点点对对点的的串行行异步步通信信1.通通信双双方的的硬件件连接接图3.18031间RS——232C电平平信号号的传传2.通通信双双方的的约定定图3.2点点对点点通信信的程程序框框图3.点点对对点通通信编编程点对点点通信信双方方基本本等同同,只只是人人为规规定一一个为为发送送,一一个为为接收收。要要求两两机串串行口口的波波特率率相同同,因因而发发送和和接收收方串串行口口的初初始化化相同同。可可编制制含有有初始始化函函数、、发送送函数数接收收函数数的程程序,,在主主函数数中根根据程程序的的发送送、接接收设设置TR,,采用用条件件判别别决定定使用用发送送函数数还是是接收收函数数。这这样点点对点点通信信的双双方都都可运运行此此程序序,只只需在在程序序运行行之前前人为为设置置选择择TR,一一个令令TR=0,一一个令令TR=1,然然后分分别编编译,,在两两机上上分别别装入入,同同时运运行。。例1点对点点通信信。点对点点通信信的程程序如如下::#include<reg51.h>#defineucharunsignedchar#defineTR1/*发送送接收收差别别值TR=0发发送*/ucharidatabuf[10];ucharpf;;voidinit(void)/*串行行口初初始化化*/{TMOD=0x20;;/*设设T/C1为定定时方方式2*/TH1=0xe8;;/*设设定波波特率率*/TL1=0xe8;;PCON=0x00;TR1=1;/*启动动T/C1*/SCON=0x50;/*串串行口口工作作在方方式1*/}voidsend(ucharidata*d){uchari;;do{SBUF=0xaa;/*发发送联联络信信号*/while(TI==0);/*等等待发发送出出去*/TI=0;;while(RI==0);/*等待待B机机回答答*/RI=0;;}while((SBUF^0xbb)!=0);;/*B机机未准准备好好,继继续联联络*/do{pf=0;;/*清校校验和和*/for(i=0;i<16;;i++){SBUF=d[i];/*发发送一一个数数据*/pf+=d[i];/*求校校验和和*/while(TI==0);TI=0;;}SBUF=pf;/*发送送校验验和*/while(TI==0);TI=0;;while(RI==0);RI=0;;/*等待待B机机回答答*/}while(SBUF!=0);/*回答答出错错,则则重发发*/}voidreceive(ucharidata*d){uchari;;do{while(RI==0);;RI=0;;}while((SBUF^0xaa)!=0);/*判判A机机请求求否*/SBUF=0xbb;/*发发应答答信号号*/while(TI==0);;TI=0;;while(1){pf=0;/*清清校验验和*/for(i=0;i<16;;i++){while(RI==0);;RI=0;;d[i]=SBUF;/*接收收一个个数据据*/pf+=d[i];/*求校校验和和*/}while(RI==0);;RI=0;;/*接接收A机校校验和和*/if((SBUF^pf)==0)/*比比较校校验和和*/{SBUF=0x00;break;;}/*校校验和和相同同发"00"*/else{SBUF=0xff;;/*出错错发"FF",,重新新接收收*/while(TI==0);TI=0;}}}voidmain(void){init();;if(TR==0){send(buf);}else{receive(buf);;}}3.1.2多多机机通信信1.通通信接接口图3.3总总线线式主主从式式多机机系统统2.通通信协协议根据MCS-51串串行口口的多多机通通信能能力,,多机机通信信可以以按照照以下下协议议进行行:(1)首首先使使所有有从机机的SM2位置置1处处于只只接收收地址址帧的的状态态。(2)主主机先先发送送一帧帧地址址信息息,其其中8位地地址,,第9位为为地址址/数数据信信息的的标志志位,,该位位置1表示示该帧帧为地地址信信息。。(3)从从机机接接收收到到地地址址帧帧后后,,各各自自将将接接收收的的地地址址与与本本机机的的地地址址比比较较。。对对于于地地址址相相符符的的那那个个从从机机,,使使SM2位位清清零零,,以以接接收收主主机机随随后后发发来来的的所所有有信信息息;;对对于于地地址址不不符符的的从从机机,,仍仍保保持持SM2=1,,对对主主机机随随后后发发来来的的数数据据不不予予理理睬睬,,直直至至发发送送新新的的地地址址帧帧。。(4)当当从从机机发发送送数数据据结结束束后后,,发发送送一一帧帧校校验验和和,,并并置置第第9位位(TB8)为为1,,作作为为从从机机数数据据传传送送结结束束标标志志。。(5)主主机机接接收收数数据据时时先先判判断断数数据据结结束束标标志志(RB8),,若若RB8=1,,表表示示数数据据传传送送结结束束,,并并比比较较此此帧帧校校验验和和,,若若正正确确,,则则会会送送正正确确信信号号00H,,此此信信号号令令该该从从机机复复位位(即即重重新新等等待待地地址址帧帧);;若若校校验验和和出出错错,,则则发发送送0FFH,,令令该该从从机机重重发发数数据据。。若若接接收收帧帧的的RB8=0,,则则原原数数据据到到缓缓冲冲区区,,并并准准备备接接收收下下帧帧信信息息。。(6)若若主主机机向向从从机机发发送送数数据据,,从从机机在在第第(3)步步中中比比较较地地址址相相符符后后,,从从机机令令SM2=0,,同同时时把把本本站站地地址址发发回回主主机机。。作作为为应应答答之之后后才才能能收收到到主主机机发发送送来来的的数数据据。。其其它它从从机机(SM2=1),,无无法法收收到到数数据据。。(7)主主机收收到从机机的应答答地址后后,确认认地址是是否相符符。如果果地址不不符,发发复位信信号(数数据帧中中TB8=1);如果果地址相相符,则则清TB8,开开始发送送数据。。(8)从从机接接收到复复位命令令后回到到监听地地址状态态(SM2=1)。否否则开始始接收数数据和命命令。3.通通信程序序设主机发发送的地地址联络络信号00H,,01H,02H为从从机设备备地址,,地址FFH是是命令各各从机恢恢复SM2为1的状态态,即复复位。主主机的命命令编码码为:01H请请求求从机接接收主机机的数据据命令;;02H请请求求从机向向主机发发送数据据命令。。其它都按按从机向向主机发发送数据据命令02H对对待。从机的状状态字节节格式为为:ERR00000TRDYRRDYD7D6D5D4D3D2D1D0RRDY=1::从机准准备好接接收主机机的数据据。TRDY=1::从机准准备好向向主机发发送数据据。ERR=1:从从机接收收到的命命令是非非法的。。通常从机机以中断断方式控控制和主主机的通通信。程程序可分分成主机机程序和和从机程程序,约约定一次次传送的的数据为为16个个字节,,以02H地址址的从机机为例。。1)主主机程序序图3.4多多机通信信主机程程序流程程图主机程序序如下::#include<reg51.h>#defineucharunsignedchar#defineSLAVE0x02/*从机地地址*/#defineBN16ucharidatarbuf[16];;ucharidatatbuf[16]={"mastertransmit"};voiderr(void){SBUF=0xff;;while(TI!=1);;TI=0;}ucharmaster(charaddr,ucharcommand){ucharaa,i,,p;while(1){SBUF=SLAVE;/*发呼呼叫地址址*/while(TI!=1);TI=0;;while(RI!=1);RI=0;;/*等等待从机机回答*/if(SBUF!=addr)err();;/*若若地址址错,发发复位信信号*/else{/*地地址相相符*/TB8=0;/*清地地址标志志*/SBUF=command;;/*发发命令*/while(TI!=1);TI=0;;while(RI!=1);RI=0;;aa=SBUF;/*接收收状态*/if((aa&0x08)==0x08){TB8=1;;err();}/*若命命令未被被接收,发复位位信号*/else{if(command==0x01)/*是是发送命命令*/{if((aa&0x01)==0x01)/*从从机准备备好接收收*/{do{p=0;;/*清校校验和*/for(i=0;i<BN;;i++){SBUF=tbuf[i];;/*发发送一一数据*/p+=tbuf[i];while(TI!=1);;TI=0;}SBUF=p;;/*发送送校验和和*/while(TI==0);TI=0;while(RI==0);RI=0;}while(SBUF!=0);/*接接收不正正确,重重新发送送*/TB8=1;/*置置地址址标志*/return(0)}}else{if((aa&0x02)==0x02)/*是是接收收命令,从机准准备好发发送*/{while(1){p=0;;/*清校验验和*/for(i=0;i<BN;i++){while(RI!=1);RI=0;rbuf[i]=SBUF;/*接收一一数据*/P+=rubf[i];;}while(RI==0);RI=0;if(SBUF==p){SBUF=0X00;/*校校验和相同同发"00"*/while(TI==0);TI=0;break;;}else{SBUF=0xff;/*校验和不不同发"0FF",重新新接收*/while(TI==0);TI=0;}}TB8=1;;/*置置地址标志志*/Retuen(0);}}}}}}voidmain(viod){TMOD=0x20;/*T/C1定定义为方式2*/TL1=0xfd;TH1=0xfd;/*置初值值*/PCON=0x00;TR1=1;;SCON=0xf0;/*串行口口为方式3*/master(SLAVE,0x01);master(SLAVE,0x02);;}2)从机程程序图3.5多多机通信的从从机中断程序序流从机程序如下下:#include<reg51.h>#defineucharunsignedchar#defineSLAVE0x02#defineBN16ucharidatatrbuf[16];ucharidatarebuf[16];bittready;;bitrready;;voidmain(void){TMOD=0x20;/*T/C1定定义为方式2*/TL1=0xfd;/*置初值值*/TH1=0xfd;PCON=0x00;TR1=1;;SCON=0xf0;/*串行口为为方式3*/ES=1;EA=1;/*开串行口口中断*/while(1){tready=1;rready=1;}/*假定准备好好发送和接收收*/}voidssio(void)interrupt4using1{voidstr(void);voidsre(void);uchara,i;RI=0;ES=0;/*关关串行口中断断*/if(SBUF!=SLAVE){ES=1;gotoreti;}/*非非本机地址,继续监听*/SM2=0;;/*取消监听听状态*/SBUF=SLAVE;;/*从本本地址发回*/while(TI!=1);TI=0;;while(RI!=1);RI=0;;if(RB8==1){SM2=1;;ES=1;gotoreti;}/*是是复位信号号,恢复监听听*/a=SBUF;/*接收命命令*/if(a=0x01)/*从从主机接收的的数据*/{if(rready==1)SBUF=0x01;;/*接接收准备好好发状态*/elseSBUF=0x00;;while(TI!=1);TI=0;;while(RI!=1);RI=0;;if(RB8==1){SM2=1;;ES=1;gotoreti;}sre();/*接接收数据*/}else{if(a=0x02)/*从机向向主机发送数数据*/{if(tready==1)SBUF=0x02;;/*发发送准备好发发状态*/elseSBUF=0x00;;while(TI!=1);TI=0;while(RI!=1);RI=0;;if(RB8==1){SM2=1;;ES=1;gotoreti;;}str();/*发送送数据*/}else{SBUF=0x80;/*命令令非法,发发状态*/while(TI!=1);TI=0;;SM2=1;ES=1;;/*恢恢复监听*/}}reti:;}voidstr(void)/*发发数据块*/{ucharp,i;;tready=0;;do{p=0;/*清清校验和*/for(i=0;;i<BN;i++){SBUF=trbuf[i];/*发送一一数据*/p+=trbuf[i];while(TI!=1);;TI=0;}SUBF=p;;/*发送校校验和*/while(TI==0);TI=0;while(RI==0);;RI=0;;}while(SBUF!=0);;/*主主机接收不不正确,重重新发送*/SM2=1;ES=1;}voidsre(void)/*接接收数据块块*/{ucharp,i;rready=0;while(1){p=0;/*清清校验和和*/for(i=0;i<BN;i++){while(RI!=1);RI=0;;rebuf[i]=SBUF;/*接收收数据*/p+=rebuf[i];}while(RI!=1);;RI=0;;if(SBUF==p){SBUF=0x00;break;}/*校验验和相同发发"00"*/else{SBUF=0xff;/*校校验和不同同发"0FF",重重新接收*/while(TI==0);TI=0;}}SM2=1;;ES=1;}3.2键键盘和数数码显示人人机交互的的C语言编编程3.2.1行列列式键盘与与8031的接口键盘输入信信息的主要要过程是::(1)单单片机判断断是否有键键按下。(2)确确定按下的的是哪一个个键。(3)把把此步骤代代表的信息息翻译成计计算机所能能识别的代代码,如ASCII或其它特特征码。图3.68031与行列式式键盘的接接口例24×4键盘盘的扫描程程序。扫描程序查查询的内容容为:(1)查查询是否有有键按下。。首先单片片机向行扫扫描P1.0~P1.3输出全为为"0"扫扫描码F0H,然后后从列检查查口P1.4~P1.7输输入列扫描描信号,只只要有一列列信号不为为"1",,即P1口口不为F0H,则表表示有键按按下。接着着要查出按按下键所在在的行、列列位置。(2)查查询按下键键所在的行行列位置。。单片机将将得到的信信号取反,,P1.4~P1.7中的为为1的位便便是键所在在的列。接接下来要确确定键所在在的行,需需要进行逐逐行扫描。。单片机首首先使P1.0为"0",P1.1~P1.7为"1",即向P1口发送送扫描码FEH,接接着输入列列检查信号号,若全为为"1",,表示不在在第一行。。接着使P1.1接接地,其余余为"1",再读入入列信号………这样逐逐行发"0"扫描码码,直到找找到按下键键所在的行行,将该行行扫描码取取反保留。。当各行都都扫描以后后仍没有找找到,则放放弃扫描,,认为是键键的误动作作。(3)对对得到的行行号和列号号译码,得得到键值。。(4)键键的抖动处处理。当用用手按下一一个键时,,往往会出出现所按键键在闭合位位置和断开开位置之间间跳几下才才稳定到闭闭合状态的的情况。在在释放一个个键时,也也会出现类类似的情况况,这就是是键抖动,,抖动的持持续时间不不一,通常常不会大于于10ms,若抖抖动问题不不解决,就就会引起对对闭合键的的多次读入入,对于键键抖动最方方便的解决决方法就是是当发现有有键按下后后,不是立立即进行逐逐行扫描,,而是延时时10ms后再进进行。由于于键按下的的时间持续续上百毫秒秒,延时后后再也不迟迟。扫描函数的的返回值为为键特征码码,若无键键按下,返返回值为0。程序如如下:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintvoiddlms(void)voidkbscan(void);;voidmain(void){ucharkey;while(1){key=kbscan();dlms();;}}voiddlms(void){uchari;for(i=200;;i>0;i--){}}ucharkbscan(void)/*键键扫描函函数*/{ucharscode,recode;P1=oxf0;;if((P1&0xf0)!=0xf0)/*若若有键按按下*/{dlms();/*延延时去抖动动*/if((P1&0xf0)!=0xf0){scode=0xfe;/*逐逐行扫描描初值*/while((scode&0x10)!=0){P1=scode;;/*输输出扫描码码*/if((P1&0xf0)!=0xf0)/*本行有有键按下*/{recode=(P1&0xf0)|0x0f;return((~scode)+(~recode));/*返返回特征征字节码*/}elsescode=(scode<<1)|0x01;/*行扫描描左移一位位*/}}}return(0);;}3.2.2七段段数码显示示与8031的接口口数码显示器器有静态显显示和动态态显示两种种显示方式式。数码显示器器有发光管管的LED和液晶的的LCD两两种。LED显示示器工作在在静态方式式时,其阴阴极(或其其阳极)点点连接在一一起接地(或+5V),每每一个的端端选线(a,b,c,d,e,f,g,dp)分别与一一个8位口口相连。LCD数码码显示只能能工作在静静态显示,,并要求加加上专门的的驱动芯片片4056。LED显示示器工作在在动态显示示方式时,,段选码端端口I/O1用来输输出显示字字符的段选选码,I/O2输出出位选码。。I/O1不断送待待显示字符符的段选码码,I/O2不断送送出不同的的位扫描码码,并使每每位显示字字符停留显显示一段时时间,一般般为1~5ms,,利用眼睛睛的视觉惯惯性,从显显示器上便便可以见到到相当稳定定的数字显显示。例38155控控制的动态态LED显显示。图3.7经8155扩扩展端口的的6位LED动态显显示确定的8155片内内4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论