紅外遙控實(shí)驗(yàn)_第1頁(yè)
紅外遙控實(shí)驗(yàn)_第2頁(yè)
紅外遙控實(shí)驗(yàn)_第3頁(yè)
紅外遙控實(shí)驗(yàn)_第4頁(yè)
紅外遙控實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、的I/O口上,進(jìn)行紅外數(shù)據(jù)的處理,但是在我們的開(kāi)發(fā)板上,不僅接在了I/O口上,同時(shí)也將其接在了8259A中斷控制器上,這樣做,可以讓我們?cè)诰帉懗绦驎r(shí)有多種做法。這里的OUT引腳默認(rèn)情況下為高電平的,這是上拉電阻所起到的作用。· TSAL6200模塊:該器件是一個(gè)紅外發(fā)射器,發(fā)射器的一端接在5V電源上,另一段接在PNP型三極管的發(fā)射極上,三極管主要起到一個(gè)電流放大的作用。這里的IR_OUT信號(hào)通過(guò)電阻接在電源上,除了讓IR_OUT信號(hào)線在默認(rèn)情況下輸出高電平的作用外(IR_OUT=1紅外發(fā)射管不工作),還起到了分壓的作用,因?yàn)門SAL6200的正向壓降只有1.35V(詳細(xì)內(nèi)容見(jiàn)TSAL

4、6200)。在默認(rèn)情況下,由于IR_OUT為高電平,所以三極管的基極是高電平,此時(shí)三極管不導(dǎo)通,TSAL6200沒(méi)有工作,不會(huì)發(fā)射紅外信號(hào),只有當(dāng)IR_OUT信號(hào)輸出低電平時(shí),才會(huì)有紅外信號(hào)發(fā)出。· 8259A中斷控制器模塊:8259A中斷控制器是分為奇地址以及偶地址(主要通過(guò)8259A的A0引腳進(jìn)行控制):它們分別是0x6001、0x6000。由于這里我們只用到單片8259A,所以SP/EN引腳接高電平表示為單片,CAS0CAS2是級(jí)聯(lián)使用的,單片8259A時(shí)這些引腳都無(wú)用,所以直接懸空了。1、INT引腳:這里我們用8051控制8259,由于8259有中斷請(qǐng)求時(shí)INT引腳變?yōu)楦唠娖?/p>

5、,而8051中斷外部中斷只有下降沿和低電平觸發(fā)方式,為了滿足兩者之間的兼容性,使用該信號(hào)與地線接在或非門上,實(shí)現(xiàn)一個(gè)反向的功能。2、INTA引腳處理:由于8051沒(méi)有中斷應(yīng)答引腳,所以這里我們要借助8051的RD引腳和8259的INT引腳模擬出中斷應(yīng)答信號(hào),由于中斷應(yīng)答也是變?yōu)榈碗娖接行?,?051的RD為低電平有效,開(kāi)發(fā)板的設(shè)計(jì)如下:RD信號(hào)線通過(guò)一個(gè)與非門之后,再和INT一起接在另一個(gè)與非門的輸入端,然后與非門的輸出端接在8259A的26號(hào)引腳INTA#上作為中斷響應(yīng)的應(yīng)答信號(hào)。(注:由于需要將RD信號(hào)線取反,我們使用一個(gè)與非門實(shí)現(xiàn)了一個(gè)非門的功能,這樣做可以節(jié)約成本,因?yàn)橐粋€(gè)74LS00

6、芯片上包含了多個(gè)與非門。與非門的輸入引腳接相同的信號(hào)就相當(dāng)是給這個(gè)信號(hào)取反。)各個(gè)部件與MCU的連接:IR_IN(P1.2)與紅外接收器的OUT引腳相連,單片機(jī)可從該引腳獲取紅外數(shù)據(jù)信息;IR_OUT(P1.3與紅外發(fā)射器相連)單片機(jī)對(duì)此引腳進(jìn)行控制,可以改變TSAL6200的工作狀態(tài),以達(dá)到進(jìn)行紅外數(shù)據(jù)的發(fā)送功能;P3.3引腳是單片機(jī)的外部中斷1引腳,與中斷控制器8259A相連,單片機(jī)的P0口是8位數(shù)據(jù)的傳輸線,分別與8259A的數(shù)據(jù)線相連;單片機(jī)的P1.0和P1.1用來(lái)當(dāng)I2C總線,使用軟件進(jìn)行I2C的模擬,詳細(xì)內(nèi)容可見(jiàn)IIC。程序流程分析1、先進(jìn)行初始化操作,包括數(shù)碼管驅(qū)動(dòng)芯片CH452

