|
首先需要知道基本的信号波形:引导码,数据(0,1),连击码,具体如下图:: `0 k! h, C" z 一个定时器,每50uS中断一次,扫描高低电平进行记数,每次中断电平计数,如果电平发生变化,再检测是上升沿还是下降沿判断是否要处理,再搞一个状态记录当前是要解同步码还是数据码,因为它们的电平宽度不一样需要独立开来。懒得讲那么多,贴个代码看吧。' D; ~) z& B% Q. w# n% ^6 I4 i' Z: r , M& l/ V K0 Z2 Q& S void IrFun (void) {# M+ I# @: g2 d' A N static unsigned char TimeL,TimeH;5 ?2 ?+ b9 G1 @9 K# S9 s* `: \7 y static bit IoState,UpState;' T% m2 U9 Y ^. M) H" y1 Q static unsigned char RxData[4]; static unsigned char BitCount,ByteCount;5 d" Q3 d% d4 k. u5 y4 P static unsigned char Task;3 B E8 M; k( S unsigned char i; IoState =IR_IN; if(IoState){ if(TimeH<250)TimeH++;+ c C. W5 w G; d0 W7 y } else{' M5 v5 g& B" F( U7 n; T# O if(TimeL<250)TimeL++; } if((!IoState)&&(UpState)){ if(Task==0){ //收同步头( o3 k$ O6 D0 e" v+ T if((TimeL<=(180+30))&&(TimeL>=(180-30))&&(TimeH<=(87+10))&&(TimeH>=(43-10))){ BitCount=0; ByteCount=0; if(LongKeyCount)LongKeyCount=3; Task++;3 T8 }6 D1 Z% S }) b# R) ~$ w- e9 A: M* c- | } else if(Task==1){ //收数据3 _$ l, L+ @6 f# X5 H) G& S7 m if((TimeL<=(12+5))&&(TimeL>=(12-5))){ if((TimeH<=(12+5))&&(TimeH>=(12-5))) RxData[ByteCount] &= ~(1<<BitCount);9 G1 b) r z! [7 V& }: c6 f else if((TimeH<=(32+8))&&(TimeH>=(32-8))) RxData[ByteCount] |= (1<<BitCount);% I4 g! `" J: w, z2 \8 R else Task=0;4 {7 x" |* m0 d BitCount++; if(BitCount>=8){; z) p( F! I$ ]% U$ S: A2 {/ ~ BitCount=0; w% h+ ^7 C' Z9 f0 h% C* M1 V ByteCount++;9 n, _4 b- G9 K if(ByteCount>=4){9 p4 P: \8 g* {/ C ByteCount=0; for(i=0;i<4;i++){ IrData[i]=RxData[i]; IrOkFlag=1;% _. ]" K( E# |/ L% Q Task=0; IrTime=5; . m( _0 p6 q& b) n" t. W% d2 l% h LongKeyCount=3; //长键采样' B2 b2 u; P# }. W } } } } else{ Task=0; } }( u& b1 q8 \2 J! m) w else{ Task=0;8 l$ e9 t" @. U1 w }8 {! i& i8 y* M2 F TimeH=0;2 r( x- I$ c0 q/ @" u. e' ` TimeL=0;: W% Z" N2 ]2 T* F7 W4 q# T: F5 H0 i } UpState=IoState; if(Time1msCount<250)Time1msCount++;+ P; A" s# Y+ e# D if(DelayTime)DelayTime--;0 \: b U+ O9 t$ u# j4 ?8 { return;; Y' y9 m+ z# m9 J& d } G) Y" o7 [4 o! Y; X4 [5 _ 这上面是最简单的一种处理试,只处理了每次按键消息的第一次按键码,连击码及按键弹击需要另外加代码进行处理。1 }5 s M3 u. y 另外,这个处理方法是在定时器中开了50US的定时中断,会占用较大的系统时间。 |
微信公众号
手机版
同一系列是通用的,你看一下发射头的载波频率,接收头跟发射头的载滤频率一样就行;应该说跟信号没关系,只跟载波有关系,然后只要注意解码了,有挺多种编码的,对应起来就行了,不过这个是软件上的功能了。
有36K 38K 40K 56K,( T. a7 F( u% ~+ u8 O9 [
好像38K的比较通用* x a+ ] F2 ~' [% J
6 |+ ` E& X- K' X A( P6 \7 w+ p8 E
我这边上传一份接收头的DATASHEET。你参考下 U- I8 e) p* u2 j1 l& q1 P
% _: O7 \; t* y% d; _) H+ q
IRM-3638T.pdf
2015-2-15 09:28 上传
点击文件名下载附件
260.68 KB, 下载次数: 2
这个帖子里有之前共享的一些红外遥控资料,可以参阅!