2020年紅外遙控實驗精品版.doc_第1頁
2020年紅外遙控實驗精品版.doc_第2頁
2020年紅外遙控實驗精品版.doc_第3頁
2020年紅外遙控實驗精品版.doc_第4頁
2020年紅外遙控實驗精品版.doc_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精選文檔紅外遙控通信系統(tǒng)現(xiàn)在家電產(chǎn)品大部分配有紅外線遙控器,在 PC上也有紅外傳輸?shù)慕涌?,有些鼠標加了紅外控制接口, 變成了無線鼠標。 所以說使用紅外已經(jīng)是一種非常廣泛的通信方式。紅外通信 知識的概述。實驗內(nèi)容簡介實驗?zāi)康?、掌握紅外通信系統(tǒng)的知識。2、學(xué)會對接收到的紅外信號進行解碼操作。3、學(xué)會如何使用單片機來控制紅外發(fā)射器發(fā)射紅外信號。4、了解 NEC碼的編碼方式等相關(guān)知識。實驗要求1、使用開發(fā)板上的紅外發(fā)射器 TSAL6200模擬一個采用 NEC碼的紅外遙控器進行紅外信號的發(fā)射。2、紅外的編碼使用開發(fā)板上的矩陣鍵盤實現(xiàn)(按鍵掃描實驗 )。3、開發(fā)板通過紅外接收模塊( HS0038)完成紅

2、外數(shù)據(jù)的接受,同時進行解碼等操作。4、MCU對解碼后的數(shù)據(jù)進行處理,將其顯示在數(shù)碼管上。簡單硬件需求分析1、一般的紅外通信系統(tǒng)都由發(fā)射與接收兩個部分組成,所以我們需要一個發(fā)送紅外信號的發(fā)射器和一個紅外接收器, 由于我們需要對接收到的紅外信號進行解碼,然后送給單片機進行處理, 所以選擇的接收器應(yīng)該可以解碼出單片機可以直接處理的數(shù)據(jù)。2、選擇一個 MCU對紅外發(fā)射器進行控制,得到想要的紅外數(shù)據(jù)。3、由于我們實驗需要顯示接收到的紅外數(shù)據(jù),所以需要一個顯示器件,數(shù)碼管就能夠滿足顯示的需求。開發(fā)板設(shè)計HS0038模塊:HS0038是一個直接輸出MCU可以處理的數(shù)字信號,所以在電路連接中,可以直接將它的

3、OUT引腳接在單片機的 I/O 口上,進行紅外數(shù)據(jù)的處理, 但是在我們的開發(fā)板上,不僅接在了 I/O 口上,同時也將其接在了 8259A 中斷控制器上, 這樣做,可以讓我們在編寫程序時有多種做法。精選文檔精選文檔這里的 OUT引腳默認情況下為高電平的,這是上拉電阻所起到的作用。TSAL6200模塊 :該器件是一個紅外發(fā)射器,發(fā)射器的一端接在5V 電源上,另一段接在PNP型三極管的發(fā)射極上,三極管主要起到一個電流放大的作用。這里的 IR_OUT信號通過電阻接在電源上,除了讓 IR_OUT信號線在默認情況下輸出高電平的作用外( IR_OUT=1紅外發(fā)射管不工作),還起到了分壓的作用,因為 TSAL

4、6200的正向壓降只有 1.35V(詳細內(nèi)容見 TSAL6200)。在默認情況下,由于 IR_OUT為高電平,所以三極管的基極是高電平,此時三極管不導(dǎo)通, TSAL6200沒有工作,不會發(fā)射紅外信號,只有當 IR_OUT信號輸出低精選文檔精選文檔電平時,才會有紅外信號發(fā)出。8259A中斷控制器模塊:8259A中斷控制器是分為奇地址以及偶地址( 主要通過 8259A的 A0 引腳進行控制 ) :它們分別是 0x6001、 0x6000。由于這里我們只用到單片 8259A,所以 SP/EN引腳接高電平表示為單片,CAS0CAS2是級聯(lián)使用的,單片 8259A時這些引腳都無用,所以直接懸空了。1、I

