1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

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

    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;  		}  	}    }

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

微信扫码关注

更新实时通知

作者:xiao 分类:硬件笔记 浏览: