版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)三串行口通信實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容 據(jù)圖1所示電路,兩個(gè)同學(xué)為一組分為甲方、乙方,所有實(shí)驗(yàn)都采用方式3,偶校驗(yàn),波特率為2400bit/s,采用T1作波特率發(fā)生器,均采用中斷發(fā)送和接收。按鍵值a:按K1,a=0x01;按K2,a=0x02;按K3,a=0x04;按K4,a=0x08。1、單向通信 向甲方連續(xù)不斷地發(fā)送變量a的值,未按鍵,a=0x0f,按鍵后根據(jù)按鍵確定a值;并將a的值取反從P0口輸出,控制D0、D1、D2、D3相應(yīng)點(diǎn)亮。乙方接收到數(shù)據(jù)并偶校驗(yàn)正確后,將接收數(shù)據(jù)取反從P0口輸出,控制D0、D1、D2、D3相應(yīng)點(diǎn)亮。2、雙向通信 甲方連續(xù)不斷地發(fā)送變量a的值,未按鍵,a=0x0f,按鍵后根據(jù)按鍵確定a值;乙方未按鍵不發(fā)送,按鍵后將a*16發(fā)送;甲乙雙方都將發(fā)送數(shù)據(jù)與接收數(shù)據(jù)相或后再取反,從P0口輸出控制D0—D7相應(yīng)點(diǎn)亮。3、間隔發(fā)送 未按鍵,甲方不發(fā)送數(shù)據(jù),按鍵后甲方每隔50ms連續(xù)發(fā)送4個(gè)字節(jié):0xff、a、a、a。乙方只在收到甲方數(shù)據(jù)0xff后的3個(gè)數(shù)據(jù)并驗(yàn)證相同時(shí),才將接收數(shù)據(jù)*16發(fā)送。甲乙雙方都將發(fā)送數(shù)據(jù)與接收數(shù)據(jù)相或后,從P0口輸出控制D0—D7相應(yīng)點(diǎn)亮。二、實(shí)驗(yàn)方案 本人負(fù)責(zé)編程和處理乙機(jī)的編程和實(shí)驗(yàn)。1、總體方案設(shè)計(jì) 所用硬件:AT89C52、BUTTON、LED、10BQ040、電源 共有4個(gè)按鍵K1、K2、K3、K4,分別連接到單片機(jī)P2.0、P2.1、P2.2、P2.3引腳,按鍵后對(duì)應(yīng)引腳為低電平,通過4個(gè)二極管5連接到P3.2(外部中斷0),通過通信接口排插將甲機(jī)的TXD、RXD連接到乙機(jī)的RXD、TXD。 軟件設(shè)計(jì): 1、 按鍵處理 采用中斷處理按鍵,甲方在外部中斷0服務(wù)程序中:判斷按鍵確定發(fā)送數(shù)據(jù),并判斷是否開始發(fā)送,若未開始發(fā)送,設(shè)置TI=1。 2、 雙向通信 串行口中斷后要注意判斷是發(fā)送中斷(TI=1)還是接收中斷(RI=1),判斷完后要清除標(biāo)志。 發(fā)送數(shù)據(jù)和接收數(shù)據(jù)函數(shù)voidsend(uchardat){ ACC=dat; TB8=P; //將奇偶校驗(yàn)位作為第9位數(shù)據(jù)發(fā)送,采用偶校驗(yàn) SBUF=ACC; }ucharreceive(){ ACC=SBUF; //將接收緩沖器的數(shù)據(jù)存于ACC if(RB8==P){ //只有奇偶校驗(yàn)成功才能往下執(zhí)行,接收數(shù)據(jù) returnACC; //返回接收緩沖器的數(shù)據(jù) }else{ return0x00; } }主要算法1(單向通信和雙向通信實(shí)驗(yàn)項(xiàng)目合一):1、全局變量的定義:uchara; //記錄發(fā)送數(shù)據(jù)ucharb; //記錄接收數(shù)據(jù)2、外部中斷0鍵控函數(shù)(用來發(fā)送數(shù)據(jù)給甲機(jī)):voidkeyControl()interrupt0{ if(INT0==0) { //K1鍵按下,a=0x01 if(K1==0){ a=0x01*16; } //K2鍵按下,a=0x02 if(K2==0){ a=0x02*16; } //K3鍵按下,a=0x04 if(K3==0){ a=0x04*16; } //K4鍵按下,a=0x08 if(K4==0){ a=0x08*16; } } TI=1;}3、串行口中斷函數(shù):voidES_int()interrupt4{ //串行口中斷函數(shù) if(RI){ RI=0; b=receive(); } if(TI){ TI=0; send(a); } }主要算法2(間隔發(fā)送):1、全局變量的定義:uchara; //發(fā)送數(shù)據(jù)intsend_time=0; //記錄發(fā)送的次數(shù)ucharb; //接收數(shù)據(jù)intreceive_time=0; //記錄接收的次數(shù)ucharc[3]; //判斷接收值是否相同2、串行口中斷函數(shù):voidES_int()interrupt4{ //串行口中斷函數(shù) if(RI){//接收中斷 RI=0; if(receive_time==1){ if(receive()==0xff){//判斷第一次接收的數(shù)據(jù)是否為0xff,是繼續(xù)接收后面的三個(gè)數(shù)據(jù),否重新接收第一個(gè)數(shù)據(jù) receive_time++; }else{receive_time=1;} }elseif(receive_time>=2&&receive_time<=4){ if(receive_time==2){//接收第一位個(gè)數(shù)據(jù) c[0]=receive(); } if(receive_time==3){//接收第二個(gè)數(shù)據(jù) c[1]=receive(); } if(receive_time==4){//接收第三個(gè)數(shù)據(jù) c[2]=receive(); if(c[0]==c[1]&&c[1]==c[2]){//判斷后三個(gè)數(shù)據(jù)是否相同,相同就把接收到的數(shù)據(jù)*16然后發(fā)送給甲機(jī) b=c[0];a=b*16;send_time=1;TI=1; } }receive_time++; } } if(TI){//發(fā)送中斷 TI=0; if(send_time==1){send(0xff); }elseif(send_time>=2&&send_time<=4){send(a);} if(send_time==4)//發(fā)送成功顯示LED light(~(a|b));send_time++; } }2、實(shí)驗(yàn)原理圖圖2-1實(shí)驗(yàn)原理圖3、程序流程圖圖2-2雙向通信程序流程圖圖2-3間隔發(fā)送程序流程圖三、源程序雙向通信程序源代碼:#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint//#defineTH(a)(65536-a)/256 //定義裝入定時(shí)器高8位的時(shí)間常數(shù)//#defineTL(a)(65536-a)%256 //定義裝入定時(shí)器低8位的時(shí)間常數(shù)sbitp=PSW^0;sbitK1=P2^0; sbitK2=P2^1;sbitK3=P2^2;sbitK4=P2^3;uchara; //記錄發(fā)送數(shù)據(jù)ucharb; //記錄接收數(shù)據(jù)voidlight(uchardat){ //亮燈函數(shù) P0=dat; }voidsend(uchardat){ ACC=dat; TB8=P; //將奇偶校驗(yàn)位作為第9位數(shù)據(jù)發(fā)送,采用偶校驗(yàn) SBUF=ACC; }ucharreceive(){ ACC=SBUF; //將接收緩沖器的數(shù)據(jù)存于ACC if(RB8==P){ //只有奇偶校驗(yàn)成功才能往下執(zhí)行,接收數(shù)據(jù) returnACC; //返回接收緩沖器的數(shù)據(jù) }else{ return0x00; } }voidmain(){ TMOD=0x20; //設(shè)置定時(shí)器T1為方式2定時(shí) IE=0x91; //總中段開,允許串行、外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式 SCON=0xd0; //設(shè)置串口為方式3并允許串口接收數(shù)據(jù) PCON=0x00; //SMOD=0; TH1=0xf4;TL1=0xf4; //給定時(shí)器T1賦初值,波特率設(shè)置為2500 TR1=1; //啟動(dòng)定時(shí)器T1 while(1){ light(~(a|b)); //將發(fā)送數(shù)據(jù)和接收數(shù)據(jù)相或后取反顯示 }}voidES_int()interrupt4{ //串行口中斷函數(shù) if(RI){ RI=0; b=receive(); } if(TI){ TI=0; send(a); } }voidkeyControl()interrupt0{ if(INT0==0) { //K1鍵按下,a=0x01 if(K1==0){ a=0x01*16; } //K2鍵按下,a=0x02 if(K2==0){ a=0x02*16; } //K3鍵按下,a=0x04 if(K3==0){ a=0x04*16; } //K4鍵按下,a=0x08 if(K4==0){ a=0x08*16; } } TI=1;}間隔發(fā)送程序源代碼:#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint#defineTH(a)(65536-a)/256 //定義裝入定時(shí)器高8位的時(shí)間常數(shù)#defineTL(a)(65536-a)%256 //定義裝入定時(shí)器低8位的時(shí)間常數(shù)sbitp=PSW^0;sbitK1=P2^0;sbitK2=P2^1;sbitK3=P2^2;sbitK4=P2^3;uchara; //發(fā)送數(shù)據(jù)intsend_time=0; //記錄發(fā)送的次數(shù)ucharb; //接收數(shù)據(jù)intreceive_time=0; //記錄接收的次數(shù)ucharc[3]; //判斷接收值是否相同voidlight(uchardat){ //亮燈函數(shù) P0=dat; }voidsend(uchardat){ ACC=dat; TB8=P; //將奇偶校驗(yàn)位作為第9位數(shù)據(jù)發(fā)送,采用偶校驗(yàn) SBUF=ACC; }ucharreceive(){ ACC=SBUF; //將接收緩沖器的數(shù)據(jù)存于ACC if(RB8==P){ //只有奇偶校驗(yàn)成功才能往下執(zhí)行,接收數(shù)據(jù) returnACC; //返回接收緩沖器的數(shù)據(jù) }else{ return0x00; } }voidmain(){ TMOD=0x21; //設(shè)置定時(shí)器T1為方式2定時(shí),T0為方式1定時(shí) IE=0x93; //總中段開,允許串行、外部中斷0、定時(shí)器T0中斷 IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式 SCON=0xd0; //設(shè)置串口為方式3并允許串口接收數(shù)據(jù) PCON=0x00; //SMOD=0; TH1=0xf4;TL1=0xf4; //給定時(shí)器T1賦初值,波特率設(shè)置為2500 TR1=1; //啟動(dòng)定時(shí)器T1 TH0=TH(50000);TL1=TL(50000);//給定時(shí)器T0賦初值,50ms TR0=1; //定時(shí)器T0初始為開啟狀態(tài) while(1){ }}voidES_int()interrupt4{ //串行口中斷函數(shù) if(RI){//接收中斷 RI=0; if(receive_time==1){ if(receive()==0xff){//判斷第一次接收的數(shù)據(jù)是否為0xff,是繼續(xù)接收后面的三個(gè)數(shù)據(jù),否重新接收第一個(gè)數(shù)據(jù) receive_time++; }else{ receive_time=1; } }elseif(receive_time>=2&&receive_time<=4){ if(receive_time==2){//接收第一位個(gè)數(shù)據(jù) c[0]=receive(); } if(receive_time==3){//接收第二個(gè)數(shù)據(jù) c[1]=receive(); } if(receive_time==4){//接收第三個(gè)數(shù)據(jù) c[2]=receive(); if(c[0]==c[1]&&c[1]==c[2]){//判斷后三個(gè)數(shù)據(jù)是否相同,相同就把接收到的數(shù)據(jù)*16然后發(fā)送給甲機(jī) b=c[0]; a=b*16; send_time=1; TI=1; } } receive_time++; } } if(TI){//發(fā)送中斷 TI=0; if(send_time==1){ send(0xff); }elseif(send_time>=2&&send_time<=4){ send(a); } if(send_time==4)//發(fā)送成功顯示LED light(~(a|b)); send_time++; } }voidT0_int()interrupt1{ receive_time=1; RI=1; TH0=TH(50000);TL1=TL(50000); }voidkeyControl()interrupt0{ /*if(INT0==0) { //K1鍵按下,a=0x01 if(K1==0){ a=0x01*16; } //K2鍵按下,a=0x02 if(K2==0){ a=0x02*16; } //K3鍵按下,a=0x04 if(K3==0){ a=0x04*16; } //K4鍵按下,a=0x08 if(K4==0){ a=0x08*16; } }*/}四、實(shí)驗(yàn)結(jié)果單向通信及雙向通信:1、開機(jī)即接收來自甲機(jī)發(fā)送的默認(rèn)數(shù)據(jù)0x0f,取反通過LED輸出(如圖4-1)圖4SEQ圖\*ARABIC\s11接收甲機(jī)發(fā)送的默認(rèn)數(shù)據(jù)2、接收到來自甲機(jī)的數(shù)據(jù)0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湖北電力建設(shè)第一工程公司招聘筆試參考題庫含答案解析
- 2025年度個(gè)人信用擔(dān)保裝修借款合同范本3篇
- 2025年個(gè)人金融理財(cái)產(chǎn)品投資合同4篇
- 2025年度油氣輸送鋼管租賃合作合同2篇
- 2025年度個(gè)人農(nóng)田科技種植項(xiàng)目合作協(xié)議4篇
- 2025版二手房免稅托管與租賃一體化服務(wù)合同
- 2025版協(xié)議離婚全程法律服務(wù)及婚姻財(cái)產(chǎn)分割合同3篇
- 2025年度二零二五年度鋼廠廢鋼再生產(chǎn)品銷售合同2篇
- 2025版新能源電池生產(chǎn)承包經(jīng)營合同示范文本3篇
- 2025-2030全球叉車機(jī)器人行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- (完整版)高考英語詞匯3500詞(精校版)
- 我的家鄉(xiāng)瓊海
- (2025)專業(yè)技術(shù)人員繼續(xù)教育公需課題庫(附含答案)
- 《互聯(lián)網(wǎng)現(xiàn)狀和發(fā)展》課件
- 【MOOC】計(jì)算機(jī)組成原理-電子科技大學(xué) 中國大學(xué)慕課MOOC答案
- 2024年部編版八年級(jí)語文上冊(cè)電子課本(高清版)
- 2024年上海健康醫(yī)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫及答案解析
- 2024年湖北省武漢市中考語文適應(yīng)性試卷
- 2024-2025學(xué)年廣東省大灣區(qū)40校高二上學(xué)期聯(lián)考英語試題(含解析)
- 非新生兒破傷風(fēng)診療規(guī)范(2024年版)解讀
- 2024-2030年電炒鍋項(xiàng)目融資商業(yè)計(jì)劃書
評(píng)論
0/150
提交評(píng)論