利用AVR(M8)的輸入捕獲(ICP)對萬能紅外線遙控器進行解_第1頁
利用AVR(M8)的輸入捕獲(ICP)對萬能紅外線遙控器進行解_第2頁
利用AVR(M8)的輸入捕獲(ICP)對萬能紅外線遙控器進行解_第3頁
利用AVR(M8)的輸入捕獲(ICP)對萬能紅外線遙控器進行解_第4頁
利用AVR(M8)的輸入捕獲(ICP)對萬能紅外線遙控器進行解_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、利用AVR(M8)的輸入捕獲(ICP)對萬能紅外線遙控器進行解碼本實例程序為自創(chuàng),若轉載請注明出處,謝謝!     小弟不久前買了一個科朗公司出版的萬能電視遙控器RM-2008,用作對設備的紅外遙控,折騰了幾天,今天終于弄清楚了如何對該遙控器進行解碼,很開心,所以把成果與各位大蝦分享,有什么錯誤的地方請指正。萬能遙控器在使用前一般要進行設置,針對RM-2008這款萬能遙控,設置方法如下:先按住“設置”鍵不放,再按下“電源”(“開/關”)鍵,工作指示燈亮起,然后釋放兩鍵,在此時進入代碼輸入狀態(tài),依次鍵入 0 0 0 指示燈熄滅,設置成功!說明一下:0 0

2、0 編碼是日立公司初期的紅外編碼方式,也就是網上到處都通用的紅外編碼方式(如下圖),另外本程序只能對此編碼進行解碼本程序通過使用輸入捕獲功能(ICP)捕捉紅外信號的高電平脈寬,達到解碼的目的;如果捕獲到的脈寬是4.5ms 則表示此信號為同步碼,如果捕獲到的脈寬是1.685ms 的話則表示 “1” 否則表示“0”測試電路如下:使用DNW 串口調試軟件時的效果#include <avr/io.h>#include <avr/signal.h>#include <avr/interrupt.h>#include <avr/wdt.h>#include

3、<util/delay.h>#include <stdio.h>/*-遙控操作值-*/        key        code (hex)#define Key_1       0x01#define Key_2       0x02#define Key_3    &

4、#160;  0x03#define Key_4       0x04#define Key_5       0x05#define Key_6       0x06#define Key_7       0x07#define Key_8       0x08#define Key_9&

5、#160;      0x09#define Key_0       0x00#define Menu      0x5c       / 菜單#define Menu_up   0x56       / 菜單上#define Menu_down   0x57  

6、60;    / 菜單下#define Menu_left   0x5f       / 菜單左#define Menu_right 0x5b       / 菜單右#define Menu_ok     0x16       / 菜單確認#define Channel_up 0x1b   

7、0;   / 頻道+#define Channel_down 0x1f       / 頻道-#define Sound_up      0x1e       / 音量+#define Sound_down   0x1a       / 音量-#define Open_Close 0x12   &#

8、160;   / 開/關#define Mute        0x10       / 靜音#define Pic_in_pic 0x51          /畫中畫#define Standard    0x58       / 制式#define Return&#

9、160;     0x52       / 返回#define Times       0x0b       / 倍數#define Screen      0x16       / 屏幕#define Audio    

10、0;  0x1d       / 伴音#define NICAM       0x13       / 麗音#define TV_Vedio    0x0f     / 電視/視頻#define Sleep       0x0e    /睡眠/*-常

11、用參數定義-*/#define P0 0#define P1 1#define P2 2#define P3 3#define P4 4#define P5 5#define P6 6#define P7 7#define FREQ 8 /定義單片機工作頻率為 8M#define uint unsigned int#define uchar unsigned char#define Start_T1 TCCR1B|=_BV(CS11);TCNT1=0/復位預計分頻器并開啟定時器T1#define Stop_T1 TCCR1B&=_BV(CS11) /關閉定時器T1/*-IR信號指示燈操

12、作函數-*/#define EN_IR_LED DDRB|=_BV(P1)#define CLR_IR_LED PORTB&=_BV(P1)#define SET_IR_LED PORTB|=_BV(P1)/*-某些端口操作-*/volatile unsigned char i,j,k;volatile unsigned long IRcode;                /定義一個長度為4字節(jié)的無符號long類型變量來存儲代碼vol

13、atile unsigned char *IRcodePointer ;     /定義一個無符號的單字節(jié)指針變量,              /用此地址變量來分別讀取IRCode的              /4個字節(jié) 其中操作碼為 IRcodePointer2    

14、0;          /用戶碼為 IRcodePointer0volatile unsigned char IRReceiveEffective=0;     /IR信號接收有效 當程序響應接收以后請馬上清零 這樣才會繼續(xù)接收下一IR碼volatile unsigned char IRReceiveCurrentBit=0; /IR信號當前接收位 0時表示第0位即同步碼(4.5ms高電平)volatile unsigned int Pulse_length=0;&

15、#160;         /捕獲的脈沖寬度volatile unsigned char ICP_Parity=0;           /捕獲中斷奇偶次計數 1時為偶次 并在此時判斷脈寬volatile unsigned char Received_Key_Temp;      /紅外接收操作鍵緩存const unsigned char String="Y