5、NT 引腳:這里我們用 8051 控制 8259,由于 8259 有中斷請求時 INT 引腳變?yōu)楦唠娖?,?8051 中斷外部中斷只有下降沿和低電平觸發(fā)方式,為了滿足兩者之間的兼容性,使用該信號與地線接在或非門上,實現(xiàn)一個反向的功能。2、INTA 引腳處理:由于8051 沒有中斷應(yīng)答引腳,所以這里我們要借助8051 的RD引腳和 8259 的 INT 引腳模擬出中斷應(yīng)答信號,由于中斷應(yīng)答也是變?yōu)榈碗娖接行В?8051 的 RD為低電平有效,開發(fā)板的設(shè)計如下:RD信號線通過一個與非門之后,再和INT 一起接在另一個與非門的輸入端,然后與非門的輸出端接在8259A的 26 號引腳 INTA#上作

6、為中斷響應(yīng)的應(yīng)答信號。(注:由于需要將 RD信號線取反,我們使用一個與非門實現(xiàn)了一個非門的功能,這樣做可以節(jié)約成本,因為一個74LS00芯片上包含了多個與非門。與非門的輸精選文檔精選文檔入引腳接相同的信號就相當是給這個信號取反。)各個部件與 MCU的連接:IR_IN (P1.2 )與紅外接收器的 OUT引腳相連,單片機可從該引腳獲取紅外數(shù)據(jù)信息; IR_OUT( P1.3 與紅外發(fā)射器相連)單片機對此引腳進行控制,可以改變TSAL6200的工作狀態(tài),以達到進行紅外數(shù)據(jù)的發(fā)送功能 ;P3.3 引腳是單片機的外部中斷 1 引腳,與中斷控制器 8259A相連 , 單片機的 P0 口是 8 位數(shù)據(jù)的傳

7、輸線,分別與 8259A的數(shù)據(jù)線相連; 單片機的 P1.0 和 P1.1 用來當 I2C 總線,使用軟件進行 I2C 的模擬,詳細內(nèi)容可見 IIC 。精選文檔精選文檔程序流程分析1、先進行初始化操作,包括數(shù)碼管驅(qū)動芯片CH452、數(shù)碼管、定時器 0、定時器1、8259A中斷控制器的初始化。2、當有按鍵時,會產(chǎn)生 8259A 中斷,在中斷服務(wù)函數(shù)中,把 1 賦給 Flag1 ,用來標志有鍵按下, 并且進行按鍵值的查找, 并用一個全局變量 Keycode 記錄按鍵值。3、主程序中檢測到Flag1=1 后(為了不影響接收程序,此時先關(guān)閉按鍵中斷的允許位,等本次發(fā)送過程結(jié)束再打開允許位),就會調(diào)用紅外

8、發(fā)送程序,發(fā)送的內(nèi)容為引導(dǎo)碼、 地址碼以及命令, 對于同一個遙控器件來說, 它們的地址碼應(yīng)該是不變的,我們這里的地址碼應(yīng)該為0x40bd。(如下圖所示:)從圖中我們可以看出,命令碼( command,data code)發(fā)送兩次,第一次發(fā)送的是原碼,第二次發(fā)送的是反碼, 這樣是為了提高紅外傳輸過程的可靠性。 需要注意的是,不管是地址碼還是數(shù)據(jù)碼,都是先發(fā)送最低有效位。4、在發(fā)送程序中,先發(fā)送引導(dǎo)碼,由 9ms的高電平和 4.5ms 的低電平組成,由下圖所示:引導(dǎo)碼發(fā)送完畢之后,緊接著就會發(fā)送 4 個字節(jié)的數(shù)據(jù),包括地址碼和命令碼,數(shù)據(jù)編碼格式如下圖所示:0.56ms 的高電平和 0.56ms

