|
首先需要知道基本的信号波形:引导码,数据(0,1),连击码,具体如下图: - J. v7 Q/ X' P- w. `2 d 9 d# _2 P* a/ T0 Q' X6 ~ 一个定时器,每50uS中断一次,扫描高低电平进行记数,每次中断电平计数,如果电平发生变化,再检测是上升沿还是下降沿判断是否要处理,再搞一个状态记录当前是要解同步码还是数据码,因为它们的电平宽度不一样需要独立开来。懒得讲那么多,贴个代码看吧。: D3 z/ ^2 e# K# u5 l : W( {+ y" r6 x/ D4 F : s: C, x F! C) x' \+ U* X void IrFun (void) {" d, m4 {" V' ~' \ static unsigned char TimeL,TimeH;6 O" l6 t& i, F5 M$ ~' v9 R) r static bit IoState,UpState; static unsigned char RxData[4];+ u4 K, u+ u# A! I static unsigned char BitCount,ByteCount; static unsigned char Task; unsigned char i; IoState =IR_IN; if(IoState){+ t" g$ B) B, e. g if(TimeH<250)TimeH++; ?7 L E' w- W- J }- L: S4 H1 Z5 Z! E- Y- i else{ if(TimeL<250)TimeL++; } if((!IoState)&&(UpState)){/ p2 v/ u/ m+ L; V if(Task==0){ //收同步头. J- }% t! W: o) M2 f& u if((TimeL<=(180+30))&&(TimeL>=(180-30))&&(TimeH<=(87+10))&&(TimeH>=(43-10))){ BitCount=0;' W; Q8 e& A- i" C ByteCount=0; if(LongKeyCount)LongKeyCount=3; Task++;- j. e6 c+ W% I- C( v: R } }# X# q$ x; x; e% r2 L else if(Task==1){ //收数据. M0 x! I {* y' @$ g% R3 K8 L if((TimeL<=(12+5))&&(TimeL>=(12-5))){. ~4 @) ]; _) K. p if((TimeH<=(12+5))&&(TimeH>=(12-5))) RxData[ByteCount] &= ~(1<<BitCount); else if((TimeH<=(32+8))&&(TimeH>=(32-8))) RxData[ByteCount] |= (1<<BitCount);5 W2 Z2 d8 F" m) T9 p3 w else Task=0; BitCount++;' x, f2 I$ O) P6 Z J4 N if(BitCount>=8){+ I8 H' I: V1 p BitCount=0;. w. \* _9 Q' v ByteCount++; if(ByteCount>=4){3 r- O$ ~9 Y7 ~$ x: Q, s& N2 N ByteCount=0; for(i=0;i<4;i++){( O' R! [- Z; c% B% ~/ Z IrData[i]=RxData[i];, O- {1 a( ^/ j" {/ j, b8 g9 x IrOkFlag=1; Task=0; IrTime=5;4 {# S4 _- j. v8 w8 c LongKeyCount=3; //长键采样4 ]" L" N/ d8 v& V2 K }& n3 ^9 n0 e7 a }! E& r( K6 y5 n6 ^ } }8 H6 ^0 L$ j- `# @ else{, _3 E5 l9 r2 W+ u, q" m; W: E* E4 R Task=0; } }' r1 T' c# k/ d4 t& h- K else{ Task=0; }1 ]3 _& i& P* d0 F6 g9 \5 F! N TimeH=0;2 m$ U. k" N* R5 `& A% G: M TimeL=0;6 J- t3 w N$ c3 t } UpState=IoState;& j% H2 J) V8 ]' K, i if(Time1msCount<250)Time1msCount++;: l. g* u0 F1 g+ ^ if(DelayTime)DelayTime--; return;$ h6 B: O8 B9 j* u8 ?: M }% v* V/ O1 W# t& B- ^; t% q ) a0 w W& J1 x. h: u 这上面是最简单的一种处理试,只处理了每次按键消息的第一次按键码,连击码及按键弹击需要另外加代码进行处理。, p+ y P6 b2 t9 j" o3 `! D F " ]4 R! p7 V: z 另外,这个处理方法是在定时器中开了50US的定时中断,会占用较大的系统时间。 |
微信公众号
手机版
同一系列是通用的,你看一下发射头的载波频率,接收头跟发射头的载滤频率一样就行;应该说跟信号没关系,只跟载波有关系,然后只要注意解码了,有挺多种编码的,对应起来就行了,不过这个是软件上的功能了。
有36K 38K 40K 56K,# @. S8 ?+ |; D6 N1 ^ r
好像38K的比较通用0 N8 C% k$ q# g
我这边上传一份接收头的DATASHEET。你参考下
IRM-3638T.pdf
2015-2-15 09:28 上传
点击文件名下载附件
260.68 KB, 下载次数: 2
这个帖子里有之前共享的一些红外遥控资料,可以参阅!! K6 `6 a8 h8 m, M: v