|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
# X/ B0 `+ N7 N#include <intrins.h>
4 E: d% p9 _& V' z1 n# \; l m/ {void delay(unsigned char x);//x*0.14MS8 H# R. c& w2 ]' |! Y& v! J# c% B5 f
void delay1(unsigned char ms);4 C/ k8 d$ K/ ]$ N- |: j
void send_char( char txd);1 C; n9 w% T5 W/ h# t
sbit IRIN = P3^2;//INT0(外部中断0输入口)
$ Q0 }1 K# m9 c L- P8 T+ ltypedef unsigned char uint8;
0 k5 D# G# c* c3 S4 E: _unsigned char IRCOM[8];% g( V& j! Q+ h: H
unsigned char code table[16] = 7 ^' |0 U4 G3 n& J5 e1 o- Z
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,! Q* c% F+ h+ I8 M& v
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
5 @" U. X9 t/ H8 n: t, E/*波特率:9600*/
1 A4 |5 D, @# d6 }+ p" X7 y8 I1 Evoid uart_init()
2 c' D ^" n; g+ C{' h7 G) B" i$ Y5 K: Q& ~
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
8 _. B) r' H3 b- v9 X TH1 = 0xFD; // 波特率9600
5 F4 s: t6 S. B TL1 = 0xFD;/ M6 T @, E$ z3 n1 g1 w
1 z9 Q8 B' [; J* d% E) _7 D
SCON = 0x50; // 设定串行口工作方式7 l' f0 X( q2 ?+ l, _! m+ c
PCON &= 0xef; // 波特率不倍增+ s: h: D3 L7 Y, G+ w7 G8 D
" V6 l- ]( @/ Q& m" G/ O } TR1 = 1; // 启动定时器1# z3 `# u7 l2 K* l5 K) \5 [
5 `: ~" X. w! ]. k9 c6 D
}. [8 a4 x+ z- G* _7 H* w K% K
/*UART发送一字节*/
! b, m4 ?6 n, p* w/ Q) X1 P7 P# z) {! m5 g$ l
void send_char(unsigned char txd)6 b1 T+ p4 P' S3 M& i( D7 R0 ]6 ]
// 传送一个字符
6 p4 ^9 p8 F* i' \9 `3 h/ Q{
, t; ]: E9 A/ a5 G
" k! e& p& x4 g! W+ ?8 O3 z SBUF = txd;5 G+ v7 [& a& @5 J3 n; e: f) c
while(!TI); // 等特数据传送- v8 R* @8 _0 |- R
TI = 0;
% Q8 N+ E1 e. i- F2 N: h# Z // 清除数据传送标志
1 p& x* x- |4 U, l4 y7 P. D) c}% U6 U+ U9 B0 `3 h, l$ z5 x
main()3 ]& z8 f7 x/ q0 S0 M5 Q! l W
{
5 q. t# d( u y( E 8 z1 h; S; D8 R$ ^" @+ g. o8 ^
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
- d ~7 j0 N) u6 ?" L" m TCON = 0x1; //触发方式为脉冲负边沿触发
- s/ d/ f# n+ b delay(1);* M: D& A- |+ P; z3 ]
6 A, k, {& k: ^8 ^( C IRIN=1;
1 m) |6 i8 G/ T9 t2 J' S* I //BEEP=1;& p& n4 Y/ `& T
//RELAY=1;( @/ e o& y6 B0 m
for(;;)" F1 C4 @& ~) u2 L: b
{
8 A) T. i3 q" n, ~+ G uart_init();3 j" A l r) U$ S
+ Y1 Q* `- W& m }
/ @1 j L3 Q% ?- n0 u$ M+ \ 3 v9 z9 s4 q( {$ C6 e
} //end main
3 A- }1 D) U/ ?# d9 c) ]; g//以下是中断服务程序6 U6 H$ W, ~- x& m, C% @1 z' B
void IR_IN() interrupt 0 using 0
/ n% ~* l. ^) @0 G( \) ^: [: p{7 \1 q' h; o, S% k0 K6 d) V
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据0 \+ |# y' M+ ?& |0 \2 x
EA = 0;//禁止总中断3 r$ S1 s/ ^ d5 M4 t, O0 g
I1://标号
( \4 R0 o! F% J+ H' m5 e( f! ^+ ] for (i=0;i<4;i++)
5 s1 e7 @# ]4 m' V9 D: ~! q# e' r {8 H' Q& V2 W; d! E# O
if (IRIN==0) break;
/ V$ B- I4 [" [ if (i==3)
. |- D H8 [5 o! T6 F( u {EA =1;return;}//如果i等于3就打开放中断
& w. Z8 E! c. J9 k% z }
1 [ F, n1 Q4 J2 W; }6 F7 q" d, ^$ e delay(20);
6 H* d0 l( {% C* p5 N; o. v3 o, f if (IRIN==1) goto I1; //确认IR信号出现
5 E% w c6 P! L3 `1 T' W. s2 [ while (!IRIN) //等 IR 变为高电平
8 ^; _% A8 R. `0 O {delay(1);}5 B' e# C) ? V- O5 J4 z
- i3 J$ T S' O' J0 h) b for (j=0;j<4;j++)
3 o, ?, x S" m& T { 8 E1 B3 u. I A9 \9 F& c( p1 K5 ~
for (k=0;k<8;k++)
9 r, \- @9 h% @2 `% Q {3 ]5 J( m* Q9 U7 @4 E9 c; `( T
while (IRIN) //等 IR 变为低电平
{& [2 C) _8 Q1 w! N2 j {delay(1);}: l0 x) f: l0 S0 {+ V% g+ w# L3 H
while (!IRIN) //等 IR 变为高电平5 v% ?$ T+ o V9 D( e/ G
{delay(1);}9 f$ P! D+ G% _0 D: ~ H+ }
while (IRIN) //计算IR高电平时长
# h6 u% h& y7 F$ t6 p" q { //如果IRIN等于1的时候就计算delay的个数
0 J1 r* a( |4 U1 A! K delay(1);
: l: T. E. E! W: {$ f2 r N++;
# ~% k& t6 y5 [7 h if (N>=30) {EA=1;return;} X3 C/ \, Q/ |" ]0 n- a
}# H' D* [5 E \2 n2 a- B8 E
IRCOM[j]=IRCOM[j] >> 1;* y0 F( ]5 P$ T& ]! Z
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
; f4 }0 i2 j1 K( Y7 ~ N=0;4 _" @( f, Z1 `0 @
}//end for k
: X1 f, B. i! N$ W$ x& Z4 V }//end for j
/ J( \/ V4 L. ^- G% }8 o
" X0 x2 T! E( `" G if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
0 _ E. B( H! l& x. `/ v, J IRCOM[5]=IRCOM[2] & 0x0F;! u; p K0 \3 h
IRCOM[6]=IRCOM[2] & 0xF0;
) l( t& G( P6 O# q1 Y6 `7 j% A IRCOM[6]=IRCOM[6] >> 4;, d6 S& Z4 n- H% L: I& J
// beep();8 ^! c" E: g5 J5 V5 b
EA = 1; P3 H! M9 B L# L
. x' f. K/ B3 s& ~
send_char(IRCOM[2]);3 C4 c( ~' \$ M9 P" u4 T' D. [
7 H+ k: |) ^: D) [! t8 m}//end interrupt8 L- V9 }/ O( c3 o8 b' x: E
: n: ^0 P/ C+ ]" M( r//下面是延时程序
* I1 m5 a \4 `. t) [$ i5 Tvoid delay(unsigned char x)//x*0.14MS,unsigned char x是参量
, ^! ?7 v4 K+ C, }8 Q/ j{
% G/ G% a# k$ G9 E7 H- z8 n L- i unsigned char i;
' o) R& K5 d* x3 ~+ E while(x--)
* K9 V0 t8 ]5 k# W {
( D; ]' B% z7 p8 C' M# N0 A for (i = 0; i<13; i++) {}
) X: E0 w0 O' J6 L$ V! T }" ]! O7 P2 G. k+ e( A
}
1 ?* _5 {+ I8 J9 Y! s, L8 r6 b; C. k
//下面是延时程序
- y) ~. i4 t1 l3 x, R5 l1 {void delay1(unsigned char ms)//unsigned char ms是参量
9 n/ U7 `- ?3 _9 d- p9 _{
4 H9 J7 N& @( L9 O unsigned char i;' P: F5 o4 i/ h4 _' Y) t) Y) q/ z8 \
while(ms--)0 k9 s& l" m: G' c8 \$ N
{
- R" w! {. i( u; q for(i = 0; i<120; i++)
* v% w- j: {5 Z8 e! e6 N4 R {
5 [, W$ l) K( S: ]+ n _nop_();! e& c( I/ w! j
_nop_();! p2 I5 B& g" l }: ^* o1 n5 e: x* }" z
_nop_();' O" n+ m% B3 x# M
_nop_();
0 C$ b( r b3 U" }( Q0 H" S }8 z: O. b- {/ P. H& l
}. H: [$ |; |2 K
} |
|