RC_5编码类型的红外遥控,RC_5编码的特点(每一位用时1.8ms,即一位的一个周期是1.8ms;先是2位起始位、1位控制位、5位系统位、6位指令码;其中的起始位都是11,;控制位是为了辨别一直按住还是松开了再按的,当一直按住时这一位则不变;系统码对于同一个遥控器来说,每个按键的系统码都是一样的;指令码则是我们需要的;还需要注意的是我们接收到的位都是反码,所以我们接收到的起始位是00;先高后低则是0,先低后高则是1)。
所以基于上面的知识点,我们利用了单片机定时器捕获和定时(计数)的功能,我们可以使用单片机的定时器捕获,捕获下降沿,当下降沿到来时,说明有红外发射,也就说明有按键按下,当响应下降沿中断时,把定时器的时间设置为450us,在第一次时间溢出之后,把定时器的时间设置为1.8ms,以后1.8ms时间溢出时判断电平。
上中断代码:
void TIMER2_ISR (void) interrupt 5 { static uint8_t flag=0; static uint8_t number=0; if(T2MOD & TF2) //定时中断 { if(flag==1) { T2MOD = (T2MOD&0x1F) | TF2; TH2=(unsigned char)((0x10000 - (1800*(FOSC/1000))/1000)>>8); TL2=(unsigned char)(0x10000 - (1800*(FOSC/1000))/1000); if(IR) { red_message=red_message+1; red_message=red_message<<1; } else { red_message=red_message<<1; } number++; if(number==14) { red_message=red_message>>1; flag=0; red_end=1; number=0; } } } if(T2MOD & CF2) //下降沿中断 { T2MOD = (T2MOD&0x1F) | CF2; if(flag==0) { TH2=(unsigned char)((0x10000 - (450*(FOSC/1000))/1000)>>8); TL2=(unsigned char)(0x10000 - (450*(FOSC/1000))/1000); flag=1; } } }
研究了一天,终于实现了。。
微信扫码关注
更新实时通知