|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
$ _2 i# t( S h! g( P( |#include <intrins.h>5 B& B9 O; i% {3 M' g' {
void delay(unsigned char x);//x*0.14MS2 _+ `9 r9 b! J/ q; X
void delay1(unsigned char ms);
3 F8 U) a8 j6 Z- I3 svoid send_char( char txd);
7 i! K' C5 P& ^sbit IRIN = P3^2;//INT0(外部中断0输入口)
' G5 F& v4 F0 o. {- Z. Gtypedef unsigned char uint8;9 B- [3 f1 C4 @; X. {7 S9 M+ S
unsigned char IRCOM[8];
; e b( }* \ D6 ounsigned char code table[16] = . S# M. D, I1 t7 x+ l A; S* ^5 |
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
: c) o& M& `( R, N4 w7 p 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
6 ~1 S7 p4 n x/*波特率:9600*/+ D/ G6 c) f% N& P
void uart_init()
% k, s/ w7 u2 z8 R4 h5 [{
; f0 U1 b3 U7 p' | TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率0 Y2 e' L7 K5 {+ `6 M
TH1 = 0xFD; // 波特率9600- a/ V0 z8 _1 t3 w; M
TL1 = 0xFD;
) _" W/ a f: G L3 F- d& M4 ^
+ w# K8 j+ v7 a. G" x `+ O$ G SCON = 0x50; // 设定串行口工作方式+ Z t" l8 V V9 z
PCON &= 0xef; // 波特率不倍增
( X6 m' ~/ s/ N) @/ X1 `1 n
8 J6 Q1 I" l% X, a- W6 y/ g5 C p TR1 = 1; // 启动定时器1
% }, O0 ]+ T% n, B4 H
: W* W1 |* C- x1 ^% t$ U5 X}
0 v }. E# B3 }5 N; A9 a/*UART发送一字节*/ Y4 A# Z4 L' ^7 L! A [
# N( ^3 Y6 ~7 p0 K
void send_char(unsigned char txd)$ b* g0 w! e- v
// 传送一个字符
( q G% X' U/ c4 |) |$ K{8 J; ~. U; E1 c7 ^% \- w
: j' p) i7 V* Y7 a+ s" P2 D
SBUF = txd;
9 W- ?2 k( i) c# { while(!TI); // 等特数据传送
/ d( M- B" O; z! \ TI = 0;
, k0 [0 ]" ~8 T6 }. F/ x6 P- m // 清除数据传送标志
9 x( v& A9 A0 |/ |5 l}# C, k' h7 \2 t. O& ]& h% n4 X/ D
main(); a) }0 G x' h' l( n& A
{
5 p4 ]; D" G8 x2 h% c * Z" S, k5 D8 J
IE = 0x81; //允许总中断中断,使能 INT0 外部中断& o1 z6 N# t# I; ]' c$ z& ?
TCON = 0x1; //触发方式为脉冲负边沿触发. c4 x5 ^" t: C3 g
delay(1);+ O t& I! `/ f) ~, c2 e' ^8 z
; Q8 @. ^6 `8 L2 {6 S; M: E; U1 p
IRIN=1;
7 n" k/ c/ P; G! H+ X4 T5 m( {4 ]8 \ //BEEP=1;4 H3 _" a8 F$ ^
//RELAY=1;8 B: G! w7 S9 D7 {* C
for(;;)6 u% \) g8 v1 e- Q
{' R, c* h: H. P& e: m z
uart_init();4 Q* ?% I) T3 p
) k2 c! k* e" k, V/ L' x) X( \
}
% @" D4 z) \8 W
6 ]- z& Y8 E/ a7 ?( b7 T} //end main, `$ u. j! K* U$ X
//以下是中断服务程序* n* n @9 z' T4 E# h
void IR_IN() interrupt 0 using 0
# L- }" A; S- Q' }" p. G) t. I{
2 g+ B0 m/ ^$ N+ }* O unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据* j7 e) @3 P# |9 W% W5 `
EA = 0;//禁止总中断
% `$ V- v7 {6 a8 YI1://标号+ C* P* m; A* |
for (i=0;i<4;i++)
' I2 v. W1 W2 [' ?7 \% h {
# G: }3 w6 v) P5 _# b if (IRIN==0) break;* I1 A* {( S; Y" t# s6 w* |* @
if (i==3)
! j. z8 `+ T& n4 q {EA =1;return;}//如果i等于3就打开放中断
" N7 S! J" z. w! \2 F" Z }
/ A' ?$ M+ M" N$ c2 p4 ]; | delay(20);: P8 \. e3 ^. M0 O
if (IRIN==1) goto I1; //确认IR信号出现
& q: r0 D: Y a7 H while (!IRIN) //等 IR 变为高电平
8 `7 G [ a |0 a& A {delay(1);}
; x+ ~6 J l* [; x, @
4 A. s% N/ s' t: g# } for (j=0;j<4;j++)4 c! R& L$ |0 |2 o& _
{ % n9 O: H( M l2 X \# P
for (k=0;k<8;k++)- p4 e* `3 ~' m' Q0 v2 o4 r
{0 q+ [: \$ ^3 r4 }0 n
while (IRIN) //等 IR 变为低电平1 W* ~+ V8 R9 Q3 Z; G$ I
{delay(1);}
3 x4 r. p5 S+ i( n, t8 x while (!IRIN) //等 IR 变为高电平0 l4 T+ R1 }. C9 z( j' J+ z
{delay(1);}% q3 ^/ k0 S: n$ L5 C7 r
while (IRIN) //计算IR高电平时长( R6 y2 a6 X) M. v
{ //如果IRIN等于1的时候就计算delay的个数
0 q/ X! q2 a7 ~" `4 I( E( }5 k+ o" B delay(1);- w4 H! V4 W( q; S0 L, M. B3 t
N++;
! \) k* |; t, e7 X8 ]/ v% b if (N>=30) {EA=1;return;}) q' Q- j3 `$ ?( k; x+ y
}
1 t3 y0 R5 p% w( S3 e, G9 I- }/ K IRCOM[j]=IRCOM[j] >> 1;
+ t( |) Z$ d2 I; w" W2 Y; m6 |8 _ if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}) G# r3 K( U7 S5 U6 r
N=0;. h; o$ }5 f& g
}//end for k: D, O2 @) `# s
}//end for j
5 ?& X2 Y, @. U 5 F% M/ a& S6 G
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
7 N: y+ T M4 ~1 z7 {* Y' _" f IRCOM[5]=IRCOM[2] & 0x0F;
! n+ P, \, I6 s$ E! Y; _ IRCOM[6]=IRCOM[2] & 0xF0;$ w* Y9 ?$ d J7 }7 l
IRCOM[6]=IRCOM[6] >> 4;8 P$ d, r* J. J; a% U1 V/ ^
// beep();9 G. y3 N" J. ? g" o( q
EA = 1;5 a. h% @1 F' p( B' t" D" H
7 C5 g5 B' ?# X send_char(IRCOM[2]);" r: w" P7 j0 `* L q
% P6 k' x' F* X+ n0 d8 q% \0 m
}//end interrupt
( C( a( Y6 g; U; g! K, d) V0 _1 r4 j0 Q- P6 ^/ |3 i4 U/ U
//下面是延时程序
l( S, L' F) j" i- ^! evoid delay(unsigned char x)//x*0.14MS,unsigned char x是参量% t2 U& M: `4 s6 P5 z
{
) i' }+ H2 d. A unsigned char i;5 Q4 M% C8 k6 ^7 K( Z, [' t* p
while(x--): P( x2 Q! K$ H4 l& [
{3 ?9 x$ S! |1 C3 i6 y+ k; ^
for (i = 0; i<13; i++) {}
4 K& {; i: X$ P, B }, o. B& E& g- }) Q' R
}- c7 h# ?5 J9 S h: o
1 F2 c1 j3 I5 |, m' y' f% i//下面是延时程序
( M6 t [& l0 W p3 tvoid delay1(unsigned char ms)//unsigned char ms是参量' y" g: \0 b7 X5 T$ `- m$ N y
{
) f+ W6 ], t0 ?& h# g unsigned char i;, y W8 q7 @. v9 K3 I: [- N! t* W
while(ms--). m3 S/ Y) r1 a3 s( k
{
h, O* ^* s- J% g for(i = 0; i<120; i++)9 L1 k6 @1 c1 M1 |" N
{
! b$ v/ n5 p9 D$ y _nop_();1 J- t$ W' `* f+ F# J j% ]
_nop_();
B$ v2 ^. w5 y" F: w y _nop_();' |* |7 v0 G4 q
_nop_();9 g* x, e/ ^" `% S. v* p. Q
}
4 U) F) {; N. L- E2 ~' `3 E }9 a$ E$ A6 T- J: _0 x) \- ^, d8 i
} |
|