




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農村板車出售合同范例
- 公司注銷業(yè)務合同范本
- 中醫(yī)診所招聘合同范本
- 單位出售土地合同范本
- 公司車定維修合同范本
- 共享出租場地合同范本
- 勞務聯(lián)營合同范例
- 加油站出租合同范本
- 企業(yè)賦能合同范本
- 二手房房東出租合同范例
- 產品過程特殊特性初始清單(示例)
- 兩篇古典英文版成語故事塞翁失馬
- 中國古代文學史 馬工程課件(中)13第五編 宋代文學 第一章 北宋初期文學
- GB/T 14643.4-2009工業(yè)循環(huán)冷卻水中菌藻的測定方法第4部分:土壤真菌的測定平皿計數法
- DL-T 5190.1-2022 電力建設施工技術規(guī)范 第1部分:土建結構工程(附條文說明)
- GA/T 914-2010聽力障礙的法醫(yī)學評定
- GA/T 642-2020道路交通事故車輛安全技術檢驗鑒定
- 注塑成型工藝培訓資料合集課件
- 建筑工地生活區(qū)管理制度范本
- 屠宰站安全生產三項制度(安全生產責任制、制度、操作規(guī)程)匯編
- 【高等數學(工專)練習題】上海大學(悉尼工商學院)2022年真題測驗匯總(附答案解析)
評論
0/150
提交評論