利用AVR(M8)的输入捕获(ICP)对万能红外线遥控器进行解_第1页
利用AVR(M8)的输入捕获(ICP)对万能红外线遥控器进行解_第2页
利用AVR(M8)的输入捕获(ICP)对万能红外线遥控器进行解_第3页
利用AVR(M8)的输入捕获(ICP)对万能红外线遥控器进行解_第4页
利用AVR(M8)的输入捕获(ICP)对万能红外线遥控器进行解_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、利用AVR(M8)的输入捕获(ICP)对万能红外线遥控器进行解码本实例程序为自创,若转载请注明出处,谢谢!     小弟不久前买了一个科朗公司出版的万能电视遥控器RM-2008,用作对设备的红外遥控,折腾了几天,今天终于弄清楚了如何对该遥控器进行解码,很开心,所以把成果与各位大虾分享,有什么错误的地方请指正。万能遥控器在使用前一般要进行设置,针对RM-2008这款万能遥控,设置方法如下:先按住“设置”键不放,再按下“电源”(“开/关”)键,工作指示灯亮起,然后释放两键,在此时进入代码输入状态,依次键入 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字节的无符号long类型变量来存储代码vol

13、atile unsigned char *IRcodePointer ;     /定义一个无符号的单字节指针变量,              /用此地址变量来分别读取IRCode的              /4个字节 其中操作码为 IRcodePointer2    

14、0;          /用户码为 IRcodePointer0volatile unsigned char IRReceiveEffective=0;     /IR信号接收有效 当程序响应接收以后请马上清零 这样才会继续接收下一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);/*-系统初始化函数定义-*/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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论