|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:红外接收(对原子哥的ALIENTEK遥控器进行解码)
7 J* d% g% Y& A1 \( d. q, t
! V1 Y( ~& e( u( H% \8 n
) Q3 \! n4 s% W {% z) j- A+ @8 {- c5 J2 |6 s- h+ |2 R8 R
. K+ b2 P/ S# ~, G6 A( P2 [正点原子的ALIENTEK遥控器
- m' V+ m* i3 L; ~4 e. }' B用户码00ff
; B- F' i) E; V; S8 f* w* s6 j+ ~16进制键值码表4 W5 S; R" z- j* ?
45 46 47" f8 v( Q: S+ v& O% m5 I6 [, O
44 40 43! H; v& H) T9 \* w7 I' \, E
07 15 09
1 l3 c. q6 H3 O+ q16 19 0d
$ r) Q% R! o2 ^! S# i& a0c 18 5e* G) Q; ~/ ]* J7 Q$ I0 ?
08 1c 5a
3 ~# C S! K& E: l, a42 ☻ 4a
. |# ~) v; A) l; W1 m0 Q# `6 a# ~3 n' T% j% f! v
+ T; I& Z# s: S# I6 A5 J
2 Z1 P! h5 G3 i: e- ~9 H4 V
; H, m3 t# k6 R5 Z0 v7 Z4 K5 R# d* R+ m
红外接收管 通用型即可
& b* Y4 g3 o, B7 a( N
# m% @6 a" [# ^5 i7 v* A( q! H0 @* R& {
6 M6 ?7 b; }" V& ]: b8 k# B. @% }0 _+ }0 g- y+ N5 L
---------------------------------------------------------------------------
3 U4 i" t. y1 u下面是类似的波形图,这个是网上找的,图片较大,缩小后看上去有些模糊,不过没关系,数据手册上一般都有& {9 J/ o$ W! c. W2 Z0 l
7 j; M- ^5 O6 n& s# {7 V: Z
' ]* h8 M4 s* u# J" Z
0 g8 y5 f6 m! _+ ~4 C4 j
遥控器在发射红外信号之前,我们的mcu已经开启了定时器
1 v% z/ K- k$ ~) z" ~在定时器中断函数中的全局变量irTimeCounts++ 一直在自加
0 D. i9 D* J1 S9 oirTimeCounts多长时间加一次? 或者说多长时间进入一次定时器中断函数呢?+ \: [' M3 \' O G7 |0 r5 q2 n9 d
在方式2时,t=256*12/11059200 约为277.78us" Q( u" p: D5 B( q
============================================================, V! e, K' P. ^ E6 U
1.对于1.125ms的时间,timer0会中断1.125/t=4.05次 也就是要5次,算上各种误差,(顶多5次,至少4次)
! x; J. q6 Q" U9 ^4 r' B2.对于2.25ms 的时间,timer0会中断 2.25/t=8.1次, 也就是要9次,算上各种误差,(顶多9次,至少8次)9 o) \/ e, \( [" h& s/ X0 R
对于这里的次数,比N次小一点,就是N次,比N次大一点,就是N+1次,因为不会有半次,
5 c- `. Z/ E) _( b- |! z 误差给它正负0.4次足够了,给了误差后再算次数,直接舍入就行' z& ^: v# q( t
那么我们就检测irTimeCounts的值,
! x: ]! Z' M: H* z2 O: F: A3 p如果小于6或7,那么接收到的数据为01 _$ D. X8 Q \
如果大于6或7,那么接收到的数据为1+ a8 u* U. v( V$ B! }
从计算结果来看,我觉得0.56,1.125,2.25这些值的出现是比较合理的,: Q" Q7 H+ @! d' p; G" V
能有效避免由于器件误差和环境造成的数据误判,而且计算也方便9 D5 Q% U' D0 _/ o& @! p& m
/ {. M- R, R. Q- i0 g# K* G; T8 C2 r* O4 C/ T
p2 q9 o: k g+ x, w: k v2 J7 b3 |8 T# U) ^' t0 g
7 f* |2 T5 ~4 r |
|