维修网

 找回密码
 注册

QQ登录

只需一步,快速开始

微信扫码 , 快速开始

查看: 581|回复: 3

红外遥控接收解码程序(用内时钟中断做)

[复制链接]

classn_11

发表于 2009-11-22 20:54:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
以往在单片机书上、网上所介绍的遥控器接收解码程序都是基于利用单片机的进入外部中断后所进行的程序解码。这此可以讲是个垃圾程序(因为核对技术高手没有外露),可以讲在解码红外线波形的同时,单片机的其他程序要停下来。对于大型工程是不允许的。 5 W0 f% L: e1 O! S. B" s9 F
现特将利用内部时间中断时的时间差所做的红外线接收解码程序公开。本程序的要点是要将内部时钟中断设为125us,每次进中断则对相应的位进行比较低电平时间从而解码……& C! c+ e+ s  v" i) n6 `
       
- T0 }! t1 S! y* ^% d% p' U关键寄存器定义:static uchar codeTime; //码时间,用于以125us时间计时# ?$ O( A8 K  m' k; _
static uchar HeadCode_Reced; //头码标志位
# J$ }( r6 |2 |1 E* I7 Q        2 G  ]; \# f( |/ T8 c5 d
static uchar Ir_Dealed; " |" p4 K$ h4 h% u0 M
static uchar Irprot_LastState; //端口状态位
  B) c" ~" S/ C static uchar Receive_OK;1 N; m$ B! x3 E# d& P
static uchar codeCnt; //数据码位
0 C: E  Z8 K5 [: ~ static uchar vData1; //1~4是分别用来放数据的
& W+ m. i6 b) ` static uchar vData2;1 U# p0 {* g5 @
static uchar vData3;6 ^2 n5 m: [4 L* Z& ~# L
static uchar vData4;
* s8 k6 P0 ~4 |% H3 d- i        9 F7 {: A2 h* E5 o3 m+ Y
/*内中断0 用于计时*/+ S  c/ f7 q; k# h( r, v+ Q: D
void Timer0(void) interrupt 1 //开定时器0中断,工作于方式0,中断号为10 v$ b( _1 u4 }5 y& A4 G
{% n$ a4 j. O  V5 Z9 P8 f& N& }5 e
TH0=(65536-125)/256; //125ms出中断一次.$ D$ W- s6 g' [6 e5 J0 _
       
# y: S! c, y( _  u7 A, s TL0=(65536-125)%256;2 t" b: J! ^' C4 X2 e$ G) v
        8 J* J, j& D( N# T

3 R+ E' K1 ?& N. W! b4 `//====================================================================================
7 k& ]: I& y0 l& F9 v' w1 c codeTime++;# \( m) B8 Z" J4 u5 U/ o
if(codeTime>=80)
, M: M; E. x$ }' {$ j6 x {  \; }# y. }  w% C
codeTime=80;
# u. O4 k& a7 {0 `) ^- P HeadCode_Reced=0;//80*125us=10ms时间未接收到低电平信号则清头码接收标志位
" s8 d, m  d/ s2 t6 \2 F0 Y) t Ir_Dealed=0;
  R: T# W- v( m/ ]& B3 D1 M
2 v* M4 q, a) v: i5 D: O }/ l4 O0 v- V; R/ [
       
$ e- W8 T. F. j8 H3 w% l//-------------------------------------------------7 S. ]% d/ H! o0 P# b$ B/ G7 K
P3_7=1; //先给该口付18 R- B! p$ q  w+ O( ^$ q6 F
) }! H8 G) Q+ Y% |" Z4 S
if(P3_7==1)& m) g" l1 M7 e9 Y
{. I6 K; `% `( n2 ]: i/ c
Irprot_LastState=1;//置接收端口为1状态标志! p, o# j- Z- a& Q/ I3 o
}
( N8 @7 l, g/ F/ a7 ]//---------------------------------------------------------------------
5 T( ]6 @/ B$ S+ q# D9 o. { else //该口出现了低电平证明有可能是收到红外信号
7 K  C6 G2 O' A* S1 M, b2 z, x  g# _ {
& X; D/ ]; R9 s if(Irprot_LastState) //出现低电平后如证实之前出现高电平,证明确实是有红外信号) l$ _. |- P0 \0 t5 H2 J+ |/ {) M
{$ u, y( C' Z, R, p0 t- E) ?
Irprot_LastState=0;// 将接收状态清0! Q1 {0 {/ t* @6 ^
7 H; J* B# k4 Q5 @
if(HeadCode_Reced)//查询是否已接收过头码。有就进入解码,无就进入头码(4.5ms计时)
; Z, J/ ^; J% n3 w$ e9 \" l {, x' n1 g. o7 c" s! J- m$ v
vData4<<=1;# K' O" h2 S+ w8 i% a  n3 B
if(vData3&0x80){vData4|=0x01;}
' A0 u5 B% \! N* a! q( T) _ vData3<<=1;3 E) K6 n5 ^0 Q( d, D& K  n
if(vData2&0x80){vData3|=0x01;}
9 ^, t$ B1 l$ S& ? vData2<<=1;  u5 V% N  O9 C* K0 j/ Z' ], F
if(vData1&0x80){vData2|=0x01;}: J! t4 Z9 `" U, i  W0 t* H. A9 J
vData1<<=1;3 X; t7 s" y. \( S2 W* R4 Q; q

! N. t% n# q" M) G+ f' O        ; m" D# W' r7 N0 x( d2 {1 S

% [% c* s0 O+ F! |/ T: x. \; I, y if(codeTime>15&&codeTime<21)//若头码已接收过,则判断当前接收的是1码或0码 //FTM2->8-<16-11(125*11=1.375,示波器读出0为0.8ms\1为1.6ms)
. j# w4 o( A# Y+ r1 w4 S+ B6 V8 i7 M { //HFJ->15-<21--11(125*15=1.875,示波器读出0为1.2ms\1为2.4ms)# H$ R1 y0 r9 B! U
vData1|=0x01; //两个下降沿之间的时间大于125us*11=1.375ms,条件满足则接收的为1码
; `8 s, T" @& S2 z1 ]! c }
7 d" ?. ?5 N3 X" Q! S; u4 L& y else if(codeTime>6&&codeTime<12) //HFJ->6-<12
: I2 S4 y& ^1 ?, S //FTN2->3-<8& h" ^% g2 u, H' @0 c1 I) d
{5 [2 c5 t6 H0 w& h
vData1&=0xFE; ; //两个下降沿之间的时间小于125us*12=15ms条件不满足则接收的为0码0 H, d/ Z9 L# z0 `1 R
}1 }& ?3 r  a" {8 W' s1 R
else 4 f& N  G' U) T3 K7 y2 ~
{5 i6 i7 e5 B9 N! @* f1 \8 _
vData1=vData2=vData3=vData4=0;$ m  j) d# l" N" s- Q
HeadCode_Reced=0;
6 n0 J( S/ [6 C& N5 Z }, `- `0 y- ]- N. O( r  O  H! _9 R# U
//-------------------------------------------------------------------------
! E( J! h7 q5 l( W6 i codeCnt++;
% C& H& s% M! C0 H5 { if(codeCnt>=32) //一共接收32个信号位& x" b6 J7 \+ q( k* u$ j& g4 `
{& e* E8 U# I5 \7 v$ O+ H
codeCnt=0;% _$ t3 G5 U% v- s/ o
if(!Ir_Dealed)/ y5 ]' G# m& n9 j; f
{
3 S7 T6 m& q/ r+ Z9 a2 W Receive_OK=1;0 a" m3 [! Q" ?: P
       
9 h: C" T3 p" s' e }
) Q  P+ |; M0 z% E }
) @& e/ l+ W8 z  v5 G" f5 ~       
* o5 I$ q& q8 Q) \# E! k2 ^3 A codeTime=0; //接收完,将时间清03 n& k0 Z* z$ Q! M6 S
//vData1=vData2=vData3=vData4=0;
# A3 t3 g* s4 m2 [6 D  p& [0 P0 m1 ?+ ? }
9 [6 G. d+ F/ F6 K 1 r2 q6 o6 c. v
4 k7 V& n) `5 r& R, j8 b# N: g* }
        2 t7 T1 Q! K. A7 h: W% K% z$ a
else //头码总计时
# |# D9 E; D7 T/ \ {  O4 \- q1 l# w# _6 q! w" C
if(codeTime>=80&&codeTime<120) //30 46(FTM2--3.750~5.750计的是低电平+高电平的总时间,即两个下降沿时间.示波器读出是4.9ms)
4 o" L9 |! W2 d1 c. |7 q3 X4 O { // 80 120(HFJ--10~15ms 计的是低电平+高电平的总时间,即两个下降沿时间.示波器读出是13.6ms)
6 o0 K' g0 h7 ? HeadCode_Reced=1;
3 c+ K- m3 C7 A, j }
  m; \. R7 ^' h else
1 c  E6 [9 Y' Q4 m) P {
) u5 P! Z  j6 x  W+ J- V& ~" B  O HeadCode_Reced=0;
/ a0 O" H) z6 F5 [7 _. @ }
* [% d+ t- h! E codeCnt=0; //如果是第一次进入则将码计时时间codeTime与码位codeCnt清0. t3 R! o0 x7 c9 k, C$ H
codeTime=0;- j7 z: C/ c; I! U1 ]
}
) J0 l: P! Q) S/ O% |# N; I }' _& U6 @$ _7 q, x! L7 u
}0 [7 c2 Y+ G% K, A, E- b6 Z# q

7 N9 x$ `: C# l}

手机扫码浏览

classn_11

发表于 2009-11-22 20:54:59 | 显示全部楼层
CODETIME已经限制了最大等于80后面的 if(codeTime>=80&&codeTime

classn_11

发表于 2011-8-16 14:01:27 | 显示全部楼层
长时间没来看了 ~~  

classn_11

发表于 2011-12-28 03:17:17 | 显示全部楼层
你恩雪的太有道理啦.有道理!
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|手机版|小黑屋|最新贴|维修网 ( 粤ICP备09047344号

GMT+8, 2024-6-6 13:06 , Processed in 0.264058 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表