|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:红外接收(对原子哥的ALIENTEK遥控器进行解码)
2 e# M+ D( O: f! A% [
8 p5 @# a' |' c
; r! ^5 B# E. c) c8 G
. {8 ^3 | N U
) |2 v& a+ z" V/ G; T0 v5 q4 X正点原子的ALIENTEK遥控器
2 K1 K$ a& ]+ w4 K用户码00ff* P4 F3 i( q- A2 Q0 [7 R2 p, `( s
16进制键值码表
; S& _( Q$ I& C! R* F45 46 47
" h; t5 M- q; ?+ p# W1 _2 s9 X44 40 43' n) @5 f/ A4 K; L2 B& b
07 15 09
3 y0 q/ b h2 y1 ?" E6 U) m' {) m( a16 19 0d
% p' ]! }: B5 U# w+ W. {" k4 {/ J0 k0c 18 5e h: \2 |% p! B0 J$ D" b. v& R+ P
08 1c 5a) T/ l% K8 G4 b
42 ☻ 4a
1 B5 L* `9 E+ U# P1 W. c
. H) Y% Z( o, C6 X
8 c8 b" S0 O9 J( L8 S4 d+ D. \( P6 R" Z! N& z' e
& x' X7 \6 O+ ?/ T红外接收管 通用型即可
2 S2 o9 _8 w# X- D( ` ) g8 D9 C7 ~ r8 g. Q3 R
" _* y& z1 P+ b- L
% B2 T) r0 V4 X m6 J---------------------------------------------------------------------------
: ?6 f0 I( b; a8 D2 o6 Y. y# \下面是类似的波形图,这个是网上找的,图片较大,缩小后看上去有些模糊,不过没关系,数据手册上一般都有2 x" O2 U& K4 E
! m& G& a: n( Q9 Z8 `
, d( @8 k1 v, a3 C) J$ o
2 H6 l: e- j `- \遥控器在发射红外信号之前,我们的mcu已经开启了定时器9 x. f3 E) N' e; }/ G
在定时器中断函数中的全局变量irTimeCounts++ 一直在自加+ z9 {: T9 b! n O9 x+ s# |
irTimeCounts多长时间加一次? 或者说多长时间进入一次定时器中断函数呢?- u3 X7 x# \, Z$ e( X
在方式2时,t=256*12/11059200 约为277.78us3 r) y# J5 J4 V2 L D
============================================================4 Z. ]& p" M7 }; t
1.对于1.125ms的时间,timer0会中断1.125/t=4.05次 也就是要5次,算上各种误差,(顶多5次,至少4次); X) r! I/ P5 i, d
2.对于2.25ms 的时间,timer0会中断 2.25/t=8.1次, 也就是要9次,算上各种误差,(顶多9次,至少8次)
; f+ [5 c- x( V5 m k3 Q 对于这里的次数,比N次小一点,就是N次,比N次大一点,就是N+1次,因为不会有半次,9 q e3 S Y- t2 ^
误差给它正负0.4次足够了,给了误差后再算次数,直接舍入就行
$ b$ o6 A! D! R那么我们就检测irTimeCounts的值,: M$ h* ]- m# i: B7 \7 u# z
如果小于6或7,那么接收到的数据为0
2 T8 P: [' _$ Z6 u# ^6 D/ ?8 v. [如果大于6或7,那么接收到的数据为1
5 Y; k7 o% F. O从计算结果来看,我觉得0.56,1.125,2.25这些值的出现是比较合理的,( a# F: E# q3 F
能有效避免由于器件误差和环境造成的数据误判,而且计算也方便
' Y4 H" V' H# G& ]# X' }
- E: A+ ~3 P# O2 i4 ]* _7 a2 v4 g$ I5 u1 ]" e! l6 s% q
5 I( \! }3 F, e
6 [# v7 C# Z- l& I; U. G4 T
. B6 K9 I C5 _ E |
|