EDA365电子工程师网
标题:
遥控器解码
[打印本页]
作者:
深圳奔
时间:
2012-8-19 21:03
标题:
遥控器解码
#include <reg51.h>
0 @ f8 p$ ~/ F- h W
#include <intrins.h>
6 C$ G8 e6 i* p5 u& N# N6 Y7 E' y
void delay(unsigned char x);//x*0.14MS
& E+ K8 }2 e9 ^+ O
void delay1(unsigned char ms);
" c; q( H" Z9 Y" o! w/ X: s( H8 ^
void send_char( char txd);
; _( k& F* D) [1 v1 K5 b
sbit IRIN = P3^2;//INT0(外部中断0输入口)
/ n7 N! R" A/ C5 P! E, R
typedef unsigned char uint8;
/ g! K4 B& Z& m, P! y
unsigned char IRCOM[8];
) i8 c' [' K! k
unsigned char code table[16] =
" }: g+ T+ p" w4 ~
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
4 z' Q7 Z; h8 b
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
. ?) S0 g0 \" |2 U! C, k: ?8 ~# b4 w; Y
/*波特率:9600*/
0 ^7 r- [* p) \ c3 Z2 g+ g
void uart_init()
- s( N* |) w. ^5 J
{
" v6 ?& f: [: I @2 A$ {
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
2 `" ?. J I; v& K( G8 `$ s ]
TH1 = 0xFD; // 波特率9600
* [; i, l( H4 m2 A J
TL1 = 0xFD;
" R* A9 {# ~% _5 N3 X6 k
l& }% O% W W0 ], Q4 [, l
SCON = 0x50; // 设定串行口工作方式
7 [2 E' Z! t! J" k% e0 i
PCON &= 0xef; // 波特率不倍增
6 J" k' |" s Z! Z7 ^" r
. `2 j4 M# l1 C/ g3 ] r) C
TR1 = 1; // 启动定时器1
/ w1 h* ~) y2 d3 z1 {. s$ e. W2 c
8 B$ I& N: O# i3 ?
}
3 A7 v- A0 N* i# I' N4 ]
/*UART发送一字节*/
/ [9 W7 K I* y
3 V; r% U1 p' X4 r
void send_char(unsigned char txd)
Q5 |# P+ P' C, K! I1 \" P
// 传送一个字符
# O6 U9 F6 @& @2 {4 u0 {$ C7 Z: \
{
0 M0 G; m6 ~; f: e0 [0 h; D( T: R
( q( s2 P9 S+ j% m" c+ Q
SBUF = txd;
' D. o) z# X9 H( X' P. j
while(!TI); // 等特数据传送
9 F o, n" z' b# e K7 u
TI = 0;
% ` Y C& i. Q# j' i+ t+ H* M3 k
// 清除数据传送标志
& t# Y1 d6 K3 [: Y6 D
}
2 s, ^8 }: Q) S- l
main()
1 B5 m4 u6 f9 {) R [' Q& Z! n
{
1 s, Y3 z: i5 n& t# A0 ~ u5 l1 _
6 b% C M2 C) O
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
$ d8 b$ H; A( q
TCON = 0x1; //触发方式为脉冲负边沿触发
( z/ Y$ d: r9 F7 A. W8 z
delay(1);
4 }4 `$ ^5 G. X" a: z
& V& w- ~6 h# a- a8 U
IRIN=1;
, X, Z5 X4 \ m; |% V
//BEEP=1;
2 ]0 |4 e! c1 A& J( J- F1 x# l
//RELAY=1;
. Y$ C- }- N) |, x5 Q
for(;;)
( T6 i( |3 X: Z H3 u ^
{
: l+ \" Q. J \" X% \
uart_init();
7 Z' T4 I% w$ K# w- N5 ]7 i; o
; m1 v" C! M' y' Z. K+ ~8 P
}
, Q9 c$ y, l" D4 F- h
" h! G! V7 y/ {
} //end main
" M0 f3 K, w" T' f6 d _2 x
//以下是中断服务程序
* }6 T0 V! M4 r0 a1 u3 T2 Z: l
void IR_IN() interrupt 0 using 0
3 r) d+ {9 |6 O& \+ c
{
# V" S$ E" J. p
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
9 I7 u9 g' m5 q: z+ t+ x9 O! g
EA = 0;//禁止总中断
) {5 ?' p5 }: H$ V
I1://标号
7 l5 e" V) F5 Y a. Z3 _
for (i=0;i<4;i++)
3 h5 q% d7 |$ s6 Q& h- ]
{
7 I7 U5 M$ ^, c+ C6 M* L; B
if (IRIN==0) break;
7 H9 G3 @: Y$ t, z$ j
if (i==3)
6 S6 s7 Y1 u. V) U) Q% D1 X. [
{EA =1;return;}//如果i等于3就打开放中断
# I. s0 @! |' W* ]9 s i5 v& ~
}
# G* D3 L; }% r; ]; E; W1 W& s
delay(20);
1 @8 f0 m6 K+ \8 \+ w- w: m
if (IRIN==1) goto I1; //确认IR信号出现
& G$ X9 b2 J# U
while (!IRIN) //等 IR 变为高电平
4 T+ s6 N% [0 I3 h7 E# y
{delay(1);}
+ s- {+ K& A6 ^
* C' @* j5 C; L# W" A! e% ^6 A& a: O! G
for (j=0;j<4;j++)
1 [. k2 U. g3 w3 R
{
9 H: W' G) v# Q: `9 e& J5 K
for (k=0;k<8;k++)
, S9 e8 y V$ o# a) \. \* x7 s
{
8 ^( r) ~* Z( n; N# ~) m5 @4 K
while (IRIN) //等 IR 变为低电平
7 J E* ~& S: c3 M+ O$ k
{delay(1);}
2 t# j7 X* S2 d: M# V
while (!IRIN) //等 IR 变为高电平
5 l @ G3 N8 V
{delay(1);}
& f4 l' ?( X `1 p
while (IRIN) //计算IR高电平时长
% L! w- q! z7 {( ^5 }1 u0 P
{ //如果IRIN等于1的时候就计算delay的个数
2 s" j! z- Q# `! `7 c
delay(1);
( O' G. b7 x# L1 J3 I
N++;
! s1 _2 ]. R) g5 B3 X4 ? h
if (N>=30) {EA=1;return;}
" i! i4 ^& c. B! x/ ]/ N
}
$ \) V. B& Y( J: f
IRCOM[j]=IRCOM[j] >> 1;
+ A8 n: {) f: j1 `4 n0 x. _' E
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
) p5 R N+ V5 b" Q6 r1 r$ l0 G
N=0;
: u* V, [: c7 z# l
}//end for k
" ^8 I0 `: [8 q8 D# e
}//end for j
$ |2 C# O" u" V8 G4 p
; V# Q; ^% g; c4 s% o
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
+ @0 W+ L7 { b5 C" \
IRCOM[5]=IRCOM[2] & 0x0F;
7 m# K9 P! S% g3 D" I/ o2 d
IRCOM[6]=IRCOM[2] & 0xF0;
8 p. {4 A/ o! `1 |
IRCOM[6]=IRCOM[6] >> 4;
; {* j* q! Y+ u
// beep();
3 w3 w) ?# k# N5 _( {
EA = 1;
8 S9 l: }) \8 w2 ]: f, r
R0 }4 d+ x% w+ M
send_char(IRCOM[2]);
/ j$ ~/ @$ w! z5 B, u# I
. {: l/ ]- Q( R7 J& [/ }
}//end interrupt
, V( G* e9 w9 e" R5 ?0 _; y
5 n8 C1 M5 x |% g) r$ P
//下面是延时程序
. Z/ J- s" g. [' E) N0 P S. \9 ?
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量
7 F2 ^: U+ b3 H5 N r2 [, \
{
, \5 g& _- \' j" ~+ f
unsigned char i;
& S7 h, n/ K; P
while(x--)
0 Q V: l; q) x
{
- f/ R+ @; F* y: z2 H7 g
for (i = 0; i<13; i++) {}
! X, H* R. [0 X/ i# K& p
}
' h3 {# n7 U* G" P6 H
}
8 B1 X. B# P" c7 {' \
. P/ @6 }" ]( e' Y6 |( [7 w
//下面是延时程序
0 L9 D+ y9 h: r
void delay1(unsigned char ms)//unsigned char ms是参量
3 R5 f1 P. Q6 f
{
$ ^8 G6 w8 d4 y, r! ?
unsigned char i;
O5 X, I5 l* B' R+ W
while(ms--)
; M8 Z( u/ G5 v4 `# |
{
2 H) c6 I5 s2 [7 ^7 i- d1 f
for(i = 0; i<120; i++)
: ]8 y- A8 l1 G* G7 V
{
, e' E) K* ~9 l. Z' g5 `8 H
_nop_();
# ]7 q" y& Q; E$ M) n2 D/ v- R
_nop_();
; v% L2 a. U }: C- h
_nop_();
2 ]0 F" I; ~% O$ g
_nop_();
8 W5 W- Y' n% H. g
}
( ?' o7 @2 D) j; t
}
! F8 A( W6 J3 S; Y
}
作者:
liangkai520
时间:
2014-7-18 13:56
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2