|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
. Q7 a0 V+ f# Z2 y- q0 |) x#include <intrins.h>
7 F' o3 p( y/ I/ Q+ Q/ G- e4 dvoid delay(unsigned char x);//x*0.14MS
) G; x' k" M4 j7 a- X. }void delay1(unsigned char ms);
7 Y# Q7 y! Z4 [1 }" g, y& z( mvoid send_char( char txd);" A9 `( v8 }3 \. W% ]* l7 |
sbit IRIN = P3^2;//INT0(外部中断0输入口)
; _8 l7 V6 _7 W9 Wtypedef unsigned char uint8;
L1 W# h# n Y7 t7 Ounsigned char IRCOM[8];& t( K1 e7 g9 @* @8 f
unsigned char code table[16] = - n7 H, O6 \0 J7 A4 E2 t
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
! J% s/ ~2 L! o, t0 f 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F, U/ K/ U7 M( i" @7 \! ~
/*波特率:9600*/
& H9 h- a0 ^( L& o' `* R& h3 Wvoid uart_init()
) |, C- y ]" r4 ~ b{
2 B2 K# e, R& i0 z, b% d# J TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率3 K2 {4 c+ S' s
TH1 = 0xFD; // 波特率96009 z: z; n0 C; E& `* K1 R! \
TL1 = 0xFD;0 a/ T; m2 L4 m2 ?: P5 n
7 K3 b$ t: C, g& l) H6 k: B( ` SCON = 0x50; // 设定串行口工作方式
- Z+ d! Z" U% Y% e" n# }; x8 p PCON &= 0xef; // 波特率不倍增+ o4 ?, E4 ?! \
3 n' p' n, H, Q+ ~ TR1 = 1; // 启动定时器1
1 g \" n" O3 m5 j; S- ~ + \0 f3 G, J N8 `
}
" ^( Q) u8 s1 E4 S5 c8 ]7 C+ K/*UART发送一字节*/, | Q( R" E; O
- s8 m6 K. U* F8 @; n
void send_char(unsigned char txd)8 R( d" y! ~- h( J2 b1 y
// 传送一个字符" l& z: \9 @! N, v
{/ j* o8 n0 d, p( P* R- y
% I- I4 H/ B/ `' A& y( c1 Z SBUF = txd;
/ L3 C# s4 R; ~& H while(!TI); // 等特数据传送
/ |9 |* `1 B$ [2 I0 m TI = 0; ) n8 n* H# k& e/ A% B
// 清除数据传送标志 c+ v5 G5 R! W( s0 X0 P
}
9 w2 P+ h' |7 F" \ r5 J: Omain()
6 ]% J( D' ]7 |5 ~" B{
' T' d! j7 e6 L $ T% K: O) k$ P8 {3 E2 B) f9 L
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
2 x! _( x7 g% \/ | TCON = 0x1; //触发方式为脉冲负边沿触发/ T* P! q, ?: V8 |2 D, I. x! S
delay(1);
( e- |& E1 {+ W" w8 y7 c5 _ ' U) c8 K/ w% {4 ]4 r; g
IRIN=1;
3 O7 {7 [5 V9 p1 D //BEEP=1;; p/ S4 X/ G5 a2 ?5 u& ]
//RELAY=1;
+ ~3 V) Z2 M' I L- o for(;;); t h2 p+ B/ H9 ?
{5 o( U$ e7 a ^, k. a* M6 Q
uart_init();
" K9 I2 U) m5 p& `) M ; F/ H- k; o& q
}
2 v, f' o( W ^+ s( W$ K5 g+ ] ( J9 a1 V L& i9 s* H
} //end main" i& V5 P/ b) n, X& c1 w, A
//以下是中断服务程序
, U3 y( C @8 H2 zvoid IR_IN() interrupt 0 using 0
2 N" @5 }0 [6 c, Z0 S/ f{6 R4 E# U/ J6 \0 n; A" R1 i
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
6 ^7 |4 q/ \0 `/ g EA = 0;//禁止总中断- h: }6 Z! ~' @3 T3 v/ B
I1://标号1 H: n+ |& u! i5 g/ i. j" t, H4 K
for (i=0;i<4;i++)
, B. \4 Y. j1 P2 c3 A {
7 R% H/ X6 p: W& O if (IRIN==0) break;
o7 j! H5 A/ h+ [+ S, P if (i==3)! S# I6 K5 s. p+ t) w9 A# V
{EA =1;return;}//如果i等于3就打开放中断
/ F! w' S5 s% t% l/ } F1 I$ j8 L }
1 [8 D7 Y) O) Y delay(20);7 o6 v4 H( V' t. s
if (IRIN==1) goto I1; //确认IR信号出现
- B9 c i& E6 R* Z while (!IRIN) //等 IR 变为高电平
5 _3 Q% ]* X" j {delay(1);}5 v2 f; V- \( f/ O7 m
8 R# q' a# o5 \, f3 W
for (j=0;j<4;j++)" l' ~: O7 g/ |: \
{
8 F" M( l5 _) {; n9 | for (k=0;k<8;k++)
8 P6 m* }6 }* P5 C0 g {8 r8 A4 x; L* ?
while (IRIN) //等 IR 变为低电平1 w% ]6 a; y% W& n/ f
{delay(1);}' a9 n' ]" d9 ~9 _! x+ T
while (!IRIN) //等 IR 变为高电平
/ O8 Y. z" G9 I3 p) n6 B1 L8 P {delay(1);}
- x1 |; C0 T) i- Y while (IRIN) //计算IR高电平时长& m* J# i& S& V; F. |
{ //如果IRIN等于1的时候就计算delay的个数
6 d- [6 T/ b3 l9 e delay(1);1 [ Q e$ x% i0 f& w+ c: j" s6 K
N++;
9 e4 E) l$ o* ` if (N>=30) {EA=1;return;}
- k; J/ b2 n% }* Y1 q3 U }9 g$ `8 O* R9 Q* v( R
IRCOM[j]=IRCOM[j] >> 1;3 F( l' N- o- x8 y
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}# `- w2 ]; e1 F p
N=0;
6 K6 }; B7 Y4 X$ v2 j. ~ }//end for k
9 K, Q4 @9 o5 X+ c4 o }//end for j
6 @5 q# D$ D$ O- N ! `6 T9 p2 P' O) D/ A" z
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
* k* g. |7 f" |* D2 `8 o9 Q1 a1 T2 T IRCOM[5]=IRCOM[2] & 0x0F;, H+ U3 K0 h, M
IRCOM[6]=IRCOM[2] & 0xF0;
7 h. y7 J$ [: s: o- C2 W1 B) n IRCOM[6]=IRCOM[6] >> 4;; R4 Y! Q% q, _6 h
// beep();( H6 h& @. W9 C0 \5 J
EA = 1;+ q9 L! ~' t B' i( ~
8 j) }: k; V N0 K# d* M
send_char(IRCOM[2]);2 ], O: X$ T9 _5 {8 e7 X
% \, n) m& d$ k( b7 a" P}//end interrupt2 ^9 N- Z* g7 D5 ^, _) m2 q6 T
: _2 P3 I6 v0 k8 S2 h1 [
//下面是延时程序* L, a& C( j* c3 J0 D4 D. O; k
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量
5 l; M! O7 N$ m) ~ P( O0 ~# N{
; G d2 a4 J" i) }( a6 N/ [2 L7 t' G$ } unsigned char i;
* {5 D) E5 W. f( I! i while(x--)
9 S3 x- Y- F8 c! U! L; g {
0 ^5 Y" P" G0 P# i. \ for (i = 0; i<13; i++) {}2 w) i* @# |# C# t9 l6 |: ?9 u: D
}5 |0 F, S" @* c
}
- }- J4 K3 C& f: b* b5 T4 a. g
: Z. A- I# C% ^8 A//下面是延时程序* {& B' i2 F! Y( Y R( k
void delay1(unsigned char ms)//unsigned char ms是参量
8 L m6 ^; W% h* n( L{
; s$ v' C# A3 _; K unsigned char i;7 L( E$ w: P0 m& V+ { y
while(ms--)
# E# v) i) S, t- { {
3 T& h6 M1 I& y for(i = 0; i<120; i++)+ C4 a. y4 k3 k$ l+ ~# l$ l3 N) x/ b
{' w) K( A+ }& q1 r5 w2 _
_nop_();
3 ~4 |0 y- a H* r5 w1 B _nop_();
" U6 ]# K- R3 @( x6 D) F _nop_();3 s0 D$ @" }9 m5 R8 f& m; J
_nop_();
, l. V# G* f% S }( [( t$ y `! o; Z: x$ e
}* O) L/ H0 `3 S( V
} |
|