21
2021
07

红外遥控———RC_5编码———定时中断解析出每个按键对应的二进制

    RC_5编码类型的红外遥控,RC_5编码的特点(每一位用时1.8ms,即一位的一个周期是1.8ms;先是2位起始位、1位控制位、5位系统位、6位指令码;其中的起始位都是11,;控制位是为了辨别一直按住还是松开了再按的,当一直按住时这一位则不变;系统码对于同一个遥控器来说,每个按键的系统码都是一样的;指令码则是我们需要的;还需要注意的是我们接收到的位都是反码,所以我们接收到的起始位是00;先高后低则是0,先低后高则是1)。

RC_5.png

所以基于上面的知识点,我们利用了单片机定时器捕获和定时(计数)的功能,我们可以使用单片机的定时器捕获,捕获下降沿,当下降沿到来时,说明有红外发射,也就说明有按键按下,当响应下降沿中断时,把定时器的时间设置为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;
		}
	}

}

研究了一天,终于实现了。。

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。