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

红外遥控键盘解码讲解

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

" r, C  Y9 {/ R" o首先需要知道基本的信号波形:引导码,数据(0,1),连击码,具体如下图:: `0 k! h, C" z

; a' `- B' A5 `/ K0 V  `3 S
+ H) O8 F9 K" d2 Y: y
$ e3 I2 k6 X$ l( L
/ [( s1 t% L# h( t一个定时器,每50uS中断一次,扫描高低电平进行记数,每次中断电平计数,如果电平发生变化,再检测是上升沿还是下降沿判断是否要处理,再搞一个状态记录当前是要解同步码还是数据码,因为它们的电平宽度不一样需要独立开来。懒得讲那么多,贴个代码看吧。' D; ~) z& B% Q. w# n% ^6 I4 i' Z: r

  l% R0 H9 A- E/ V, M& l/ V  K0 Z2 Q& S
void IrFun (void)
# ^  b! w* `2 x6 ~3 H, y{# 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];
0 _4 Z3 ~& r8 {' ]    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;
2 h: u7 ]  v$ @3 v3 |; O    IoState =IR_IN;
: f$ C8 M7 E' @; z6 I% G+ w    if(IoState){
% `. b" H5 T7 `        if(TimeH<250)TimeH++;+ c  C. W5 w  G; d0 W7 y
    }
* |) Q( k* ~* `8 e3 E/ s- [" X% d2 k    else{' M5 v5 g& B" F( U7 n; T# O
        if(TimeL<250)TimeL++;
3 _, P; B8 }8 f* J% g% H    }
3 j3 p: ]0 W2 Z: k- ]    if((!IoState)&&(UpState)){
2 I9 ~9 s4 J5 y' H9 }" `8 U        if(Task==0){            //收同步头( o3 k$ O6 D0 e" v+ T
            if((TimeL<=(180+30))&&(TimeL>=(180-30))&&(TimeH<=(87+10))&&(TimeH>=(43-10))){
- w! `/ ?3 F% ^+ @                BitCount=0;
( t: g' y. H/ \, g$ W/ P                ByteCount=0;
- y1 W2 F2 k7 d; o! d; r                if(LongKeyCount)LongKeyCount=3;
' P2 f* F9 ^2 R5 \7 m                Task++;3 T8 }6 D1 Z% S
            }) b# R) ~$ w- e9 A: M* c- |
        }
% }6 h1 z! Q% r. q4 A        else if(Task==1){       //收数据3 _$ l, L+ @6 f# X5 H) G& S7 m
            if((TimeL<=(12+5))&&(TimeL>=(12-5))){
! u7 |; v- h5 A8 f7 Y. A                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++;
7 e7 W1 ^0 i0 h3 b% }+ u# y                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;
1 y6 v  L0 v5 \. T( m  S; |                        for(i=0;i<4;i++){
* ^! _6 c: L# [% b. S                            IrData[i]=RxData[i];
* ^- j* Z# q' o, \2 t) \                            IrOkFlag=1;% _. ]" K( E# |/ L% Q
                            Task=0;
4 a+ y) E& A- f* Q6 x                            IrTime=5;
- k/ ~* W9 x0 B4 ]9 i                            . m( _0 p6 q& b) n" t. W% d2 l% h
                            LongKeyCount=3; //长键采样' B2 b2 u; P# }. W
                        }
3 `5 \7 Y) Y7 M* c; N                    }
) p: B- @5 `0 K3 w* r                }
$ g# J" |6 a% @$ r- `            }
9 x, L( J, o3 l( u* X            else{
$ U' H' A& ^. U2 {5 d5 b& B' `: M                Task=0;
& s# j# D3 q1 O* \            }
4 E3 ?1 q& h5 j  M& x7 x  B! S        }( u& b1 q8 \2 J! m) w
        else{
0 y8 F1 X0 f- i- U5 i$ K3 N            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
    }
) W1 {4 x' J1 _) r1 |    UpState=IoState;
; K% i0 @: M- X6 G    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 _

" b! k* H* f( }+ ^$ C这上面是最简单的一种处理试,只处理了每次按键消息的第一次按键码,连击码及按键弹击需要另外加代码进行处理。1 }5 s  M3 u. y

0 u: n8 m( _. b4 K另外,这个处理方法是在定时器中开了50US的定时中断,会占用较大的系统时间。
: E, T( G4 g; C2 R6 f
" E+ }, W4 k: S
# U; n  x& ^+ B) b8 I4 [
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 编辑 4 H' T% W* P0 E  A! [
zministaryfw 发表于 2015-2-15 09:18" ]- G( j5 \; G" y% s- [  u
谢谢,楼主分享。不够我想问一下, 对应不同的红外发射器的信号,是不是可以通用以红外接收头?还是说一个 ...
# u  Z8 _+ c: O! V; _
同一系列是通用的,你看一下发射头的载波频率,接收头跟发射头的载滤频率一样就行;应该说跟信号没关系,只跟载波有关系,然后只要注意解码了,有挺多种编码的,对应起来就行了,不过这个是软件上的功能了。
+ A- a) Z. E  D# u* S) f有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
0000000000.png
MouseCat 回答时间:2015-2-15 09:28:10
zministaryfw 发表于 2015-2-15 09:18' P8 {' X( |2 Y' P5 x
谢谢,楼主分享。不够我想问一下, 对应不同的红外发射器的信号,是不是可以通用以红外接收头?还是说一个 ...
3 P2 S2 a9 Q  \1 X2 \; z  c' l
我这边上传一份接收头的DATASHEET。你参考下  U- I8 e) p* u2 j1 l& q1 P
% _: O7 \; t* y% d; _) H+ q

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( T* d$ q5 h: b0 ^
这个帖子里有之前共享的一些红外遥控资料,可以参阅!
( d  B' R5 y2 j
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 手机版