16、ou Have Press Key : "/*-串口定義-*/unsigned char SetPrintfConvertMode=0; /使用printf作其他轉換,并非輸出到UARTvoid Uart_Init(void);int System_putchar(char c, FILE *stream);int System_getchar(FILE *stream);FILE mystd = FDEV_SETUP_STREAM(System_putchar, System_getchar,_FDEV_SETUP_RW);/*-常用函數定義-*/void delay_nms(un

17、signed int ms)                /N ms延時函數for(i=0;i<ms;i+)   _delay_loop_2(FREQ*250);/*-系統(tǒng)初始化函數定義-*/void IO_INIT(void)PORTB|=_BV(P0); /設置ICP引腳內部上拉 經過試驗驗證,上拉會提高紅外接收靈敏度ISR(TIMER1_COMPA_vect)    IRReceiv

18、eCurrentBit=0;/重置IR接收位為第0位,為下次接收做準備TIMSK&=_BV(OCIE1A); /關閉溢出中斷TCCR1B|=_BV(ICES1); /設置輸入捕獲 上升沿有效ICP_Parity=0;     Stop_T1;    CLR_IR_LED;ISR(TIMER1_CAPT_vect)if(!IRReceiveEffective)   if(ICP_Parity=0)          IC

19、P_Parity+;     TIMSK|=_BV(OCIE1A);     TCCR1B&=_BV(ICES1); /設置輸入捕獲 下降沿有效     Start_T1 ;         else        Stop_T1;ICP_Parity=0;     TCCR1B|=_BV(

20、ICES1);/設置輸入捕獲 上升沿有效     Pulse_length=ICR1;     if(IRReceiveCurrentBit=0)             if(Pulse_length>=3500&&Pulse_length<5500)/ 如果是引導碼 (4.5ms) 進入下一個bit的讀取      

21、  IRReceiveCurrentBit+;           else if(IRReceiveCurrentBit<33) /接收32位數據             IRcode>>=1;        if(Pulse_length<1900&&Pulse_length>1

22、400) /判斷是否為 1 ( 1.685 ms)        IRcode|=0x80000000;       IRReceiveCurrentBit+;       if(IRReceiveCurrentBit=33)                

23、IRReceiveCurrentBit=0; /重置IR接收位為第0位,為下次接收做準備         if(IRcodePointer0=(unsigned char)(IRcodePointer1)&&IRcodePointer2=(unsigned char)(IRcodePointer3)                  

24、;   SET_IR_LED;    /開啟IR信號指示燈           IRReceiveEffective=1; /數據有效                   delay_nms(5); /因為32位數據后面還有一個信號上跳變,所以要適當延時,延時0.65ms以上即可

25、                  /int main(void) wdt_disable();IO_INIT();Uart_Init();TCCR1B=_BV(WGM12)|_BV(CS11);/采用8分頻 這樣的話 TCNT1的計數時基為 1usOCR1A=8000; /TCNT1 計數上限 設置IR接收超時 這里設置 8msTIMSK|=_BV(TICIE1);/開啟輸入捕獲中斷TCCR1B|=_BV(ICES1);/輸入捕獲 上升沿有效E

26、N_IR_LED; /IR信號指示燈允許CLR_IR_LED; /關閉IR信號指示燈IRcodePointer=&IRcode; sei(); while(1)   if(IRReceiveEffective)         Received_Key_Temp=IRcodePointer2;/把接收到的操作鍵放入緩存     IRReceiveEffective=0; /允許下一次接收     switch(Rece

27、ived_Key_Temp)             case Key_1      : printf("n%sKey_1",String);break;       case Key_2      : printf("n%sKey_2",String);break;  

28、;     case Key_3      : printf("n%sKey_3",String);break;       case Key_4      : printf("n%sKey_4",String);break;       case Key_5   &#

29、160;  : printf("n%sKey_5",String);break;       case Key_6      : printf("n%sKey_6",String);break;       case Key_7      : printf("n%sKey_7",String);break;&

30、#160;      case Key_8      : printf("n%sKey_8",String);break;       case Key_9      : printf("n%sKey_9",String);break;       case Key_0 

31、0;    : printf("n%sKey_0",String);break;       case Menu       : printf("n%sMenu",String);break;       case Menu_up    : printf("n%sMenu_up",String);b

32、reak;       case Menu_down : printf("n%sMenu_down",String);break;       case Menu_left : printf("n%sMenu_left",String);break;       case Menu_right : printf("n%sMenu_right",String)

33、;break;       case Menu_ok    : printf("n%sMenu_ok",String);break;       case Channel_up : printf("n%sChannel+",String);break;       case Channel_down   : printf(&qu

34、ot;n%sChannel-",String);break;       case Sound_up     : printf("n%sSound+",String);break;       case Sound_down   : printf("n%sSound-",String);break;      

35、; case Open_Close : printf("n%sOpen_Close",String);break;       case Mute       : printf("n%sMute",String);break;       case Standard   : printf("n%sStandard",String);bre

36、ak;       case Return     : printf("n%sReturn",String);break;       case Times      : printf("n%sTimes",String);break;       /case Screen     : printf("n%sScreen",String);break;/Screen 與 menu_ok 值相同       case Audio    &#

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論