|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:红外接收(对原子哥的ALIENTEK遥控器进行解码)
7 M! `- r1 i8 R9 h; _% [" q- z9 I! {% E8 b; l' y
) c7 b2 z) U$ T2 t# m- b( d' J7 C; T: e9 [ K, ]' m4 i0 H
, E! l" L1 a+ P
正点原子的ALIENTEK遥控器
- B/ l1 I% k0 H W$ L, A# n; Z用户码00ff6 ]0 ]! _% ^: n
16进制键值码表6 Q5 q* H& E' P
45 46 47) O$ D8 u! g9 V; G
44 40 43
: _0 b* M: J U5 w& U07 15 09/ x/ Q! d/ K9 }$ F
16 19 0d
* J8 S1 V7 p8 J7 Z" j& z" o0c 18 5e1 o! }2 Q% F. T' Q5 y8 ~/ q( [
08 1c 5a
- P/ D: ^. E3 j42 ☻ 4a7 o) l! ?8 K3 @% g. p0 N/ J4 e2 v
- K! q4 ?8 u. t$ q* c& G1 y
0 [2 N' |* v/ b6 S5 \! }8 D$ W
6 |4 Z4 w* ~7 R$ P5 ]4 P+ b
2 y o( A/ U% Y/ n/ M, r& T$ c红外接收管 通用型即可# U( I1 s9 I/ t! J- U- @
+ ]3 V2 f# r# n; Z, W, w; w6 q$ M9 l* U) Y. @! @, `
! j$ }# f- y, Q+ n---------------------------------------------------------------------------; t; ^, v" ?" _
下面是类似的波形图,这个是网上找的,图片较大,缩小后看上去有些模糊,不过没关系,数据手册上一般都有
3 n" b7 K" k% \5 W
. i' k) a# Z% F, O4 w# A ! \6 \; T* }# w/ r' l- R
* z: E3 \9 N, [& R遥控器在发射红外信号之前,我们的mcu已经开启了定时器' Q) F9 h" E8 j
在定时器中断函数中的全局变量irTimeCounts++ 一直在自加
N. p7 ^) \& z1 JirTimeCounts多长时间加一次? 或者说多长时间进入一次定时器中断函数呢?
9 X" O( P! k! f' J3 v7 f3 U: q在方式2时,t=256*12/11059200 约为277.78us
0 X; e* g v m4 o6 w- ^============================================================3 B4 x3 o* C1 z, m+ A
1.对于1.125ms的时间,timer0会中断1.125/t=4.05次 也就是要5次,算上各种误差,(顶多5次,至少4次), d0 n$ N4 s6 K f, G6 c+ x
2.对于2.25ms 的时间,timer0会中断 2.25/t=8.1次, 也就是要9次,算上各种误差,(顶多9次,至少8次)& P, x% n; F q, X) p
对于这里的次数,比N次小一点,就是N次,比N次大一点,就是N+1次,因为不会有半次,
3 j; i$ z$ U6 ] 误差给它正负0.4次足够了,给了误差后再算次数,直接舍入就行/ f* Q% F7 D" K8 J
那么我们就检测irTimeCounts的值,
1 o2 E- o9 ^: X% Z9 [$ @如果小于6或7,那么接收到的数据为0
- f0 p' F; z, K- T* Q如果大于6或7,那么接收到的数据为1
9 s( i: b, ]5 k从计算结果来看,我觉得0.56,1.125,2.25这些值的出现是比较合理的,
% g- ?: Z8 z; y能有效避免由于器件误差和环境造成的数据误判,而且计算也方便
. K# V) C" K" D
. `4 ~+ A3 b( I9 m$ h* [( _2 X' d3 v P: Y
2 d! F/ j/ U4 R# k
" t9 T# E1 g6 a y3 \( r
3 f8 G, [0 K* _4 q2 y6 K |
|