EDA365电子论坛网
标题:
遥控器解码
[打印本页]
作者:
深圳奔
时间:
2012-8-19 21:03
标题:
遥控器解码
#include <reg51.h>
6 D$ a( H) x+ O- e
#include <intrins.h>
) @0 d, L5 x" R6 t3 X
void delay(unsigned char x);//x*0.14MS
' L- `3 s5 F7 h: Y7 n# @
void delay1(unsigned char ms);
# q# J, E3 a* U; i- t: h. ?8 H
void send_char( char txd);
1 {2 i& I# z' p$ ^% w4 M
sbit IRIN = P3^2;//INT0(外部中断0输入口)
* b* J+ Q3 ]) i% R
typedef unsigned char uint8;
& N ?' d9 e7 o4 c% _% Z3 z
unsigned char IRCOM[8];
6 [3 ^' P4 Q( q! l9 w. a
unsigned char code table[16] =
) S% u' ^6 a5 g
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
# D1 h2 T1 d0 J
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
* h( G6 M: [, o" m. A
/*波特率:9600*/
$ {3 Q! {" C" }: p
void uart_init()
1 i! c( p, v0 _% n: n" G
{
9 D, Z0 O' H/ L& l. s2 j" ^
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
( r& n8 u: ?- l' X2 r; e
TH1 = 0xFD; // 波特率9600
3 Z6 d( d; B$ ~, B1 J8 W" R( U' w
TL1 = 0xFD;
3 Q* K$ ]! @* B. l( M
' F6 u5 e- V4 g6 ]% ~; f* S! f& }
SCON = 0x50; // 设定串行口工作方式
" _) v% N0 M9 d8 w' y. h( P' v
PCON &= 0xef; // 波特率不倍增
. U p1 {/ A1 m# n4 d" P
T4 m9 m5 B3 K3 I: c
TR1 = 1; // 启动定时器1
, L3 w, [* U# B4 w
: G) m& g/ A% g
}
* m3 W% e# ~% V/ G; H' L
/*UART发送一字节*/
$ W2 T# B- R; \. B9 e1 m' K
3 }' _4 w5 O; H8 D, s
void send_char(unsigned char txd)
4 @. }5 o1 I, Y, S
// 传送一个字符
0 c1 Y M) ]. P& ]
{
( I& Z- g) Y# t8 `$ |0 o# T
+ N4 N( p% ^ o! D( p
SBUF = txd;
, P, z: R: t, @3 L3 n( Y
while(!TI); // 等特数据传送
& n1 V$ O2 K7 E& I: B H
TI = 0;
: A3 D" P! i0 g* r$ m
// 清除数据传送标志
0 K& L& J! D/ Z5 J: H
}
8 V/ P+ {0 U2 q2 Z$ b: O: K" i4 K
main()
. ?7 Z# K* {3 W
{
/ O4 R/ S8 W2 @6 Q
! x5 v3 @# l Q
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
6 f1 x% x" W( e' q3 P, B
TCON = 0x1; //触发方式为脉冲负边沿触发
' i8 O; A( f' ?& I$ ?+ K q7 a% u
delay(1);
0 Q' V7 A$ p7 \' N7 J6 T1 |
5 d$ a# G& E+ J1 i0 C# F
IRIN=1;
: [+ ?4 h! g! Y' H' o8 L
//BEEP=1;
$ h' ~/ R$ v" P6 Y* ?
//RELAY=1;
/ L: J. G' F" y- m) l
for(;;)
" }( k, [: } ?3 o2 R
{
& O6 @* {7 F7 ?) g
uart_init();
# v: _% W* v- M7 r- Y
: R7 C/ [: ^; y! E
}
/ ?/ A0 a* b H( Q, C2 O3 Y
0 }+ p3 ?' V" L3 \
} //end main
: R& c: ]! i- V4 q# r( w3 |
//以下是中断服务程序
/ Z# E7 }% `# f& v$ P
void IR_IN() interrupt 0 using 0
- z$ ?( P L9 M- Q$ j$ B1 V9 ?" C
{
3 G: e" p+ T3 z& f8 D# _
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
* L9 I1 A5 b* o3 r' K. }
EA = 0;//禁止总中断
2 K: O/ Z: [* [! k1 e
I1://标号
. u T/ T. l |$ M3 N. ]
for (i=0;i<4;i++)
8 ~" L: ^$ `& g+ M* _5 ` h2 @
{
' Z- F) C" l( c* O* t5 `* L3 ]
if (IRIN==0) break;
; e4 y$ U' S& ?; B
if (i==3)
' E+ v7 u3 g3 O: ?/ g& R+ c
{EA =1;return;}//如果i等于3就打开放中断
( H2 R$ F! u* y6 ] k. \6 m' ~
}
& E( r6 W, U f! @
delay(20);
2 p5 g) q0 G( V0 I" L; z
if (IRIN==1) goto I1; //确认IR信号出现
5 a( g9 S" M" I4 a' ^& {( w6 f
while (!IRIN) //等 IR 变为高电平
' l! N$ O2 I: r" u2 f5 B
{delay(1);}
y* c# z( L# g% ~8 N% u
) `9 T1 Q& k3 O! U; q% z: N
for (j=0;j<4;j++)
1 w3 K, T& ]) J- W% S
{
/ a5 k' `9 d" u9 Q
for (k=0;k<8;k++)
: W; H8 q s4 p" D$ y
{
. \2 a ?4 T+ o! N
while (IRIN) //等 IR 变为低电平
! b$ O6 Y% h+ G' z7 _2 x: `
{delay(1);}
; u! o7 c; ~( w' T, F6 ~* V
while (!IRIN) //等 IR 变为高电平
1 V) A$ x# ?2 F; L p; e
{delay(1);}
R C& x( k+ k' i0 c
while (IRIN) //计算IR高电平时长
! E6 N5 m, ~' H2 Z7 R9 }1 r) X0 D
{ //如果IRIN等于1的时候就计算delay的个数
( J9 Q+ S9 S* L# w) S+ q( l+ {
delay(1);
/ e e0 u- r8 ` B7 [& |
N++;
( x- h+ H0 s; l1 s. _
if (N>=30) {EA=1;return;}
4 u! x8 [; t( O# P
}
0 {) a) s4 P3 {' N* s6 {7 `
IRCOM[j]=IRCOM[j] >> 1;
! H: r: g" P1 v6 H
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
2 f; `, P% U5 a: p' s1 d
N=0;
0 ^* P/ m- \6 F& p
}//end for k
1 p g% f* l$ `" z W6 D" A) U; p
}//end for j
4 K0 }8 k* P9 o1 n8 m$ w* L5 |
8 g2 X( ^; Z5 K
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
$ D" W! b! u6 ?4 J% z1 s0 n' p- D3 g
IRCOM[5]=IRCOM[2] & 0x0F;
# c+ Z% B3 H% y- x4 Z5 |8 x0 \
IRCOM[6]=IRCOM[2] & 0xF0;
/ R3 s4 t4 N" T* s
IRCOM[6]=IRCOM[6] >> 4;
8 s0 b+ L$ m% O2 |7 G! w0 w$ T" ~
// beep();
+ b- _4 h$ H6 {
EA = 1;
' i$ q d$ u* p
3 n2 R' ]: u7 Y& r9 n5 K: ]
send_char(IRCOM[2]);
J! |6 V9 O3 v* n# `( i2 g
% P5 l \8 F. F, ^% Z. d: `3 Y% Y9 O
}//end interrupt
9 Z! A0 b5 C, W7 h1 h( k; _
# ]' G- g5 Y% C% P" G3 }& j5 d
//下面是延时程序
0 V0 o) h+ |; ^# L
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量
3 Y0 m. j! x' R' A* S. ]; } N% P
{
! x% C/ v/ X! E; Z1 |$ j
unsigned char i;
^$ w" C$ W( h) K7 Y5 _
while(x--)
7 j! f: x2 m* D5 A: u
{
9 k8 \ V2 y' m6 J' a8 Y# Q3 b
for (i = 0; i<13; i++) {}
3 r2 o' m7 l4 N ?# n! f! G
}
- i g! n( |/ L6 D
}
; I7 i$ Q) D& _3 k* B
9 x1 ?; D6 X2 \
//下面是延时程序
0 i" g- b: ~- ?2 d% D, J
void delay1(unsigned char ms)//unsigned char ms是参量
" A5 R6 n7 _# T0 U
{
/ o% s+ a: _& t' R7 u
unsigned char i;
5 H; m0 P, W5 \$ p3 ?+ w
while(ms--)
$ g5 X1 n0 t" ]& R, @, Q
{
+ t s8 F9 O# ]1 e; F0 h8 i% F8 U
for(i = 0; i<120; i++)
+ g9 _& f7 M7 k3 j
{
1 \6 m' X2 R7 Y' W) }% P9 W" D5 k
_nop_();
4 M) T2 g, n* G/ X1 A0 t( U. _
_nop_();
3 u( v$ C5 g1 I( d- [. E8 C4 y0 b+ I
_nop_();
3 M4 q' F0 w _, P
_nop_();
5 o" ?1 t* R% x( d% \9 k J
}
; n. D& I8 l/ U
}
8 F2 _& C$ h0 {, t
}
作者:
liangkai520
时间:
2014-7-18 13:56
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2