|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>/ n$ R3 c) d- `! E
#include <intrins.h>
& y! o4 ]! @' p' b' `9 ]+ @void delay(unsigned char x);//x*0.14MS
) n0 O( t( y9 J, B- C6 H* lvoid delay1(unsigned char ms);0 c- e5 }8 U* m
void send_char( char txd);& M0 [( z/ ~- f# A9 ^$ z/ E9 W8 Z
sbit IRIN = P3^2;//INT0(外部中断0输入口)
8 x+ H, k9 U2 {( Q& `1 Q/ {typedef unsigned char uint8;
# r" t0 J/ D; O# N1 lunsigned char IRCOM[8];
# W8 l9 F0 X& I' ~; O# N. \unsigned char code table[16] = # D w; }. j. c6 V* G6 @# W
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
A7 C5 [+ d3 N+ h8 l4 P 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F/ F' o7 a/ H( X0 ]; Z9 F2 s1 D( t
/*波特率:9600*/ }( m& @$ ^9 H3 I( X, V
void uart_init(), x9 L3 ~% m7 _5 S- m# L l
{$ c" x* j$ l5 I
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率- \* N5 @ \* g9 a2 G5 D% C9 M! ~
TH1 = 0xFD; // 波特率9600( `8 S) |3 U( E! g C# I3 _' X0 X
TL1 = 0xFD;
. l6 U$ g% g- K l0 ~$ B: e ( n! X( m. j" j3 u/ G
SCON = 0x50; // 设定串行口工作方式
) O1 D# g6 _* h! c' i6 u! }1 ] PCON &= 0xef; // 波特率不倍增
, F- g* R. C0 u* m, k
0 Y& k' y& ^( V5 }$ x5 _ G7 o TR1 = 1; // 启动定时器1 g) C$ ?+ O3 x/ c4 `2 _
! R6 Y& v2 o1 P}
7 j. t' m2 @8 J1 k* g" v; D! ?2 o/*UART发送一字节*/
9 J! T( V) E. ]
, p$ ]1 F& X# g* N5 hvoid send_char(unsigned char txd); c- C2 o1 X2 }
// 传送一个字符
, X0 ]# W" L& ]( y{
! d" a, T0 T/ L
+ {2 m% _0 ?9 W- | SBUF = txd;* X, q3 X) \& B2 a; o! s
while(!TI); // 等特数据传送, n6 B7 A& C; S
TI = 0; # _* _1 K! G7 r# a7 T6 P8 D
// 清除数据传送标志( `* q S8 G/ W m8 F% R* \' O
}: e% J! _) v* V0 _& f8 a% M
main()
$ ^: O7 q/ x& b) |8 [, @{
% _! M2 v' K+ p7 h) H+ c
- n' D" T) V) `: M) ]; ]2 A/ | IE = 0x81; //允许总中断中断,使能 INT0 外部中断 @3 j9 p \. N0 J% v5 Q( I2 {
TCON = 0x1; //触发方式为脉冲负边沿触发: y; ?+ M Z8 M4 D3 Q8 h
delay(1);
. k( E w) t- K w4 i: F% K3 N
9 K0 }9 r# \8 x/ p7 H: h0 A; n3 | IRIN=1; G, x! M, T5 f: P' K7 |
//BEEP=1;% r7 K. p; U9 E& n) J% I
//RELAY=1;
* R3 U, c0 J- ^' L, m/ | for(;;)
0 y. D; l3 ~; V2 u {0 V9 T! t. |- L* n
uart_init();
: F7 D) b8 w$ h4 l) W( S! ^7 q; ` 9 o( v. X: Q( J* y8 O1 j
}+ ~+ U7 ~2 I6 f3 b# s6 I& [' Y
) c. ^& ^' l# s6 [" p/ [} //end main
. T( q- ?% |/ c6 I( U+ T//以下是中断服务程序* g8 b( q2 @7 g% W2 i$ \
void IR_IN() interrupt 0 using 0
9 l: q$ z0 z- |& L{
1 H. ^1 B m& Y1 p7 @ unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据7 T h$ X6 P) a9 b$ w) K
EA = 0;//禁止总中断
# S" h# a& a1 k4 s/ o$ bI1://标号2 w* v0 Q# ^2 h7 v% [7 h: t6 [
for (i=0;i<4;i++), \- P1 _8 d8 P4 u* k
{
! `0 s' S# D+ k) R; t% D if (IRIN==0) break;
3 t* p1 s' V' [ m1 r if (i==3)
! z3 r. }0 X8 {6 Y/ b7 H, L& u {EA =1;return;}//如果i等于3就打开放中断
6 X0 M$ V2 o8 `; {/ z3 V( @9 m# N! K }) F2 E8 n- |. V; o$ t4 i
delay(20);
3 m. M% y8 f0 p if (IRIN==1) goto I1; //确认IR信号出现+ |- Y& f0 |& k( s) a
while (!IRIN) //等 IR 变为高电平% M; T; I+ S. j
{delay(1);}" a/ u* W i/ V! `0 K
% d; `2 m6 M1 M h) O for (j=0;j<4;j++). M8 S$ H1 w- i) g4 D) \
{ $ S1 e4 E3 h: x
for (k=0;k<8;k++)% u6 l. h9 K) K+ ^# l( `
{' a( [6 Z- d7 U' }* o
while (IRIN) //等 IR 变为低电平( w m# S) b5 G$ ]( I" w" n" v
{delay(1);}
& t0 v2 N0 m9 R" x% B while (!IRIN) //等 IR 变为高电平$ z9 [; ?+ Y1 p8 M7 E% Q
{delay(1);}7 x; G* Z1 T+ E! V9 ^2 g
while (IRIN) //计算IR高电平时长
+ N( g# w$ v# I0 s: a9 ~ { //如果IRIN等于1的时候就计算delay的个数5 X$ k8 a6 k# M+ h! h3 H4 A; [/ {
delay(1); \, U/ B3 i0 n: z8 ~1 z2 K& G) p' d
N++; . }$ Z- v. w" q: ~2 {3 G3 Z R
if (N>=30) {EA=1;return;}2 `/ H5 `' A# B1 [+ G1 ?3 {
}
3 B0 S" l" u8 ], o- C IRCOM[j]=IRCOM[j] >> 1;
4 F' c: O1 M3 C \ E if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
$ o& i/ M( g- { N=0; [* x) n" }3 t; g& n
}//end for k5 J7 D9 ~" v2 z4 o& ^% Y9 c$ U
}//end for j
1 m* Q3 Y r# S' {/ V( e) F : l5 G5 b4 e5 ^: T
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}" n6 M c' }" [
IRCOM[5]=IRCOM[2] & 0x0F;
9 d0 L$ I7 _* w9 C o IRCOM[6]=IRCOM[2] & 0xF0;# z: {, a1 m+ W8 v7 s$ @
IRCOM[6]=IRCOM[6] >> 4;9 G9 h$ T2 f$ h0 s! N2 ~
// beep(); a: ~+ l& A" a" s, U
EA = 1;) m; X! r' S/ v: a- o# q Q
) q6 v1 t) ^5 A2 U
send_char(IRCOM[2]);9 z& z R9 T1 L0 A
* B6 s7 Z6 f ^$ ~}//end interrupt3 ~9 w0 n: X3 @- \- i
o) u/ Z1 v! o: B; n; A1 R0 P
//下面是延时程序
, i+ ]' _8 p J. gvoid delay(unsigned char x)//x*0.14MS,unsigned char x是参量* \9 F9 {: I7 R Q
{$ h/ V- r9 z' u5 z3 B% v \
unsigned char i;
/ ?0 b$ T7 s# B, t5 ~5 A1 U while(x--)
: g0 c Q- \( S0 e9 P4 n2 Z8 V {
7 c5 r) f3 x( t, q5 p* Y+ G for (i = 0; i<13; i++) {}
& J O% A3 y& _6 j0 m/ k+ m8 I } b5 W, N5 _* Y
}
3 Q$ q7 w! ^; p% J& O( e5 K1 V# [6 |- l! V& M
//下面是延时程序/ E3 k$ g. T4 Q
void delay1(unsigned char ms)//unsigned char ms是参量
* v F3 x6 B3 g$ a{
; Z4 }% r$ k9 d3 F9 c D unsigned char i;
9 H8 { ?6 y$ A/ e; A while(ms--)
* V3 G+ N( k5 r9 y1 G" }2 w* J7 y( Z {9 {% ^+ @9 B7 p
for(i = 0; i<120; i++); e" e! T7 t; ?& f6 d& x! ~& m- w
{
+ m7 X$ S- C4 r* N8 s _nop_();+ Y K- t5 R7 b
_nop_();
* a/ K7 _# a6 \$ {, U- ] _nop_();
1 x, S" L g1 a7 b# v W _nop_();, J2 R1 G G0 P. ]
}( W G, f$ d4 }, s W
}
( o" A4 T, k+ ~+ L) i0 [} |
|