9、的高電平代表數(shù)據(jù) 0,0.56ms 的高電平和 1.12ms 的低電平代表數(shù)據(jù) 1。5、接收過程應(yīng)該和發(fā)送過程是 同時 的,在紅外發(fā)送程序執(zhí)行的過程中,當紅外接收器 HS0038接收到紅外信號后,在紅外信號出現(xiàn)上升沿(程序中設(shè)置了精選文檔精選文檔IT1=1 ),會產(chǎn)生 8259A 中斷,此時我們可以在中斷服務(wù)程序中進行解碼操作,獲取紅外數(shù)據(jù)。6、解碼操作時,先進行引導(dǎo)碼的判斷,由于 HS0038會將接收到的紅外信號反向,所以引導(dǎo)碼就變成了 9ms的低電平和 4.5ms 的高電平,第一次產(chǎn)生 8259A 中斷是在 9ms之后,下一次中斷產(chǎn)生則是在發(fā)送數(shù)據(jù)位的 0.56ms 之后,所以兩次中斷之間

10、的時間間隔應(yīng)該為 4.5ms 左右,如果時間在這個范圍之內(nèi), 則說明引導(dǎo)碼判斷成功,同樣的方法我們可以判斷產(chǎn)生兩次中斷時間間隔來判斷接收到的數(shù)據(jù)。程序代碼分析/*頭文件 */#include #include #include #include 8259a.h#include ch452.h/*變量的定義 */sbit Ir_out=P13;/紅外發(fā)射引腳unsigned int Count1=0;/用于計數(shù)、判斷時間使用精選文檔精選文檔unsigned char Ir_Code=0x00,Flag=0,Keycode=0xff,Flag1=0;/Flag1用來標志有按鍵按下了,F(xiàn)lag 用來

11、判斷是否需要發(fā)送紅外載波信號,Keycode 用來記錄按鍵值LeadCode=0,Data=0x00,DataNum=0,FirstNum=0,ReceiveData8=0;/LeadCode 用來標記引導(dǎo)碼判斷是否成功,Data 用來接收紅外數(shù)據(jù), DataNum表示已經(jīng)接收了多少位數(shù)據(jù)了,F(xiàn)irstNum 表示是否為第一次產(chǎn)生中斷,ReceiveData 用來存儲數(shù)碼管顯示的數(shù)據(jù)unsigned char Code4=0x02,0xbd;/用來存放將要發(fā)送的數(shù)據(jù),前兩位為地址碼,固定的,后兩位數(shù)據(jù)為命令碼,互為相反unsigned char Keytable44 = 0x0f, 0x0e,

12、 0x0d, 0x0c,0x0b, 0x0a, 0x09, 0x08,0x07, 0x06, 0x05, 0x04,0x03, 0x02, 0x01, 0x00;/鍵值查找表/*延時函數(shù) */void Delayus(unsigned int x)while(x-);/*/*紅外發(fā)射的部分 */void Send_Data(unsigned char Data)/發(fā)送八位數(shù)據(jù)的函數(shù)unsigned char i;for(i=0;i8;i+)Flag=1;/置 Flag 為 1,表明需要發(fā)送紅外載波TR0=1;/打開定時器 0Count1=0;/計數(shù)值賦為 .0while(Count120);/

