C应用编程设计_第1页
C应用编程设计_第2页
C应用编程设计_第3页
C应用编程设计_第4页
C应用编程设计_第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);}}多多机机通信信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语言编编程行行列式键键盘与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);}七七段数码码显示与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个个端口地址如如下:命令/状态口口:FFF0H口A:FFF1H口

温馨提示

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

评论

0/150

提交评论