你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

红外遥控键盘解码讲解

[复制链接]
MouseCat 发布时间:2015-2-14 10:09

. B  [! B0 c. O" [1 k7 T. m首先需要知道基本的信号波形:引导码,数据(0,1),连击码,具体如下图:
$ w' t3 C) v  o  @1 l# O- J. v7 Q/ X' P- w. `2 d

) M9 e$ X2 `9 }* f' Q2 P
1 o% Y" p6 H, U9 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)
0 n% ?: J/ u+ E- t& ^" N{" d, m4 {" V' ~' \
    static unsigned char TimeL,TimeH;6 O" l6 t& i, F5 M$ ~' v9 R) r
    static bit IoState,UpState;
$ ^0 Y  s( Y9 S' r5 x3 S    static unsigned char RxData[4];+ u4 K, u+ u# A! I
    static unsigned char BitCount,ByteCount;
& |/ e7 q5 r* [- U+ \2 E    static unsigned char Task;
0 B& R3 V& W. s$ K    unsigned char i;
& A& S( l5 M, z; y    IoState =IR_IN;
$ I* d2 @0 j, y1 ]! P: F. \    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{
2 J7 w' E3 t0 {( \        if(TimeL<250)TimeL++;
5 v( i( ^" D% C9 F    }
0 i: P! ]+ Y2 B  N    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))){
  [' W! _% H( O5 }0 Q/ j+ e                BitCount=0;' W; Q8 e& A- i" C
                ByteCount=0;
  ^/ E! ^: ^) f  D                if(LongKeyCount)LongKeyCount=3;
1 l, s, n. U" z1 B4 |! O                Task++;- j. e6 c+ W% I- C( v: R
            }
* ]% |. s9 h. h3 Z9 G+ X. a3 \        }# 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);
4 T0 v7 @$ \, S4 `                else if((TimeH<=(32+8))&&(TimeH>=(32-8)))   RxData[ByteCount] |= (1<<BitCount);5 W2 Z2 d8 F" m) T9 p3 w
                else                                        Task=0;
% s' x9 `1 {* F, \2 I0 @9 Z/ a                BitCount++;' x, f2 I$ O) P6 Z  J4 N
                if(BitCount>=8){+ I8 H' I: V1 p
                    BitCount=0;. w. \* _9 Q' v
                    ByteCount++;
7 e/ }- \+ L4 E" q  G7 w; c                    if(ByteCount>=4){3 r- O$ ~9 Y7 ~$ x: Q, s& N2 N
                        ByteCount=0;
6 J$ s- Q. F8 |( A. q9 G+ w                        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;
. ?% e; s/ F* w9 T8 X                            Task=0;
& x  }2 P  g- @) N                            IrTime=5;4 {# S4 _- j. v8 w8 c
                           
; j6 |  v* \+ H& C$ o                            LongKeyCount=3; //长键采样4 ]" L" N/ d8 v& V2 K
                        }& n3 ^9 n0 e7 a
                    }! E& r( K6 y5 n6 ^
                }
- @; t( H, w& b7 z+ T! ^. Q0 Y5 K  J            }8 H6 ^0 L$ j- `# @
            else{, _3 E5 l9 r2 W+ u, q" m; W: E* E4 R
                Task=0;
1 L* C9 u8 B1 s4 R2 z; j3 {            }
$ {- N& N. ?; v& x9 p% z        }' r1 T' c# k/ d4 t& h- K
        else{
2 H) E' O5 k. c9 E) O9 U, g            Task=0;
! P; s3 F9 I& h6 w        }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
    }
4 S/ ]3 n, X2 c0 Z# ~7 Y    UpState=IoState;& j% H2 J) V8 ]' K, i
    if(Time1msCount<250)Time1msCount++;: l. g* u0 F1 g+ ^
    if(DelayTime)DelayTime--;
% V9 a, @8 v  l( x    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的定时中断,会占用较大的系统时间。
, s' ~1 R% O# i) ], P# V# d/ N0 W
1 A) h1 @. P" r7 f$ O
7 i" R, X2 n2 g; w$ w
00.png
01.png
赞 收藏 1 评论18 发布时间:2015-2-14 10:09

举报

18个回答
MouseCat 回答时间:2015-2-15 09:26:34
本帖最后由 MouseCat 于 2015-2-15 09:29 编辑
% l9 F+ B2 j  @0 q2 r9 Z- s4 D
zministaryfw 发表于 2015-2-15 09:18  ]. a' ]; x3 G  `+ i
谢谢,楼主分享。不够我想问一下, 对应不同的红外发射器的信号,是不是可以通用以红外接收头?还是说一个 ...

# t* ^$ ~7 \: v  G7 l同一系列是通用的,你看一下发射头的载波频率,接收头跟发射头的载滤频率一样就行;应该说跟信号没关系,只跟载波有关系,然后只要注意解码了,有挺多种编码的,对应起来就行了,不过这个是软件上的功能了。
! z+ F. ]) ]+ |$ I8 [" a有36K 38K 40K 56K,# @. S8 ?+ |; D6 N1 ^  r
好像38K的比较通用0 N8 C% k$ q# g

) _, p- b3 ^5 S% F3 T
0000000000.png
MouseCat 回答时间:2015-2-15 09:28:10
zministaryfw 发表于 2015-2-15 09:18
$ K7 Y' I) ?6 n, f4 d7 s- ]谢谢,楼主分享。不够我想问一下, 对应不同的红外发射器的信号,是不是可以通用以红外接收头?还是说一个 ...
6 j; O8 ^7 _% O3 p$ H- X
我这边上传一份接收头的DATASHEET。你参考下
3 o, K' I9 O" u
" t7 }3 Z6 b- X: m( `

IRM-3638T.pdf

下载

260.68 KB, 下载次数: 2

zministaryfw 回答时间:2015-2-15 09:18:43
谢谢,楼主分享。不够我想问一下, 对应不同的红外发射器的信号,是不是可以通用以红外接收头?还是说一个红外发射头,必须有一个与他对应的红外接收头?
MouseCat 回答时间:2015-2-14 10:10:30
https://www.stmcu.org.cn/module/forum/thread-600158-1-1.html: M% N3 [, b, c6 v0 f$ ]
这个帖子里有之前共享的一些红外遥控资料,可以参阅!! K6 `6 a8 h8 m, M: v
dwwzl 回答时间:2015-2-14 10:46:26
不错啊,支持
deepin666 回答时间:2015-2-14 10:54:48
好资料,收藏了
759611 回答时间:2015-2-14 12:27:21
感谢分享不错!
wyxy163@126.com 回答时间:2015-2-14 12:30:22
提示: 作者被禁止或删除 内容自动屏蔽
逍遥李 回答时间:2015-2-14 13:05:05
谢谢分享!
_ilikerome_ 回答时间:2015-2-14 16:28:56
学习一下,谢谢!
星辰一方 回答时间:2015-2-14 20:37:24
以前用avr搞过红外,感谢分享!
feel-376797 回答时间:2015-2-14 20:47:27
谢谢分享
lkl0305 回答时间:2015-2-14 21:33:15
多谢分享,学习下
MouseCat 回答时间:2015-2-15 09:05:10
这个只用了定时器的资源,每间隔50US就去扫一次,比较占CPU,另外一种就是得用IO中断和定时器,这种能够释放一些CPU。
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版