7、、數(shù)碼管、定時(shí)器0、定時(shí)器1、8259A中斷控制器的初始化。2、當(dāng)有按鍵時(shí),會(huì)產(chǎn)生8259A中斷,在中斷服務(wù)函數(shù)中,把1賦給Flag1,用來(lái)標(biāo)志有鍵按下,并且進(jìn)行按鍵值的查找,并用一個(gè)全局變量Keycode記錄按鍵值。3、主程序中檢測(cè)到Flag1=1后(為了不影響接收程序,此時(shí)先關(guān)閉按鍵中斷的允許位,等本次發(fā)送過(guò)程結(jié)束再打開(kāi)允許位),就會(huì)調(diào)用紅外發(fā)送程序,發(fā)送的內(nèi)容為引導(dǎo)碼、地址碼以及命令,對(duì)于同一個(gè)遙控器件來(lái)說(shuō),它們的地址碼應(yīng)該是不變的,我們這里的地址碼應(yīng)該為0x40bd。(如下圖所示:)從圖中我們可以看出,命令碼(command,data code)發(fā)送兩次,第一次發(fā)送的是原碼,第二次發(fā)送

8、的是反碼,這樣是為了提高紅外傳輸過(guò)程的可靠性。需要注意的是,不管是地址碼還是數(shù)據(jù)碼,都是先發(fā)送最低有效位。4、在發(fā)送程序中,先發(fā)送引導(dǎo)碼,由9ms的高電平和4.5ms的低電平組成,由下圖所示:引導(dǎo)碼發(fā)送完畢之后,緊接著就會(huì)發(fā)送4個(gè)字節(jié)的數(shù)據(jù),包括地址碼和命令碼,數(shù)據(jù)編碼格式如下圖所示:0.56ms的高電平和0.56ms的高電平代表數(shù)據(jù)0,0.56ms的高電平和1.12ms的低電平代表數(shù)據(jù)1。5、接收過(guò)程應(yīng)該和發(fā)送過(guò)程是"同時(shí)"的,在紅外發(fā)送程序執(zhí)行的過(guò)程中,當(dāng)紅外接收器HS0038接收到紅外信號(hào)后,在紅外信號(hào)出現(xiàn)上升沿(程序中設(shè)置了IT1=1),會(huì)產(chǎn)生8259A中斷,此時(shí)我

9、們可以在中斷服務(wù)程序中進(jìn)行解碼操作,獲取紅外數(shù)據(jù)。6、解碼操作時(shí),先進(jìn)行引導(dǎo)碼的判斷,由于HS0038會(huì)將接收到的紅外信號(hào)反向,所以引導(dǎo)碼就變成了9ms的低電平和4.5ms的高電平,第一次產(chǎn)生8259A中斷是在9ms之后,下一次中斷產(chǎn)生則是在發(fā)送數(shù)據(jù)位的0.56ms之后,所以兩次中斷之間的時(shí)間間隔應(yīng)該為4.5ms左右,如果時(shí)間在這個(gè)范圍之內(nèi),則說(shuō)明引導(dǎo)碼判斷成功,同樣的方法我們可以判斷產(chǎn)生兩次中斷時(shí)間間隔來(lái)判斷接收到的數(shù)據(jù)。程序代碼分析/*頭文件*/#include <reg52.h>#include <absacc.h>#include <INTRINS.H&g

10、t;#include "8259a.h"#include "ch452.h"/*變量的定義*/sbit Ir_out=P13;/紅外發(fā)射引腳unsignedint Count1=0;/用于計(jì)數(shù)、判斷時(shí)間使用unsignedchar Ir_Code=0x00,Flag=0,Keycode=0xff,Flag1=0; /Flag1用來(lái)標(biāo)志有按鍵按下了,F(xiàn)lag用來(lái)判斷是否需要發(fā)送紅外載波信號(hào),Keycode用來(lái)記錄按鍵值LeadCode=0,Data=0x00,DataNum=0,FirstNum=0,ReceiveData8=0;/LeadCode用來(lái)標(biāo)記

