|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:红外接收(对原子哥的ALIENTEK遥控器进行解码)
2 ^) `: v+ z4 i9 F: V% l# x, G* {" V) }; |+ Z8 j T1 i
4 f( p3 q6 U6 T$ l! F0 f/ }. i
' `5 s1 h6 k- x# |" v正点原子的ALIENTEK遥控器0 I0 @& z n1 \, y# g8 C3 }
用户码00ff# S; p* e: m5 t4 N
16进制键值码表( N- X" R0 L. l0 f
45 46 47
5 v: C; C- ]. r2 E9 R7 _/ Y1 z44 40 43/ [( {+ |: U4 k. a0 y
07 15 091 M: Q# s1 w5 i5 l( \
16 19 0d
1 e! u/ b+ {% A/ A9 X- D7 m9 F0c 18 5e# J( D3 P6 d! ]( X* U Z& e
08 1c 5a u5 M: ? i3 S; V" Q3 q% J
42 ☻ 4a4 S- ?9 _) {& g/ J- Y
1 U- V' x0 Q: W2 ? v. u
4 f1 |# Z) E6 v) Y2 k! T" o( q* y) B( Z! Q
/ y7 L, D8 w3 s* k
红外接收管 通用型即可
2 k3 w" |9 @. b: D V( w
' z2 d+ t( }, {5 _5 W
( x: n3 E7 S0 P3 }( e) Z- n+ v9 l: i4 d* V
---------------------------------------------------------------------------
: `6 j/ O- g% M% |' }下面是类似的波形图,这个是网上找的,图片较大,缩小后看上去有些模糊,不过没关系,数据手册上一般都有
) q7 `) W; ~6 h- i: w" K3 @" B2 P" j% m9 r+ `' j R3 Z
8 k8 h) @3 {% C: a3 y
( a7 T; ?- u! M2 r
遥控器在发射红外信号之前,我们的mcu已经开启了定时器
" d. d+ `+ P4 B$ K+ E- r( i" N: d在定时器中断函数中的全局变量irTimeCounts++ 一直在自加1 A z) O( c! |0 h0 U
irTimeCounts多长时间加一次? 或者说多长时间进入一次定时器中断函数呢?+ \/ K& b% E/ M$ ?& f3 @
在方式2时,t=256*12/11059200 约为277.78us
( {* P- u% w: o3 w% t4 ~* }$ a============================================================ K% {2 \1 E* Q& ~2 c- m1 U+ T' \3 X
1.对于1.125ms的时间,timer0会中断1.125/t=4.05次 也就是要5次,算上各种误差,(顶多5次,至少4次)
" ?) A5 L1 O% V$ g2.对于2.25ms 的时间,timer0会中断 2.25/t=8.1次, 也就是要9次,算上各种误差,(顶多9次,至少8次)
& x6 w7 s$ m$ T1 X 对于这里的次数,比N次小一点,就是N次,比N次大一点,就是N+1次,因为不会有半次,( o- v% K9 b4 W+ V' J
误差给它正负0.4次足够了,给了误差后再算次数,直接舍入就行0 d7 [+ O) d: ~" }/ D
那么我们就检测irTimeCounts的值,
- P4 v1 y7 K1 u. `( I如果小于6或7,那么接收到的数据为0
3 X# a( ~& U! U4 m5 B如果大于6或7,那么接收到的数据为10 J# b/ s7 [* S2 `3 t
从计算结果来看,我觉得0.56,1.125,2.25这些值的出现是比较合理的,9 ~' a' a# J: W
能有效避免由于器件误差和环境造成的数据误判,而且计算也方便% e1 J4 w( j; {4 H) @+ }
: T2 a5 J! D: T/ n. O+ \6 s
0 @9 f6 Y- ~% H7 t$ t* }, I5 H6 H
# i8 d( R* f- I% l; \3 G+ S* y8 `' b: N( z3 ~
, t1 T0 z- ^. i' r. O/ B! q( { |
|