|
首先需要知道基本的信号波形:引导码,数据(0,1),连击码,具体如下图: 一个定时器,每50uS中断一次,扫描高低电平进行记数,每次中断电平计数,如果电平发生变化,再检测是上升沿还是下降沿判断是否要处理,再搞一个状态记录当前是要解同步码还是数据码,因为它们的电平宽度不一样需要独立开来。懒得讲那么多,贴个代码看吧。 void IrFun (void) { static unsigned char TimeL,TimeH; static bit IoState,UpState; static unsigned char RxData[4]; static unsigned char BitCount,ByteCount; static unsigned char Task; unsigned char i; IoState =IR_IN; if(IoState){ if(TimeH<250)TimeH++; } else{ if(TimeL<250)TimeL++; } if((!IoState)&&(UpState)){ if(Task==0){ //收同步头 if((TimeL<=(180+30))&&(TimeL>=(180-30))&&(TimeH<=(87+10))&&(TimeH>=(43-10))){ BitCount=0; ByteCount=0; if(LongKeyCount)LongKeyCount=3; Task++; } } else if(Task==1){ //收数据 if((TimeL<=(12+5))&&(TimeL>=(12-5))){ if((TimeH<=(12+5))&&(TimeH>=(12-5))) RxData[ByteCount] &= ~(1<<BitCount); else if((TimeH<=(32+8))&&(TimeH>=(32-8))) RxData[ByteCount] |= (1<<BitCount); else Task=0; BitCount++; if(BitCount>=8){ BitCount=0; ByteCount++; if(ByteCount>=4){ ByteCount=0; for(i=0;i<4;i++){ IrData[i]=RxData[i]; IrOkFlag=1; Task=0; IrTime=5; LongKeyCount=3; //长键采样 } } } } else{ Task=0; } } else{ Task=0; } TimeH=0; TimeL=0; } UpState=IoState; if(Time1msCount<250)Time1msCount++; if(DelayTime)DelayTime--; return; } 这上面是最简单的一种处理试,只处理了每次按键消息的第一次按键码,连击码及按键弹击需要另外加代码进行处理。 另外,这个处理方法是在定时器中开了50US的定时中断,会占用较大的系统时间。 |
微信公众号
手机版
这个帖子里有之前共享的一些红外遥控资料,可以参阅!