13、判斷是否已經(jīng)發(fā)送了0.56ms 的高電平Flag=0;Ir_out=1;Count1=0;/此時不需要再發(fā)送紅外載波了, Flag=0精選文檔精選文檔if(Data&0x01)/取數(shù)據(jù)的最低位進行發(fā)送while(Count163);/數(shù)據(jù)為 1 則發(fā)送 1.68ms的低電平elsewhile(Count11;/要傳送的數(shù)據(jù)右移,取下一位void Send(unsigned char * Code)/開始發(fā)送,先發(fā)引導(dǎo)碼Flag=1;/打開定時器 0 產(chǎn)生 38KHZ的紅外載波并計數(shù)TR0=1;Count1=0;while(Count1345);/判斷是否已經(jīng)發(fā)送了9ms的高電平Flag=0;/

14、此時發(fā)送低電平,定時器0只用來定時作用Ir_out=1;/關(guān)閉紅外發(fā)射Count1=0;while(Count14;if(ReceiveData0!=0x02|ReceiveData1!=0x00)/由于前十六位為地址碼, 對于同一個發(fā)射器, 應(yīng)該將其的地址碼設(shè)為一個固定不變的,解碼時,判斷接收到的數(shù)據(jù)是否與規(guī)定的地址碼相同, 不同則表示接收到的數(shù)據(jù)錯誤,將變量賦為初始值,準備接收下一次的紅外信號LeadCode=0;Data=0x00;DataNum=0;FirstNum=0;break;case 16:ReceiveData2=Data&0x0f;ReceiveData3=Data4;精選

15、文檔精選文檔if(ReceiveData2!=0x0d|ReceiveData3!=0x0b)LeadCode=0;Data=0x00;DataNum=0;FirstNum=0;break;case 24:ReceiveData4=Data&0x0f;ReceiveData5=Data4;break;case 32:ReceiveData6=Data&0x0f;/ 判斷命令碼是否相反,不是則不正確ReceiveData7=Data4;if(ReceiveData4!=ReceiveData6|ReceiveData5!=ReceiveData7)DataNum=0;Data=0x00;Firs

16、tNum=0;LeadCode=0;break;void Decode(void)/解碼函數(shù)TR1=0;/此時關(guān)閉定時器switch(LeadCode) /在沒有判斷引導(dǎo)碼的情況下,先判斷引導(dǎo)碼是否正確case 0:if(TH1=0x12&TH1=0x03&TH1=1;DataNum+;精選文檔精選文檔else if(TH1=0x06&TH1=1;Data|=0x80;DataNum+;else /兩個時間范圍都不是,則表示接收到的數(shù)據(jù)不正確,重新開DataNum=0;FirstNum=0;LeadCode=0;Receive();break;if(DataNum=32) /當數(shù)據(jù)接收完之后,

17、將變量賦為原值,以便下一次接收DataNum=0;FirstNum=0;LeadCode=0;TH1=0x00;/判斷一次數(shù)據(jù)之后,/TH1 、TL1 賦為 0x00,重新進行計數(shù),用于下次判斷時間TL1=0x00;TR1=1;/*/*初始化 */void Init8259a()/8259A的初始化ADR_8259AE=ICW1;/寫入初始化命令字ADR_8259AO=ICW2;ADR_8259AO=ICW4;ADR_8259AO=OCW1;/寫入操作命令字ADR_8259AE=OCW2;void Init()/初始化函數(shù)Init8259a();/調(diào)用 8259A中斷控制器的初始化TMOD=0

18、x12;/定時器 0 工作方式 2、計時,定時器1 工作方式 1、計時TH0=230;/定時器 0 初始值為 230,即 26us 中斷發(fā)生一次TL0=230;TH1=0x00;/定時器 1 的初始值TL1=0x00;ET0=1;/定時器中斷允許位打開EX1=1;/外部中斷 1 允許精選文檔精選文檔IT1=1;/外部中斷 1 為上下降沿觸發(fā)EA=1;/總中斷允許位打開/*/*主程序 */void main()CH452_Write(CH452_SYSON2); / 打開 CH452的數(shù)碼管顯示和按鍵掃描的功能CH452_Write(CH452_BCD);/啟動 CH452的自動解碼功能CH45

19、2_Write(CH452_DIG0 | 0); /數(shù)碼管初始顯示 0Init();/調(diào)用初始化函數(shù)Delayus(500);/延時一段時間while(1)Delayus(100);if(Flag1) /已經(jīng)有按鍵被按下了,準備發(fā)送紅外數(shù)據(jù)ADR_8259AO=0xfd; /寫 OCW1此時不再接收按鍵的中斷Code2=Keycode; /命令碼的原碼Code3=Keycode; /命令碼的反碼Send(Code); /調(diào)用紅外發(fā)送函數(shù),傳遞的參數(shù)為數(shù)據(jù)的首地址Display();/顯示內(nèi)容ADR_8259AO=0xfB;/打開 8259A 的按鍵中斷,關(guān)閉 8259A 的紅外/中斷Flag1=0;/清除按鍵標志位Delayus(500);/*中斷服務(wù)函數(shù) */void Timer1_Isr(void) interrupt 1/定時器 0 中斷服務(wù)程序,產(chǎn)生/38KHZ 的紅外信號Count1+;/用于計數(shù)、判斷時間if(Flag)精選文檔精選文檔Ir_out=0;_no

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論