|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:红外接收(对原子哥的ALIENTEK遥控器进行解码), U* w9 w; |+ G9 W( m2 p
Q3 }$ @* t) E: U1 k2 u) E: D
! c5 z* @( D. T, Q8 k3 k3 G
' \; o( C: V3 y9 ^/ J
5 s0 A; V. Y/ p9 T# U( p
正点原子的ALIENTEK遥控器* r& r2 N$ V7 G9 z* C) P4 n
用户码00ff' G! p2 u! g2 B
16进制键值码表
, A8 o* ]1 C5 n) W45 46 47" v8 O2 v! x7 s
44 40 43& ~' u) `+ g b6 T
07 15 09
6 ^2 `7 b: G) j" A9 @9 |16 19 0d
$ c' N: g5 s6 o" a" F5 W0c 18 5e
, f) b# V* F5 X08 1c 5a5 X5 o8 D+ Y% T) M% E5 E
42 ☻ 4a* ^$ e# ~" d/ Y9 Y9 h: n0 r
) [: Y& C! Z2 u: P7 B [3 {4 z
1 Z1 \1 g) z) b+ }. c
, Y+ a. K+ {# t
7 I* p9 P! C! O$ I红外接收管 通用型即可3 B2 i3 g% ]$ f1 [! o3 p7 \6 }" [
( D$ l% n5 \$ r. C
2 c/ v3 v; \( D( |2 @4 {7 w6 V7 f# o9 W1 F' n+ U
---------------------------------------------------------------------------
! F- ]6 t- @& v _6 {# L下面是类似的波形图,这个是网上找的,图片较大,缩小后看上去有些模糊,不过没关系,数据手册上一般都有: y1 {& y1 w; N3 d& ?: j" F
3 e" C! J4 U1 Q$ g
: _- w3 {# @. g; l+ f. H+ J2 h0 v
2 U# F' ?, z; m5 ?& z2 O遥控器在发射红外信号之前,我们的mcu已经开启了定时器
9 m) k" B5 _0 w4 K6 j在定时器中断函数中的全局变量irTimeCounts++ 一直在自加( u3 |( V2 E1 Z
irTimeCounts多长时间加一次? 或者说多长时间进入一次定时器中断函数呢?
( i% ~ h; o' y2 U8 i1 y9 H; ~4 X在方式2时,t=256*12/11059200 约为277.78us" L' O/ U5 _, Y1 ^
============================================================
3 U: ^ m% l5 a$ p3 U1.对于1.125ms的时间,timer0会中断1.125/t=4.05次 也就是要5次,算上各种误差,(顶多5次,至少4次)
; d/ X9 d2 J7 A' ?; W6 ]2.对于2.25ms 的时间,timer0会中断 2.25/t=8.1次, 也就是要9次,算上各种误差,(顶多9次,至少8次)' w' m( b2 a2 P' B* G) d3 @* Z/ t
对于这里的次数,比N次小一点,就是N次,比N次大一点,就是N+1次,因为不会有半次,9 T, U7 A/ }) @1 L
误差给它正负0.4次足够了,给了误差后再算次数,直接舍入就行7 m; l }3 \( i3 E' ^
那么我们就检测irTimeCounts的值,
4 A* ?/ x7 ?2 V0 j如果小于6或7,那么接收到的数据为0
: o) D8 b1 M, B9 B- ~如果大于6或7,那么接收到的数据为1
# q, U3 g0 s# c; u2 n# u从计算结果来看,我觉得0.56,1.125,2.25这些值的出现是比较合理的,/ b- F& _( J4 f- K/ F X% g5 ^& |
能有效避免由于器件误差和环境造成的数据误判,而且计算也方便
* G8 v/ v d: @+ I4 u) [
2 h- P" x8 J6 ]% S0 Y# }" @: F: L' R2 R, S* c
( _' l8 P! M0 M5 k; X) y# U6 Z5 x" C# ?
1 Y# K. _' \4 I |
|