C應用編程設計_第1頁
C應用編程設計_第2頁
C應用編程設計_第3頁
C應用編程設計_第4頁
C應用編程設計_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

3.1MCS-51機間通信的C語言編程3.2鍵盤和數碼顯示人機交互的C語言編程三C51應用編程設計3.1MCS-51機間通信的C語言編程3.1.1點對點的串行異步通信1.通信雙方的硬件連接圖3.18031間RS—232C電平信號的傳2.通信雙方的約定圖3.2點對點通信的程序框圖3.點對點通信編程點對點通信雙方基本等同,只是人為規(guī)定一個為發(fā)送,一個為接收。要求兩機串行口的波特率相同,因而發(fā)送和接收方串行口的初始化相同??删幹坪谐跏蓟瘮?、發(fā)送函數接收函數的程序,在主函數中根據程序的發(fā)送、接收設置TR,采用條件判別決定使用發(fā)送函數還是接收函數。這樣點對點通信的雙方都可運行此程序,只需在程序運行之前人為設置選擇TR,一個令TR=0,一個令TR=1,然后分別編譯,在兩機上分別裝入,同時運行。例1點對點通信。點對點通信的程序如下:#include<reg51.h>#defineucharunsignedchar#defineTR1 /*發(fā)送接收差別值TR=0發(fā)送*/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; /*發(fā)送聯絡信號*/while(TI==0); /*等待發(fā)送出去*/TI=0;while(RI==0); /*等待B機回答*/RI=0;}while((SBUF^0xbb)!=0); /*B機未準備好,繼續(xù)聯絡*/do{pf=0; /*清校驗和*/for(i=0;i<16;i++){SBUF=d[i]; /*發(fā)送一個數據*/pf+=d[i]; /*求校驗和*/while(TI==0);TI=0;}SBUF=pf; /*發(fā)送校驗和*/while(TI==0);TI=0;while(RI==0);RI=0; /*等待B機回答*/}while(SBUF!=0); /*回答出錯,則重發(fā)*/}

