|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>' n, a& J( K& y N: j
#include <intrins.h>
( v* C5 P _ V8 y- Y3 Evoid delay(unsigned char x);//x*0.14MS1 u/ ^0 g5 j/ q( }" f7 w( l
void delay1(unsigned char ms);# |0 j2 H) G7 A3 \
void send_char( char txd);# U. t' @9 e3 r! ?0 P: x
sbit IRIN = P3^2;//INT0(外部中断0输入口). F3 ~" \9 H, Q, O8 ~ K' p
typedef unsigned char uint8;
! `+ L2 ~+ c8 R% r% `$ Zunsigned char IRCOM[8];
' V/ h" S# T6 ]# y6 V. j1 h9 tunsigned char code table[16] = ) T. N2 p: d4 j- @4 B
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,& W7 A/ }, k0 [/ w& b5 j! W! ^! y
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F2 P7 _, `7 H# a5 p" B8 M
/*波特率:9600*/* W/ N. A$ e: y2 k
void uart_init()7 y' w8 J- Q8 Q% J. V8 {
{( p C* H% M! }) g9 Q; x; _, F' d
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率1 \* d7 ?; ?4 E( N0 `5 K X
TH1 = 0xFD; // 波特率9600
# [% V+ H) r, K; s8 w+ x TL1 = 0xFD;+ n" ?6 l# g( n* l7 d% t' R( e
) v- ^; ]! `# ? ^: `9 C
SCON = 0x50; // 设定串行口工作方式
( M% } K+ V0 E/ Z2 o: m PCON &= 0xef; // 波特率不倍增0 F3 [, A U% |( U& T7 k
0 J% W$ r% ^) Q9 ~1 Z
TR1 = 1; // 启动定时器1
7 {. E h3 [$ f- G" _7 O d - c! N* f, @3 J+ q7 D- y, G
}
* V9 W8 @' I% }/*UART发送一字节*/
) A& s ]1 O: a! ]4 e" ]
6 }# a: }1 W( z( s( fvoid send_char(unsigned char txd)* |% K9 L+ [: k+ b% ~& B. \) K3 v
// 传送一个字符5 s/ q1 B: c# U5 z' ^) X
{. ^ Z4 I! @1 S$ L0 O
" K) y4 D& U. r. n+ V) i SBUF = txd;
2 w" t! V, ~ n% K1 S while(!TI); // 等特数据传送& `$ M$ H$ c4 I
TI = 0; 3 X7 `4 }) I- t. W( e o. u8 o+ S
// 清除数据传送标志
/ J( B( F5 b: e7 i8 g}- ~" ?7 p6 n4 |: Z5 ]8 u+ f2 i
main()% B M V* E* o) r) @
{ V4 k% y) a% U( l0 a, y4 {
2 T, x3 H( o ~9 [: h IE = 0x81; //允许总中断中断,使能 INT0 外部中断* @+ x2 X* o0 U2 X; O
TCON = 0x1; //触发方式为脉冲负边沿触发% N0 K. F) C' Z5 V1 `% h' P
delay(1);2 I( y6 q7 E( U2 M8 \
$ y( t/ H% g3 E% |! s+ [" w/ I( x IRIN=1;
. m8 n& n @0 C //BEEP=1;$ \) I- K! l! |* l6 U
//RELAY=1;
, B ]/ L& \; z, |% Q5 S for(;;)9 U1 f! h4 P% f$ I
{* M) p$ R0 K- f9 h3 f, M* j
uart_init();
" I! h2 j6 g/ K
# e0 C+ Q u! A }
8 }* M6 H5 r+ M + P+ U6 G( E; }/ p% N
} //end main. Z4 h% J3 R! Q. }) q3 g4 I& b
//以下是中断服务程序, |6 [, J# I A, \1 ~% b5 z
void IR_IN() interrupt 0 using 0
8 o! M9 Y6 Q0 [# {" u4 i{
" w# V; m- j- R( v unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
w+ e5 Z. [ P# ~/ s; | EA = 0;//禁止总中断# r# r( f& c2 n) {& T1 r H* x7 Z- c- P
I1://标号( T" y6 O, X8 F1 a
for (i=0;i<4;i++)
) V2 W5 A- F: p {% D/ b. \ l9 X6 z: ~6 k
if (IRIN==0) break;
. L C* n6 R0 W2 A8 j if (i==3)
% h0 T6 ?" q& x8 j3 W6 `/ V {EA =1;return;}//如果i等于3就打开放中断; T# @# Q, G. y j5 C8 Z+ {2 b1 N
}
. R* {" z g) Y# k) U; P6 Y delay(20);
' ~' V9 m* F- s4 h; n4 x: m+ M3 u if (IRIN==1) goto I1; //确认IR信号出现9 m# e7 r- r3 h& {( D, f9 w
while (!IRIN) //等 IR 变为高电平. V7 ]$ s/ E) w+ e Q
{delay(1);}
) a! H$ r) ?: i) }* |0 y0 D. ]( g( g$ J: p; v# ~+ k1 [
for (j=0;j<4;j++)
0 e3 r' e! g3 Q/ Q% w { % k* F1 H8 y- p. k& ~, K: G% f3 m2 D
for (k=0;k<8;k++)6 _' G. Y/ ~- B( \
{
" Y1 n0 S2 P6 A9 I) S/ \' E D% u2 j while (IRIN) //等 IR 变为低电平/ d" Z% w( X& q0 y
{delay(1);}' |1 l7 W0 {7 Y& J6 H+ X
while (!IRIN) //等 IR 变为高电平
% N5 Z! T0 z4 R+ l) {1 U {delay(1);}9 P/ J& W- z. \0 R
while (IRIN) //计算IR高电平时长, |( Q( o) ?0 K) ~
{ //如果IRIN等于1的时候就计算delay的个数9 _ w8 O$ y9 V- E
delay(1);
. w/ {* g/ x6 C. `! x3 ^ N++; $ s$ c2 U9 } Q1 k: \. P( Z
if (N>=30) {EA=1;return;}( z4 ~2 j+ q! X' Y9 H6 Y
}
% s' W5 @' u9 v% l5 x' n IRCOM[j]=IRCOM[j] >> 1;
( k {5 H$ d! [7 h if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
* {: C, ^, ^6 ^5 x6 I( q9 C N=0;$ p3 g5 U2 e( w2 J' B. x
}//end for k
* V% ~; `3 Z. P; R7 u }//end for j6 x5 m( B' N3 N M0 @7 ?# ]
' R# y( \5 S. d: c- k* L5 I( p0 Q if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}( l$ f4 Q1 L3 ]% y& L
IRCOM[5]=IRCOM[2] & 0x0F;
3 _ R9 C: K1 a* K, t IRCOM[6]=IRCOM[2] & 0xF0;0 H# h/ X; J! a
IRCOM[6]=IRCOM[6] >> 4;
+ V- N7 |2 M6 s; h( q2 l" x // beep();; Y) q! |8 u' [$ b9 U$ P
EA = 1;
+ ?9 @& r6 G1 l( F) r8 d
9 H) d4 h$ {3 B2 W/ F) |& G send_char(IRCOM[2]);% l2 \9 T( v9 Z; ?+ w
# n# F. x( b% q! B, a$ C+ t0 j}//end interrupt
0 N- p8 O$ d' x3 i$ E- c6 ?5 @
//下面是延时程序3 j* k$ p, V9 Q) m
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量& D5 i/ x- _# n3 H |: k
{: S( Q3 O- u" c# L# `' |
unsigned char i;
6 y; X- T% ]0 d, m while(x--)
7 K3 Q. q* ~4 A0 N2 m5 k) z$ T9 E {4 J' ^3 v) C8 y# e
for (i = 0; i<13; i++) {}, |& l1 e% G8 Y
}# z3 y+ Z6 e. f' B
}' N& i, `7 N. f) ^7 ?
+ F9 s" Q _! B5 D2 w% d( [//下面是延时程序$ ^+ B3 i8 q" V0 i9 n
void delay1(unsigned char ms)//unsigned char ms是参量6 t. I) U U% M+ T/ U) Z
{$ E2 j1 B5 [2 d5 q9 Z! s' b
unsigned char i;0 U; H+ x( S- X* |0 k' A E
while(ms--)
: o! t* R2 h; [ {- p1 d) V- F( _
for(i = 0; i<120; i++)6 Z( k/ I4 L( Q- q
{
' W; @% I& W9 W/ c3 I5 M0 J( E _nop_();
/ L0 T0 G+ X# C3 R _nop_();! j" n4 s$ P; m3 u! q
_nop_();4 V1 o8 @# m# v4 a8 q- ?/ a
_nop_();' t0 l. P( f6 [2 D* f
}- d% [+ |7 e0 G3 O; h( s/ C
}8 [* x8 I! w T; K8 A. Q% r" P8 {
} |
|