
首先需要知道基本的信号波形:引导码,数据(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的定时中断,会占用较大的系统时间。 |
同一系列是通用的,你看一下发射头的载波频率,接收头跟发射头的载滤频率一样就行;应该说跟信号没关系,只跟载波有关系,然后只要注意解码了,有挺多种编码的,对应起来就行了,不过这个是软件上的功能了。
有36K 38K 40K 56K,
好像38K的比较通用
我这边上传一份接收头的DATASHEET。你参考下
IRM-3638T.pdf
2015-2-15 09:28 上传
点击文件名下载附件
260.68 KB, 下载次数: 2
这个帖子里有之前共享的一些红外遥控资料,可以参阅!