下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第12章 8051機間通信的C編程12.1 點對點的串行異步通信12.2 多機通信2013/10/13 L112.1 點對點的串行異步通信12.1.1通信雙方的硬件連接2013/10/13 L212.1.2通信雙方的約定2013/10/13 L3 點對點通信雙方基本等同,只是人為規(guī)定一個為發(fā)送,一個為接收。要求兩機串行口的波特率相同,因而發(fā)送和接收方串行口的初始化相同??删幹坪谐跏蓟瘮?shù)、發(fā)送函數(shù)接收函數(shù)的程序,在主函數(shù)中根據(jù)程序的發(fā)送、接收設(shè)置TR,采用條件判別決定使用發(fā)送函數(shù)還是接收函數(shù)。這樣點對點通信的雙方都可運行此程序,只需在程序運行之前人為設(shè)置選擇TR,一個令TR=0,一個令TR=
2、1,然后分別編譯,在兩機上分別裝入,同時運行。 12.1.3. 點對點通信編程2013/10/13 L4#include#define uchar unsigned char#define TR 1 /*發(fā)送接收差別值TR=0發(fā)送*/uchar idata buf10;uchar pf;void init(void) /*串行口初始化*/TMOD=0 x20; /*設(shè)T/C1為定時方式2*/ TH1=0 xe8; /*設(shè)定波特率*/TL1=0 xe8; PCON=0 x00; TR1=1; /*啟動T/C1*/ SCON=0 x50; /*串行口工作在方式1*/2013/10/13 L5voi
3、d send(uchar idata *d) uchar i; do SBUF=0 xaa; /*發(fā)送聯(lián)絡(luò)信號*/ while(TI= =0); /*等待發(fā)送出去*/ TI=0;while(RI= =0); /*等待B機回答*/ RI=0; while (SBUF0 xbb)!=0); /*B機未準(zhǔn)備好,繼續(xù)聯(lián)絡(luò)*/ do pf=0; /*清校驗和*/ for ( i=0;i16;i+) SBUF= di; /*發(fā)送一個數(shù)據(jù)*/ pf+ =di; /*求校驗和*/ while ( TI = = 0);TI = 0; SBUF=pf; /*發(fā)送校驗和*/while( TI= =0 );TI =
4、0; while( RI= =0 );RI = 0; /*等待B機回答*/ while ( SBUF != 0); /*回答出錯,則重發(fā)*/ 2013/10/13 L6void receive (uchar idata *d) uchar i;do while (RI= =0); RI=0; while (SBUF0 xaa)! =0); /*判A機請求否*/ SBUF=0 xbb; /*發(fā)應(yīng)答信號*/while (TI= =0); TI=0;while (1) pf=0; /*清校驗和*/ for ( i=0;i16;i+) while (RI= =0); RI=0; d i =SBUF;
5、/*接收一個數(shù)據(jù)*/ pf+ =di; /*求校驗和*/ while (RI= =0); RI=0; /*接收A機校驗和*/ if ( ( SBUF pf ) = = 0 ) /*比較校驗和*/ SBUF=0 x00; break; /*校驗和相同發(fā)00*/ else SBUF = 0 xff; /*出錯發(fā)FF,重新接收*/ while(TI= =0); TI=0; 2013/10/13 L7void main (void) init ( ); if ( TR= =0 ) send(buf); else receive(buf);2013/10/13 L812.2 多機通信12.2.1 通信接
6、口2013/10/13 L912.2.2 通信協(xié)議 根據(jù)MCS-51串行口的多機通信能力,多機通信可以按照以下協(xié)議進(jìn)行: (1) 首先使所有從機的SM2位置1處于只接收地址幀的狀態(tài)。 (2) 主機先發(fā)送一幀地址信息,其中8位地址,第9位為地址/數(shù)據(jù)信息的標(biāo)志位,該位置1表示該幀為地址信息。 (3) 從機接收到地址幀后,各自將接收的地址與本機的地址比較。對于地址相符的那個從機,使SM2位清零,以接收主機隨后發(fā)來的所有信息;對于地址不符的從機,仍保持SM2=1,對主機隨后發(fā)來的數(shù)據(jù)不予理睬,直至發(fā)送新的地址幀。 2013/10/13 L10 (4) 當(dāng)從機發(fā)送數(shù)據(jù)結(jié)束后,發(fā)送一幀校驗和,并置第9位
7、(TB8)為1,作為從機數(shù)據(jù)傳送結(jié)束標(biāo)志。 (5) 主機接收數(shù)據(jù)時先判斷數(shù)據(jù)結(jié)束標(biāo)志(RB8),若RB8=1,表示數(shù)據(jù)傳送結(jié)束,并比較此幀校驗和,若正確,則會送正確信號00H,此信號令該從機復(fù)位(即重新等待地址幀);若校驗和出錯,則發(fā)送0FFH,令該從機重發(fā)數(shù)據(jù)。若接收幀的RB8=0,則原數(shù)據(jù)到緩沖區(qū),并準(zhǔn)備接收下幀信息。 (6) 若主機向從機發(fā)送數(shù)據(jù),從機在第(3)步中比較地址相符后,從機令SM2=0,同時把本站地址發(fā)回主機。作為應(yīng)答之后才能收到主機發(fā)送來的數(shù)據(jù)。其它從機(SM2=1),無法收到數(shù)據(jù)。2013/10/13 L11 (7) 主機收到從機的應(yīng)答地址后,確認(rèn)地址是否相符。如果地址不
8、符,發(fā)復(fù)位信號(數(shù)據(jù)幀中TB8=1);如果地址相符,則清TB8,開始發(fā)送數(shù)據(jù)。 (8) 從機接收到復(fù)位命令后回到監(jiān)聽地址狀態(tài)(SM2=1)。否則開始接收數(shù)據(jù)和命令。2013/10/13 L12 12.2.3 通 信 程 序 設(shè)主機發(fā)送的地址聯(lián)絡(luò)信號00H,01H,02H為從機設(shè)備地址,地址FFH是命令各從機恢復(fù)SM2為1的狀態(tài),即復(fù)位。主機的命令編碼為:01H 請求從機接收主機的數(shù)據(jù)命令;02H 請求從機向主機發(fā)送數(shù)據(jù)命令。 其它都按從機向主機發(fā)送數(shù)據(jù)命令02H對待。2013/10/13 L13從機的狀態(tài)字節(jié)格式為:ERR00000TRDYRRDYD7 D6 D5 D4 D3 D2 D1 D0
9、 RRDY=1:從機準(zhǔn)備好接收主機的數(shù)據(jù)。 TRDY=1:從機準(zhǔn)備好向主機發(fā)送數(shù)據(jù)。 ERR=1:從機接收到的命令是非法的。 通常從機以中斷方式控制和主機的通信。程序可分成主機程序和從機程序,約定一次傳送的數(shù)據(jù)為16個字節(jié),以02H地址的從機為例。2013/10/13 L14 多機通信-主機程序流程圖2013/10/13 L15主機程序如下:#include #define uchar unsigned char#define SLAVE 0 x02 /*從機地址*/#define BN 16uchar idata rbuf 16;uchar idata tbuf 16=master tran
10、smit;void err (void) SBUF=0 xff;while(TI!=1);TI=0;2013/10/13 L16uchar master (char addr, uchar command)uchar aa, i,p; while(1) SBUF=SLAVE; /* 發(fā)呼叫地址 */ while (TI!=1);TI=0; while (RI!=1);RI=0; /* 等待從機回答 */ if (SBUF!=addr) err( ); /* 若地址錯,發(fā)復(fù)位信號 */ else /* 地址相符 */ TB8=0; /* 清地址標(biāo)志 */ mand; /* 發(fā)命令 */ whil
11、e (TI!=1);TI=0; while (RI!=1);RI=0;2013/10/13 L17aa=SBUF; /* 接收狀態(tài) */ if(aa&0 x08)= =0 x08) TB8=1; err( ); /* 若命令未被接收,發(fā)復(fù)位信號 */ else if ( command= =0 x01) /* 是發(fā)送命令 */ if (aa&0 x01) = = 0 x01) /* 從機準(zhǔn)備好接收 */ do p=0; /* 清校驗和 */ for(i=0;iBN;i+) SBUF=tbufi; /* 發(fā)送一數(shù)據(jù) */ p+=tbufi;2013/10/13 L18 while(TI!=1);
12、TI=0; SBUF=p; /* 發(fā)送校驗和 */ while (TI= =0);TI=0; while (RI= =0);RI=0; while ( SBUF ! = 0 ); /* 接收不正確,重新發(fā)送 */ TB8=1; /* 置地址標(biāo)志 */ return(0) else if(aa&0 x02)= =0 x02) /* 是接收命令,從機準(zhǔn)備好發(fā)送 */2013/10/13 L19 while(1) p=0; /* 清校驗和 */ for(i=0;iBN;i+) while (RI! =1); RI=0; rbufi=SBUF; /* 接收一數(shù)據(jù) */ P+=rubfi; while(
13、RI= =0);RI=0; if(SBUF= =p) SBUF=0X00; /* 校驗和相同發(fā)00 */ while(TI= =0);TI=0; break; 2013/10/13 L20 else SBUF=0 xff; /* 校驗和不同發(fā)0FF,重新接收 */ while(TI= =0);TI=0; TB8=1; /* 置地址標(biāo)志 */ Retuen(0); 2013/10/13 L21void main (viod) TMOD=0 x20; /* T/C1定義為方式2 */ TL1=0 xfd;TH1=0 xfd; /* 置初值 */ PCON=0 x00; TR1=1; SCON=0
14、xf0; /* 串行口為方式3 */ master(SLAVE,0 x01); master( SLAVE,0 x02 ); 2013/10/13 L22 2013/10/13 L23從機程序如下: #include #define uchar unsigned char #define SLAVE 0 x02 #define BN 16 uchar idata trbuf16; uchar idata rebuf16; bit tready; bit rready; void main (void) 2013/10/13 L24 TMOD=0 x20; /*T/C1定義為方式2*/ TL1=
15、0 xfd; /*置初值*/ TH1=0 xfd; PCON=0 x00; TR1=1; SCON=0 xf0; /*串行口為方式3*/ ES=1;EA=1; /*開串行口中斷*/ while(1) tready=1; rready=1; /*假定準(zhǔn)備好發(fā)送和接收*/ 2013/10/13 L25 void ssio (void ) interrupt 4 using 1 void str(void); void sre(void); uchar a,i; RI=0; ES=0; /*關(guān)串行口中斷*/ if(SBUF! =SLAVE) ES=1;goto reti; /*非本機地址,繼續(xù)監(jiān)聽*
16、/ SM2=0 ; /* 取消監(jiān)聽狀態(tài) */ SBUF=SLAVE ; /* 從本地址發(fā)回 */2013/10/13 L26 while ( TI ! =1 ) ;TI =0 ; while ( RI !=1 ) ; RI =0 ; if ( RB8 = 1 ) SM2=1 ; ES=1 ;goto reti ; /* 是復(fù)位信號,恢復(fù)監(jiān)聽 */ a=SBUF ; /* 接收命令 */ if (a =0 x01 ) /* 從主機接收的數(shù)據(jù) */ if ( rready = =1 ) SBUF =0 x01 ; / * 接收準(zhǔn)備好發(fā)狀態(tài) */ else SBUF=0 x00 ; while (
17、TI ! =1 ) ; TI=0 ; while ( RI ! =1 ) ; RI =0 ; if ( RB8= =1 ) SM2 =1 ;ES =1 ; goto reti ; sre( ) ; /* 接收數(shù)據(jù) */ 2013/10/13 L27else if( a= 0 x02 ) /* 從機向主機發(fā)送數(shù)據(jù)*/ if ( tready = =1 ) SBUF =0 x02 ; /* 發(fā)送準(zhǔn)備好發(fā)狀態(tài) */ else SBUF=0 x00 ; while ( TI ! = 1 ) ; TI =0 ; while ( RI ! =1 ) ;RI =0 ; if ( RB8 = =1 ) SM2
18、 =1 ; ES =1 ; goto reti ; str ( ) ; / * 發(fā)送數(shù)據(jù) */ 2013/10/13 L28else SBUF = 0 x80 ; /* 命令非法 ,發(fā)狀態(tài) */ while ( TI ! =1 ) ; TI =0 ; SM2 =1 ; ES =1 ; /* 恢復(fù)監(jiān)聽 */ reti:; void str ( void ) /* 發(fā)數(shù)據(jù)塊 */ uchar p ,i ; tready =0 ; do p=0 ; /* 清校驗和 */ 2013/10/13 L29 for ( i= 0; iBN ; i+ ) SBUF= trbuf i ; /* 發(fā)送一數(shù)據(jù) */ p+=trbufi ; while ( TI !=1 ) ; TI =0 ; SUBF= p ; /* 發(fā)送校驗和 */ while ( TI = =0 ) ; TI =0; while ( RI= =0 ); RI =0 ; while ( SBUF !=0 ) ; /* 主機接收不正確,重新發(fā)送 */ SM2=1 ; ES = 1 ; 2013/10/13 L30void sre ( void ) / * 接收數(shù)據(jù)塊 */ uchar p , i ; rready = 0 ; while ( 1 ) p= 0 ; /* 清校驗和 */
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度辦事處新能源汽車推廣合作合同3篇
- 2024版固定期限員工勞動協(xié)議格式版B版
- 研學(xué)產(chǎn)品開發(fā)的路徑設(shè)計與策略分析
- 2024旅行社與旅游紀(jì)念品廠商合作協(xié)議范本3篇
- 2024年高速公路建設(shè)融資合同
- 無人化農(nóng)場項目計劃書
- 2024年湘教新版一年級語文下冊階段測試試卷含答案
- 推動中小金融機構(gòu)改革的風(fēng)險應(yīng)對策略與實施路徑
- 2025年魯教五四新版七年級生物上冊月考試卷
- 2025年蘇人新版必修3英語下冊月考試卷
- PLC應(yīng)用技術(shù)(三菱機型)三菱大中型PLC
- 《用戶體驗設(shè)計導(dǎo)論》
- 美團(tuán)外賣運營知識試題
- 航空概論學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 業(yè)務(wù)流程可視化改善
- 期末復(fù)(知識清單)2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 45001-2020職業(yè)健康安全管理體系危險源識別與風(fēng)險評價及應(yīng)對措施表(各部門)
- 多層鋼結(jié)構(gòu)廠房施工組織設(shè)計#廣西#雙跨門式鋼結(jié)構(gòu)
- 人教版六年級科學(xué)重點知識點
- 春節(jié):藝術(shù)的盛宴
- 煙草公司化肥采購項目-化肥投標(biāo)文件(技術(shù)方案)
評論
0/150
提交評論