紅外接收程序講解_第1頁
紅外接收程序講解_第2頁
紅外接收程序講解_第3頁
紅外接收程序講解_第4頁
紅外接收程序講解_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、紅外接收程序講解1、紅外遙控系統(tǒng)通用紅外遙控系統(tǒng)由發(fā)射和接收兩大部分組成,應(yīng)用編/解碼專用集成電路芯片來進(jìn)行控制操作,如圖1所示。發(fā)射部分包括鍵盤矩陣、編碼調(diào)制、LED紅外發(fā)送器;接收部分包括光、電轉(zhuǎn)換放大器、解調(diào)、解碼電路。  下面,我們將使用下面兩種設(shè)備:另外,使用51單片機(jī)進(jìn)行解碼。2、原理圖從原理圖看出,IR的data腳與51的PD2(P3.2)相連。                     2、紅外發(fā)射原理要對(duì)紅外遙控器所發(fā)的信號(hào)進(jìn)行解

2、碼,必須先理解這些信號(hào)。a) 波形首先來看看,當(dāng)我們按下遙控器時(shí),紅外發(fā)射器是發(fā)送了一個(gè)什么樣的信號(hào)波形,如下圖:由上圖所示,當(dāng)一個(gè)鍵按下超過22ms,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖(由位置1所示)。如果鍵按下超過108ms仍未松開,接下來發(fā)射的代碼(連發(fā)代碼由位置3所示)將僅由起始碼(9ms)和結(jié)束碼(2.5ms)組成。下面把位置1的波形放大: 由位置1的波形得知,這108ms發(fā)射代碼由一個(gè)起始碼(9ms),一個(gè)結(jié)果碼(4.5ms),低8位地址碼(用戶編碼)(9ms18ms),高8位地址碼(用戶編碼)(9ms18ms),8位數(shù)據(jù)碼(鍵值數(shù)據(jù)碼)(9ms18ms)和

3、這8位數(shù)據(jù)的反碼(鍵值數(shù)據(jù)碼反碼)(9ms18ms)組成。b) 編碼格式遙控器發(fā)射的信號(hào)由一串0和1的二進(jìn)制代碼組成不同的芯片對(duì)0和1的編碼有所不同。通常有曼徹斯特編碼和脈沖寬度編碼。XS-091遙控板的0和1采用PWM方法編碼,即脈沖寬度調(diào)制。下圖為一個(gè)發(fā)射波形對(duì)應(yīng)的編碼方法:放大0和1的波形如下圖: 這種編碼具有以下特征:以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進(jìn)制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進(jìn)制的“1”。3、紅外接收原理a) 波形紅外接收頭將38K載波信號(hào)過慮,接收到的波形剛好與發(fā)射波形相

4、反:放大,位定義0和位定義1波形如下: 4、解碼原理及算法注:代碼寬度算法:16位地址碼的最短寬度:1.12×16=18ms 16位地址碼的最長寬度:2.24ms×16=36ms可以得知8位數(shù)據(jù)代碼及其8位反代碼的寬度和不變:(1.12ms+2.24ms)×8=27ms所有32位代碼的寬度為(18ms+27ms)(36ms+27ms)對(duì)于紅外線遙控對(duì)于很多電子愛好者來講,都感覺到非常神奇,看不到,摸不著,但能實(shí)現(xiàn)無線遙控,其實(shí)控制的關(guān)鍵就是我們要用單片機(jī)芯片來識(shí)別紅外線遙控器發(fā)出紅外光信號(hào),即我們通常所說的解碼。單片機(jī)得知發(fā)過來的是什么信號(hào),然后再做出相

