EDA365电子工程师网
标题:
遥控器解码
[打印本页]
作者:
深圳奔
时间:
2012-8-19 21:03
标题:
遥控器解码
#include <reg51.h>
! s( q( [/ U; q; x h- G0 E, J
#include <intrins.h>
$ D B' W4 k& n7 n0 ?% {
void delay(unsigned char x);//x*0.14MS
, a( I6 @1 c. G; a; a
void delay1(unsigned char ms);
/ \! j2 V. b" w, y4 N' p# j2 }, g$ T# \
void send_char( char txd);
+ r; u9 V8 O) k8 P1 C
sbit IRIN = P3^2;//INT0(外部中断0输入口)
D( H8 C& o" ~3 e& Q* I0 y+ N
typedef unsigned char uint8;
' z; Y( L6 o& n/ l" e
unsigned char IRCOM[8];
1 m/ Q l2 k2 n& B, \1 Z' ^
unsigned char code table[16] =
+ Y: n6 h- ]2 T: }* A* B/ [
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0 Z3 V. B/ F+ k9 B. z
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
9 K) ^! y) c+ @6 ]2 o8 u# V
/*波特率:9600*/
0 Z6 c+ `% y& M0 V9 I
void uart_init()
3 O$ Q5 T( A# L
{
- ]* q6 r# X6 O/ Q% A
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
+ J0 X$ [+ \+ o1 D& Z5 n& X1 e: [
TH1 = 0xFD; // 波特率9600
) t* k) w& R% B7 S1 G
TL1 = 0xFD;
( `8 w/ H3 j+ @/ n
, a2 E5 F% m1 ]' I* z3 B
SCON = 0x50; // 设定串行口工作方式
& R5 |, L$ l% Z: G: u
PCON &= 0xef; // 波特率不倍增
; S! f: b$ R8 o, m6 h# ?
& v7 A, q1 E' O
TR1 = 1; // 启动定时器1
, @/ T& Z/ e* I, h8 Z
" [. i* f) w2 _) z: a3 R V0 R
}
' C/ p, _. H$ S# G9 Y" S
/*UART发送一字节*/
6 D: E) Y, s; m6 e" l
5 A# u+ r$ T3 z' u9 m1 O! R
void send_char(unsigned char txd)
. `" U2 Q+ S, S
// 传送一个字符
* d* v8 L' {+ G1 q4 k, S
{
5 n- j* n' D( B& z& V$ C! L( I: o
& K) c- k* q: _, A
SBUF = txd;
9 F* V/ T! s3 w J5 s" e! G( ?
while(!TI); // 等特数据传送
+ ?3 E M" N9 P6 M% e
TI = 0;
0 C9 b: }5 @4 d x
// 清除数据传送标志
K* ~6 N4 l/ f6 S
}
' I) I! T$ A5 n
main()
) `9 X! X' V, ?
{
; F/ e- u# d$ i( P+ F$ l7 b
Q Q% q) Y' L6 \" [
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
# s3 A! v0 [ m
TCON = 0x1; //触发方式为脉冲负边沿触发
/ N9 n' n2 k" p0 B8 M( s) `
delay(1);
$ F8 x! z$ Z: X; f- O) \ ~( m) e2 L
% ?# p3 z8 L5 F$ p6 W
IRIN=1;
7 E9 x b8 w+ ~$ {, i4 w
//BEEP=1;
# J' @3 ]0 |0 O1 n1 }
//RELAY=1;
9 D) ]; h! w/ ?* s. H7 d& I
for(;;)
5 D S P6 k, Y# r/ E+ _2 f
{
& E: C" V1 @- A4 E' q1 _5 Z
uart_init();
" M+ a, N+ ^# F7 Z( N ^4 C! W$ a5 g
/ I2 h8 F4 d" M: S# F( u
}
, k0 O3 g! I7 Y) G
# C4 \( e" Z2 j* A9 K [4 |8 y
} //end main
# l6 G0 S8 u/ }: B, r! r
//以下是中断服务程序
; A6 N# J) h ], e
void IR_IN() interrupt 0 using 0
9 F" h" O2 O2 f+ d
{
" o! \5 T( S3 i1 q
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
9 X1 m+ D& \3 C# c: k
EA = 0;//禁止总中断
+ j+ ?1 Q, Y" U% I, o
I1://标号
/ y+ e( F# u: M
for (i=0;i<4;i++)
" C6 x# K, u- _" d- u4 d; \
{
) p& s- v/ |( v8 z" N3 m2 ]: E
if (IRIN==0) break;
1 F) c5 E- _6 R$ x$ m: {. ~; M
if (i==3)
7 `% p+ c, r1 }
{EA =1;return;}//如果i等于3就打开放中断
+ U" ]4 g/ ~1 b. C# ?
}
; @" U+ S+ w8 f- K- y
delay(20);
) `6 l' z" C& J; `- M2 u
if (IRIN==1) goto I1; //确认IR信号出现
; {# }' C5 u8 h; C7 ?/ _6 |% P _
while (!IRIN) //等 IR 变为高电平
) R5 Z2 N M! [5 Q( B% u) J
{delay(1);}
2 k( ] @2 v2 H3 |
8 B/ F& K3 C x4 P# v
for (j=0;j<4;j++)
" n% H2 b# n" q9 g% Q
{
: x& c" }1 g) R! y
for (k=0;k<8;k++)
) i2 R# n( K; i
{
+ v+ o6 |. R/ J& `3 n3 v
while (IRIN) //等 IR 变为低电平
0 u. _3 K4 A; O4 e. }
{delay(1);}
2 d7 P1 z( c* ?9 g
while (!IRIN) //等 IR 变为高电平
" Y. j$ F: b/ V$ p
{delay(1);}
; A; x- I3 U4 ?3 K8 m+ x1 |) x
while (IRIN) //计算IR高电平时长
/ t( r( n2 r5 b1 p2 z8 ?
{ //如果IRIN等于1的时候就计算delay的个数
/ o) V1 q- A4 W+ X& G0 b
delay(1);
8 D% J5 S3 h+ ^' e* @, s& @
N++;
# H3 R. d% d$ h8 R( @
if (N>=30) {EA=1;return;}
4 ^- ? q4 Y$ S9 u
}
; s6 G3 {! {! z$ e
IRCOM[j]=IRCOM[j] >> 1;
; [! j9 Y# P, n! A' z- J: k" x
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
8 Z* T7 e! T6 U/ r6 ]& Z% {. h+ X S
N=0;
2 S) [1 {! N9 F) v2 `6 c9 d
}//end for k
: k8 O3 l5 j2 D- I
}//end for j
& }. z2 d3 X. a1 i1 T% E6 C
# b3 u4 ?# c: Z
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
+ Q; L/ {4 t" ?
IRCOM[5]=IRCOM[2] & 0x0F;
" h% T9 |( ~9 D$ P* s
IRCOM[6]=IRCOM[2] & 0xF0;
2 b- x" f8 A ]$ a( e9 H2 o
IRCOM[6]=IRCOM[6] >> 4;
, M4 e O4 p/ N
// beep();
# b j/ G8 r6 T* `8 _
EA = 1;
9 w# y2 ^% j( T4 ?8 i# q% w, z
8 V3 l. X4 b' ?* n/ J, N) K
send_char(IRCOM[2]);
. l: Y8 a8 y' |. r* N3 U2 q+ D
* q& x8 d7 ]! X8 W2 Q/ u
}//end interrupt
% n, I: c7 ]! t! d: s; K
' d. r/ S$ J$ X4 ?( w& E3 N
//下面是延时程序
/ ]; X7 r0 U" j4 J
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量
6 F9 Y: e# p( n! f
{
( y5 |* w. B% [8 r$ {& O% f ~. L
unsigned char i;
7 w$ d* Z, K8 s" d7 Z0 D
while(x--)
7 z- t! X' T) t2 |/ S
{
7 L) @% b+ _0 K, a' \) ~8 d& a6 ?
for (i = 0; i<13; i++) {}
$ y! u- H: d3 i. {* [
}
7 @+ Z, w$ {5 {
}
( u; T1 w) q# `8 [7 U
# T( V: _# `* z% O$ b! u/ N
//下面是延时程序
. U& @9 m3 q; |: L" G4 Y
void delay1(unsigned char ms)//unsigned char ms是参量
& d7 Z1 E( a7 C: ^( W
{
( V, y: y {0 G' e3 r) }) S
unsigned char i;
* ]& ~! K' \: Y% O. {" I
while(ms--)
7 z- w# f6 Y | g4 m! q# d
{
1 K( ^7 F6 G& ?0 ?+ n& }
for(i = 0; i<120; i++)
! L' O# Z) j2 j) v: B
{
$ n3 K; Y' n* n& G( d5 J9 |5 d9 s
_nop_();
O$ a" x3 p* Q9 r, o
_nop_();
7 o- ?, _$ c. \- z3 L: H
_nop_();
+ H7 ? {- b& v* o4 c: _
_nop_();
5 u/ n" c B0 n8 O
}
9 H* Q2 H* L l p
}
1 o. ~# u' z. X, n y. ?
}
作者:
liangkai520
时间:
2014-7-18 13:56
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2