11、引導(dǎo)碼判斷是否成功,Data用來(lái)接收紅外數(shù)據(jù),DataNum表示已經(jīng)接收了多少位數(shù)據(jù)了,F(xiàn)irstNum表示是否為第一次產(chǎn)生中斷,ReceiveData用來(lái)存儲(chǔ)數(shù)碼管顯示的數(shù)據(jù) unsignedchar Code4=0x02,0xbd;/用來(lái)存放將要發(fā)送的數(shù)據(jù),前兩位為地址碼,固定的,后兩位數(shù)據(jù)為命令碼,互為相反unsignedchar Keytable44=0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00;/鍵值查找表/*延時(shí)函數(shù)*/void Delayus(unsignedint

12、x)while(x-);/*/*紅外發(fā)射的部分*/void Send_Data(unsignedchar Data)/發(fā)送八位數(shù)據(jù)的函數(shù)unsignedchar i;for(i=0;i<8;i+) Flag=1;/置Flag為1,表明需要發(fā)送紅外載波 TR0=1;/打開(kāi)定時(shí)器0 Count1=0;/計(jì)數(shù)值賦為.0 while(Count1<20);/判斷是否已經(jīng)發(fā)送了0.56ms的高電平 Flag=0;Ir_out=1;Count1=0;/此時(shí)不需要再發(fā)送紅外載波了,F(xiàn)lag=0if(Data&0x01)/取數(shù)據(jù)的最低位進(jìn)行發(fā)送while(Count1<63);/數(shù)據(jù)

13、為1則發(fā)送1.68ms 的低電平elsewhile(Count1<20);/數(shù)據(jù)為0則發(fā)送1.68ms 的低電平 TR0=0;/關(guān)閉定時(shí)器0 Data=Data>>1;/要傳送的數(shù)據(jù)右移,取下一位void Send(unsignedchar* Code)/開(kāi)始發(fā)送,先發(fā)引導(dǎo)碼 Flag=1;/打開(kāi)定時(shí)器0產(chǎn)生38KHZ的紅外載波并計(jì)數(shù) TR0=1; Count1=0;while(Count1<345);/判斷是否已經(jīng)發(fā)送了9ms的高電平 Flag=0;/此時(shí)發(fā)送低電平,定時(shí)器0只用來(lái)定時(shí)作用 Ir_out=1;/關(guān)閉紅外發(fā)射 Count1=0;while(Count1&

14、lt;174);/判斷是否已經(jīng)發(fā)送了4.5ms低電平 TR0=0; Ir_Code=*Code;/Ir_Code用來(lái)存放當(dāng)前要發(fā)送的數(shù)據(jù) Send_Data(Ir_Code);/調(diào)用發(fā)送八位數(shù)據(jù)的函數(shù),先發(fā)送地址碼 Ir_Code=*(Code+1); Send_Data(Ir_Code); Ir_Code=*(Code+2); Send_Data(Ir_Code);/再發(fā)送命令碼的源碼 Ir_Code=*(Code+3); Send_Data(Ir_Code);/然后發(fā)送命令碼的反碼/*/*并顯示的部分*/void Display()/顯示接收到的紅外數(shù)據(jù) CH452_Write(CH452

15、_DIG7 | ReceiveData7);/數(shù)碼管的DIG7、DIG6顯示命令碼的反碼CH452_Write(CH452_DIG6 | ReceiveData6);CH452_Write(CH452_DIG5 | ReceiveData5);/數(shù)碼管的DIG5、DIG4顯示命令碼的源碼 CH452_Write(CH452_DIG4 | ReceiveData4);CH452_Write(CH452_DIG3 | ReceiveData3);/數(shù)碼管的DIG3、DIG2、DIG1、DIG0顯示2個(gè)字節(jié)的地址碼CH452_Write(CH452_DIG2 | ReceiveData2)

16、;CH452_Write(CH452_DIG1 | ReceiveData1);CH452_Write(CH452_DIG0 | ReceiveData0);/*/*紅外接收解碼*/void Receive(void)switch(DataNum)/判斷已經(jīng)接收到多少為數(shù)據(jù),對(duì)已經(jīng)接收到的數(shù)據(jù)進(jìn)行校驗(yàn)case8: ReceiveData0=Data&0x0f;/由于數(shù)碼管只能顯示0f之間的數(shù)值,所以要將8位的數(shù)進(jìn)行拆分 ReceiveData1=Data>>4;if(ReceiveData0!=0x02|ReceiveData1!=0x00)/由于前十六位為地址碼,對(duì)于同一

17、個(gè)發(fā)射器,應(yīng)該將其的地址碼設(shè)為一個(gè)固定不變的,解碼時(shí),判斷接收到的數(shù)據(jù)是否與規(guī)定的地址碼相同,不同則表示接收到的數(shù)據(jù)錯(cuò)誤,將變量賦為初始值,準(zhǔn)備接收下一次的紅外信號(hào)  LeadCode=0; Data=0x00; DataNum=0; FirstNum=0;break;case16: ReceiveData2=Data&0x0f; ReceiveData3=Data>>4;if(ReceiveData2!=0x0d|ReceiveData3!=0x0b) LeadCode=0;Data=0x00; DataNum=0; FirstNum=0;break;case2

