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;
}
}
}
研究了一天,终于实现了。。

微信扫码关注
更新实时通知