5、應(yīng)的判斷與控制,如我們按電視機(jī)遙控器的頻道按鈕,則單片機(jī)會(huì)控制更換電視頻道,如按的是遙控器音量鍵,則單片機(jī)會(huì)控制增減音量。解碼的關(guān)鍵是如何識(shí)別“0”和“1” !從位的定義我們可以發(fā)現(xiàn)“0”、“1”均以 0.56ms的低電平開始,不同的是高電平的寬度不同!,“0”為0.56ms,“1”為1.68ms,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”。如果從0.56ms低電平過后,開始延時(shí),0.56ms以后,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時(shí)必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此取(1.12ms+0.56

6、ms)/2=0.84ms最為可靠,一般取0.84ms左右均可。根據(jù)碼的格式,應(yīng)該等待9ms的起始碼和4.5ms的結(jié)果碼完成后才能讀碼。5、實(shí)例代碼:注意一下幾點(diǎn):1. 從上面“紅外接收頭與單片機(jī)連接原理圖”來看,紅外接收頭的型號(hào)腳是與51的int0相連,所以需要使用INT0(外部中斷0).2. 由于解碼過程中涉及到延時(shí),為精確起見,我們選擇使用定期時(shí)1來計(jì)時(shí)。實(shí)例代碼:C+ view plaincopy1. #include   2. #include   3.   4. / 函數(shù)原型 

7、; 5. void SystemInit(void);  6. void Delay_840us(void);  7. void Delay_2400us(void);  8. void LedDisp();  9. unsigned char GetCode(void);/獲得碼  10. void  delay(unsigned char loop);  11.

8、  12. / 位變量  13. sbit IRIN = P32;     14. sbit BEEP = P16;  15. sbit swch = P17;  16.   17. / 變量  18. unsigned char KeyValue;    &

9、#160;/機(jī)器碼  19. unsigned char MaValue;      /鍵值碼;  20. unsigned char disbuf4;    /數(shù)碼管顯示緩沖  21. unsigned char scan4=0x04,0x08,0x10,0x20; /p2位選擇  22. unsigned char code

10、 table16 = /共陰碼  23. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71;  24.   25. /* 26.  * 延時(shí) 27.  */  28. void delay(unsigned char loop)   29.   &#

11、160; 30.     unsigned char i;            31.     for(i=0;i>8);    32.     TR1=1;   33.     while(!TF1);

12、0;  34.     TF1=0;   35.     TR1=0;  36.   37.   38. /* 39.  * 延時(shí)9ms  40.  */  41. void Delay_9000us(void)  42.   43.    

13、0;TL1 = 153.6;  44.     TH1 = 223.6;  45.     TR1 = 1;  46.     while(!TF1);  47.     TF1 = 0;  48.     TR1

14、60;= 0;  49.   50.   51. /* 52.  * 延時(shí)4.5ms  53.  */  54. void Delay_4500us(void)  55.   56.     TH1 = 239.8;  57.     TL1 = 204.8;

15、  58.     TR1 = 1;  59.     while(!TF1);  60.     TF1 = 0;  61.     TR1 = 0;  62.   63.   64. /* 65.  * 系

16、統(tǒng)初始化  66.  */  67. void SystemInit(void)  68.   69.     IRIN = 1;  70.     IT0 = 1;         /INT0負(fù)跳變觸發(fā)  71.    

17、; TMOD = 0x10;     /定時(shí)器1工作在方式1  72.     EA = 1;  73.     EX0 = 1;  74.   75.   76. /* 77.  * 讀碼  78.  */  79.

18、unsigned char GetCode()  80.    81.     unsigned char n;  82.   83.     static temp = 0;   84.   85.     for( n = 0;

19、0;n < 8; n+ )   86.       87.         while(!IRIN);  / 等待高電平,開始解碼  88.   89.         Delay_840us(); / 延時(shí)0.8