18、4: ReceiveData4=Data&0x0f; ReceiveData5=Data>>4;break;case32: ReceiveData6=Data&0x0f;/ 判斷命令碼是否相反,不是則不正確 ReceiveData7=Data>>4;if(ReceiveData4!=ReceiveData6|ReceiveData5!=ReceiveData7) DataNum=0; Data=0x00; FirstNum=0; LeadCode=0;break;  void Decode(void)/解碼函數(shù) TR1=0;/此時(shí)關(guān)閉

19、定時(shí)器switch(LeadCode)/在沒(méi)有判斷引導(dǎo)碼的情況下,先判斷引導(dǎo)碼是否正確case0:if(TH1>=0x12&&TH1<=0x15)/判斷時(shí)間是否為4.5ms左右,是則說(shuō)明此時(shí)接收到的的確是引導(dǎo)碼,LeadCode設(shè)為1,下一次進(jìn)入時(shí),則進(jìn)行數(shù)據(jù)的判斷LeadCode=1;break;case1:if(TH1>=0x03&&TH1<=0x05)/1.12ms左右表示接收到的數(shù)據(jù)為0Data>>=1;DataNum+;elseif(TH1>=0x06&&TH1<=0x08)/2.24ms

20、左右表示接收到的數(shù)據(jù)為1Data>>=1;Data|=0x80;DataNum+;else/兩個(gè)時(shí)間范圍都不是,則表示接收到的數(shù)據(jù)不正確,重新開(kāi)DataNum=0;FirstNum=0;LeadCode=0; Receive();break; if(DataNum=32)/當(dāng)數(shù)據(jù)接收完之后,將變量賦為原值,以便下一次接收 DataNum=0;FirstNum=0;LeadCode=0; TH1=0x00;/ 判斷一次數(shù)據(jù)之后,/TH1、TL1賦為0x00,重新進(jìn)行計(jì)數(shù),用于下次判斷時(shí)間 TL1=0x00; TR1=1;/*/*初始化*/void Init8259a()/8

21、259A的初始化 ADR_8259AE=ICW1;/寫入初始化命令字 ADR_8259AO=ICW2; ADR_8259AO=ICW4; ADR_8259AO=OCW1;/寫入操作命令字 ADR_8259AE=OCW2; void Init()/初始化函數(shù) Init8259a();/調(diào)用8259A中斷控制器的初始化 TMOD=0x12;/定時(shí)器0工作方式2、計(jì)時(shí),定時(shí)器1工作方式1、計(jì)時(shí) TH0=230;/定時(shí)器0初始值為230,即26us中斷發(fā)生一次 TL0=230; TH1=0x00;/定時(shí)器1的初始值 TL1=0x00; ET0=1;/定時(shí)器中斷允許位打開(kāi) EX1=1;/外部中

22、斷1允許 IT1=1;/外部中斷1為上下降沿觸發(fā) EA=1;/總中斷允許位打開(kāi)/*/*主程序*/void main() CH452_Write(CH452_SYSON2);/打開(kāi)CH452的數(shù)碼管顯示和按鍵掃描的功能 CH452_Write(CH452_BCD);/啟動(dòng)CH452的自動(dòng)解碼功能 CH452_Write(CH452_DIG0 |0);/數(shù)碼管初始顯示0 Init();/調(diào)用初始化函數(shù) Delayus(500);/延時(shí)一段時(shí)間while(1) Delayus(100);if(Flag1)/已經(jīng)有按鍵被按下了,準(zhǔn)備發(fā)送紅外數(shù)據(jù) ADR_8259AO=0xfd;/寫OCW1此時(shí)不再接收按鍵的中斷 Code2=Keycode;/命令碼的原碼 Code3=Keycode;/命令碼的反碼 Send(Code);/調(diào)用紅外發(fā)送函數(shù),傳遞的參數(shù)為數(shù)據(jù)的首地址 Display();/顯示內(nèi)容 ADR_8259AO=0xfB;/打開(kāi)8259A的按鍵中斷,關(guān)閉8259A的紅外/ 中斷 Flag1=0;/清除按鍵標(biāo)志位 Delayus(500);/*中斷服務(wù)函數(shù)*/void

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論