voidreceive(ucharidata*d){uchari;do{while(RI==0);RI=0;} while((SBUF^0xaa)!=0); /*判A機請求否*/SBUF=0xbb; /*發(fā)應答信號*/ 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;} /*校驗和相同發(fā)"00"*/else{SBUF=0xff; /*出錯發(fā)"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處處于只只接收收地址址幀的的狀態(tài)態(tài)。(2)主主機先先發(fā)送送一幀幀地址址信息息,其其中8位地地址,,第9位為為地址址/數數據信信息的的標志志位,,該位位置1表示示該幀幀為地地址信信息。。(3)從從機接接收到到地址址幀后后,各各自將將接收收的地地址與與本機機的地地址比比較。。對于于地址址相符符的那那個從從機,,使SM2位清清零,,以接接收主主機隨隨后發(fā)發(fā)來的的所有有信息息;對對于地地址不不符的的從機機,仍仍保持持SM2=1,,對主主機隨隨后發(fā)發(fā)來的的數據據不予予理睬睬,直直至發(fā)發(fā)送新新的地地址幀幀。(4)當當從機機發(fā)送送數據據結束束后,,發(fā)送送一幀幀校驗驗和,,并置置第9位(TB8)為1,作作為從從機數數據傳傳送結結束標標志。。(5)主主機接收數數據時先判判斷數據結結束標志(RB8),若RB8=1,,表示數據據傳送結束束,并比較較此幀校驗驗和,若正正確,則會會送正確信信號00H,此信號號令該從機機復位(即即重新等待待地址幀);若校驗驗和出錯,,則發(fā)送0FFH,,令該從機機重發(fā)數據據。若接收收幀的RB8=0,,則原數據據到緩沖區(qū)區(qū),并準備備接收下幀幀信息。(6)若若主機向從從機發(fā)送數數據,從機機在第(3)步中比比較地址相相符后,從從機令SM2=0,,同時把本本站地址發(fā)發(fā)回主機。。作為應答答之后才能能收到主機機發(fā)送來的的數據。其其它從機(SM2=1),無無法收到數數據。(7)主主機收到從從機的應答答地址后,,確認地址址是否相符符。如果地地址不符,,發(fā)復位信信號(數據據幀中TB8=1);如果地地址相符,,則清TB8,開始始發(fā)送數據據。(8)從從機接收到到復位命令令后回到監(jiān)監(jiān)聽地址狀狀態(tài)(SM2=1)。否則開開始接收數數據和命令令。3.通信信程序設主機發(fā)送送的地址聯聯絡信號00H,01H,02H為從從機設備地地址,地址址FFH是是命令各從從機恢復SM2為1的狀態(tài),,即復位。。主機的命命令編碼為為:01H請請求從機機接收主機機的數據命命令;02H請請求從機機向主機發(fā)發(fā)送數據命命令。其它都按從從機向主機機發(fā)送數據據命令02H對待。。從機的狀態(tài)態(tài)字節(jié)格式式為:ERR00000TRDYRRDYD7D6D5D4D3D2D1D0RRDY=1:從機機準備好接接收主機的的數據。TRDY=1:從機機準備好向向主機發(fā)送送數據。ERR=1:從機接接收到的命命令是非法法的。通常從機以以中斷方式式控制和主主機的通信信。程序可可分成主機機程序和從從機程序,,約定一次次傳送的數數據為16個字節(jié),,以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;/*發(fā)發(fā)呼叫地地址*/while(TI!=1);TI=0;while(RI!=1);RI=0;/*等待從從機回答*/if(SBUF!=addr)err();/*若地地址錯,發(fā)發(fā)復位信號號*/else{/*地地址相符*/TB8=0;/*清清地址標標志*/SBUF=command;;/*發(fā)命命令*/while(TI!=1);TI=0;while(RI!=1);RI=0;aa=SBUF;/*接接收狀態(tài)態(tài)*/if((aa&0x08)==0x08){TB8=1;err();}/*若若命令未未被接收,發(fā)復位信信號*/else{if(command==0x01)/*是發(fā)發(fā)送命令*/{if((aa&0x01)==0x01)/*從從機準備好好接收*/{do{p=0;/*清校驗驗和*/for(i=0;i<BN;;i++){SBUF=tbuf[i];/*發(fā)發(fā)送一數數據*/p+=tbuf[i];while(TI!=1);;TI=0;}SBUF=p;/*發(fā)發(fā)送校驗和和*/while(TI==0);TI=0;while(RI==0);RI=0;}while(SBUF!=0);/*接收收不正確,,重新發(fā)送送*/TB8=1;/*置置地址標標志*/return(0)}}else{if((aa&0x02)==0x02)/*是是接收命命令,從機機準備好發(fā)發(fā)送*/{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;/*校驗和和相同發(fā)"00"*/while(TI==0);TI=0;break;;}else{SBUF=0xff;;/*校校驗驗和和不不同同發(fā)發(fā)"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;;}/*假假定定準準備備好好發(fā)發(fā)送送和和接接收收*/}voidssio(void)interrupt4using1{voidstr(void);;voidsre(void);;uchara,i;;RI=0;;ES=0;;/*關關串串行行口口中中斷斷*/if(SBUF!=SLAVE){ES=1;;gotoreti;;}/*非非本本機機地地址址,繼繼續(xù)續(xù)監(jiān)監(jiān)聽聽*/SM2=0;;/*取取消消監(jiān)監(jiān)聽聽狀狀態(tài)態(tài)*/SBUF=SLAVE;;/*從從本本地地址址發(fā)發(fā)回回*/while(TI!=1);;TI=0;;while(RI!=1);;RI=0;;if(RB8==1){SM2=1;;ES=1;;gotoreti;;}/*是是復復位位信信號號,,恢恢復復監(jiān)監(jiān)聽聽*/a=SBUF;;/*接接收收命命令令*/if(a=0x01)/*從從主主機機接接收收的的數數據據*/{if(rready==1)SBUF=0x01;;/*接接收準備好好發(fā)狀態(tài)*/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)/*從機向向主機發(fā)送數數據*/{if(tready==1)SBUF=0x02;;/*發(fā)發(fā)送準備好發(fā)發(fā)狀態(tài)*/elseSBUF=0x00;;while(TI!=1);TI=0;while(RI!=1);RI=0;;if(RB8==1){SM2=1;;ES=1;gotoreti;;}str();/*發(fā)送送數據*/}else{SBUF=0x80;/*命令令非法,發(fā)發(fā)狀態(tài)*/while(TI!=1);TI=0;;SM2=1;ES=1;;/*恢恢復監(jiān)聽*/}}reti:;}voidstr(void)/*發(fā)發(fā)數據塊*/{ucharp,i;;tready=0;;do{p=0;/*清清校驗和*/for(i=0;;i<BN;i++){SBUF=trbuf[i];/*發(fā)送一一數據*/p+=trbuf[i];while(TI!=1);TI=0;;}SUBF=p;/*發(fā)發(fā)送校驗和和*/while(TI==0);TI=0;;while(RI==0);RI=0;}while(SBUF!=0);;/*主機接收收不正確,重重新發(fā)送*/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;} /*校驗和相相同發(fā)"00"*/else{SBUF=0xff;;/*校驗和和不同發(fā)"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口發(fā)送掃描描碼FEH,,接著輸入列列檢查信號,,若全為"1",表示不不在第一行。。接著使P1.1接地,,其余為"1",再讀入入列信號………這樣逐行發(fā)發(fā)"0"掃描描碼,直到找找到按下鍵所所在的行,將將該行掃描碼碼取反保留。。當各行都掃掃描以后仍沒沒有找到,則則放棄掃描,,認為是鍵的的誤動作。(3)對得得到的行號和和列號譯碼,,得到鍵值。。(4)鍵的的抖動處理。。當用手按下下一個鍵時,,往往會出現現所按鍵在閉閉合位置和斷斷開位置之間間跳幾下才穩(wěn)穩(wěn)定到閉合狀狀態(tài)的情況。。在釋放一個個鍵時,也會會出現類似的的情況,這就就是鍵抖動,,抖動的持續(xù)續(xù)時間不一,,通常不會大大于10ms,若抖動動問題不解決決,就會引起起對閉合鍵的的多次讀入,,對于鍵抖動動最方便的解解決方法就是是當發(fā)現有鍵鍵按下后,不不是立即進行行逐行掃描,,而是延時10ms后后再進行。由由于鍵按下的的時間持續(xù)上上百毫秒,延延時后再也不不遲。掃描函數的返返回值為鍵特特征碼,若無無鍵按下,返返回值為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));; /*返返回特征字字節(jié)碼*/}elsescode=(scode<<1)|0x01;;/*行掃描左左移一位*/}}}return(0);}七七段數碼碼顯示與8031的接口口數碼顯示器有有靜態(tài)顯示和和動態(tài)顯示兩兩種顯示方式式。數碼顯示器有有發(fā)光管的LED和液晶晶的LCD兩兩種。LED顯示器器工作在靜態(tài)態(tài)方式時,其其陰極(或其其陽極)點連連接在一起接接地(或+5V),每每一個的端選選線(a,b,c,d,,e,f,g,dp)分分別與一個8位口相連。。LCD數碼碼顯示只能工工作在靜態(tài)顯顯示,并要求求加上專門的的驅動芯片4056。LED顯示器器工作在動態(tài)態(tài)顯示方式時時,段選碼端端口I/O1用來輸出顯顯示字符的段段選碼,I/O2輸出位位選碼。I/O1不斷送送待顯示字符符的段選碼,,I/O2不不斷送出不同同的位掃描碼碼,并使每位位顯示字符停停留顯示一段段時間,一般般為1~5ms,利用用眼睛的視覺覺慣性,從顯顯示器上便可可以見到相當當穩(wěn)定的數字字顯示。例38155控制制的動態(tài)LED顯示。圖3.7經經8155擴展端口口的6位LED動態(tài)顯示示確定的8155片內4個個端口地址如如下:命令/狀態(tài)口口:FFF0H口A:FFF1H口

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論