20、4ms  90.   91.         if(IRIN) / 若仍然為高電平,則為1,否則為0  92.           93.            temp = (0x80|(temp>&g

21、t;1);  / 1    94.            while(IRIN); /等待跳變成低電平  95.           96.         else   

22、0;97.             temp=(0x00|(temp>>1);  / 0  98.           99.        100.   101.     return&

23、#160;temp;  102.   103.   104. /* 105.  * 數(shù)碼管顯示 106.  */  107. void LedDisp()  108.    109.     unsigned char i;  110.     for(i=0;i<4;i+)

24、0; 111.          112.         P0=tabledisbufi;  113.         P2 = scani;  114.         delay(50);

25、60; 115.         P0=0x00;  116.       117.   118.   119. void main(void)  120.    121.     SystemInit();  122.   123.  &

26、#160;  while(1)   124.         125.         /以下是查表顯示  126.         disbuf0=(KeyValue&0xf0)>>4)&0x0f);  127.   &

27、#160;     disbuf1=KeyValue&0x0f;  128.         disbuf2=(MaValue&0xf0)>>4)&0x0f);  129.         disbuf3=MaValue&0x0f;    130.  &#

28、160;      LedDisp();  131.       132.   133.   134.   135. void interr_ir(void) interrupt 0  136.    137.     /* 138.    

29、;  * 用戶碼和機(jī)器碼  139.      */  140.     unsigned char addrl,addrh,num1,num2;   141.   142.     EA = 0;  /先關(guān)閉外部中斷0  143.   144. &

30、#160;   Delay_9000us(); / 檢測9ms開始碼  145.   146.     if (IRIN)      / 檢測是否為干擾信號(hào)  147.         EA = 1;     /

31、0;重新開啟外部中斷0  148.         return     / 退出解碼  149.       150.              151.     while(!IRIN)

32、;   / 等待跳為高電平  152.   153.     Delay_4500us(); / 檢測4.5ms結(jié)果碼  154.   155.     if (IRIN)      / 檢測是否為干擾信號(hào)  156.      

33、   EA = 1;     / 重新開啟外部中斷0  157.         return     / 退出解碼  158.       159.   160.     / 讀

34、碼  161.     addrl=GetCode(); / 用戶編碼高位  162.     addrh=GetCode(); / 用戶編碼低位  163.     num1=GetCode();  / 機(jī)器碼  164.     num2=GetCode();  /

35、 機(jī)器碼反碼  165.   166.     /校驗(yàn)是否為錯(cuò)碼  167.     if(num1!=num2)  168.        169.         KeyValue=14;   170.    

36、60;    EA=1;   171.         return;  172.       173.   174.     KeyValue=num2;  175.     MaValue=addrh;   

37、0;176.   177.     EA=1;  178.   代碼分析(只分析關(guān)鍵部位):1. 系統(tǒng)初始化SystemInit()系統(tǒng)初始化時(shí),我們設(shè)置IRIN為高電平,同時(shí)把IT0設(shè)置成1,即下降沿(負(fù)跳變)觸發(fā)中斷。這是用于接收波形的引導(dǎo)碼是從低電平開始的(如上面接收波形所示)。這樣,當(dāng)按下按鍵時(shí),紅外接收到信號(hào),IRIN則發(fā)生從預(yù)先設(shè)置的高電平跳為低電平,從而產(chǎn)生中斷。2. 解碼-中斷程序 interr_ir(void)首先,第一步把EX0關(guān)中斷,這步至關(guān)重要,因?yàn)橐粋€(gè)接收波形

38、許多的下降沿,這樣會(huì)產(chǎn)生干擾中斷。接下來,使用定期時(shí)0延時(shí)9ms,跳過開始碼。注意,延時(shí)后,需要檢測一下干擾信號(hào)。下一步,while(!IRIN); 等待4.5ms高電平的到來,再延時(shí)4.5ms,跳過結(jié)果。引導(dǎo)碼過后, 開始讀碼,執(zhí)行GetCode():32位數(shù)據(jù)碼,分4次讀取,所以執(zhí)行4次GetCode(),讀取一個(gè)字節(jié)數(shù)據(jù)過程如下:C+ view plaincopy1. unsigned char GetCode()  2.    3.     unsigned

39、 char n;  4.   5.     static temp = 0;   6.   7.     for( n = 0; n < 8; n+ )   8.       9.         while(!IRIN

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論