|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h> O4 ]4 k% A& T7 |
#include <intrins.h>3 p8 f$ j2 K% M, [' {1 [0 q+ L
void delay(unsigned char x);//x*0.14MS
8 E, e/ y' | h+ w% @void delay1(unsigned char ms);
- C. x2 f& U' h0 vvoid send_char( char txd); L& e; v2 m& a
sbit IRIN = P3^2;//INT0(外部中断0输入口)1 _) o5 u, Q; u$ k- }6 q) R
typedef unsigned char uint8;4 u+ |; v8 A1 I: H; x; ]
unsigned char IRCOM[8];
; H6 H& c# c" g0 c8 M+ iunsigned char code table[16] =
5 M- P6 D3 z" v0 U {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,7 B3 z: d# k1 T; d' t% r
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F: z9 i8 Y1 U1 j r) ?+ T
/*波特率:9600*/+ o X! G5 ]0 @9 v5 w
void uart_init()" o% X& E7 [- a( n/ l! O+ c5 @
{6 s, T, f+ v9 P2 ]+ N4 G+ n
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率( i6 C9 R, q& w, V4 @
TH1 = 0xFD; // 波特率9600
1 ~: }" F- S* O TL1 = 0xFD;
( @6 V* r, \% G9 ]* |/ U. q , e- u2 ~+ L, V/ ^( t
SCON = 0x50; // 设定串行口工作方式% w Y- G" h% |7 E, P7 ~ K+ C
PCON &= 0xef; // 波特率不倍增
4 W9 F$ B, E" @2 X$ p : A7 x5 D& V9 j! b
TR1 = 1; // 启动定时器1
# g8 |; a' W7 m
" x5 F, Q m- z2 q) C% l}/ O- [5 R0 n; m9 M# p# } g
/*UART发送一字节*/
* Q' M$ i+ S4 J) [* Z
7 B$ \ i+ ~+ y7 K0 B1 {$ Z- [% Dvoid send_char(unsigned char txd)3 G4 R# y; T3 s( v$ o. n2 T
// 传送一个字符
7 n$ P$ ]" E6 B9 y# }! a, A{, i- ~/ _7 B& [( W' F
4 ]2 _0 ]) n5 c' l. h SBUF = txd;
/ ^# u4 N. i8 d: J7 y! \0 ~ while(!TI); // 等特数据传送
5 x% q; y$ f: C9 q4 [ TI = 0; * P; ^7 \* s: A8 C& @( q) \4 ~
// 清除数据传送标志
$ K4 w# p- r) r2 d% I+ o}
. J! R [) E2 F S Lmain()$ i. r% k+ H# A$ Q
{
7 q4 }* g( q1 w
9 P" H) B% w$ @. E X IE = 0x81; //允许总中断中断,使能 INT0 外部中断
2 O f* f3 v/ j" d8 p! I TCON = 0x1; //触发方式为脉冲负边沿触发
0 x) h! e" b7 x5 [& t7 V# n delay(1);
9 z* x" b" q+ H* \: ~ # l/ g5 V; H8 I. f) r
IRIN=1;
( Z( M' ~% _5 r5 T //BEEP=1;6 t2 I' J2 f } t* P& c
//RELAY=1;
7 p2 l6 M0 d2 @# O: [# Z5 S" a! x for(;;)1 E. r5 Z7 b% v. U4 }
{
1 L* ~" w/ |- o# i6 _: D) N uart_init();. A2 \$ v$ W G/ e2 f0 ]
% K8 h2 |9 C9 G
}6 Q; R8 w) M4 \, b" n: E2 \
9 Q7 X* g5 A& Q3 b3 N$ s
} //end main
- @. o @" O5 Y1 a2 f+ j$ L//以下是中断服务程序
$ P* W/ q. O1 Z% k) x* Q" I+ v* G) Kvoid IR_IN() interrupt 0 using 0
. Y% V- ~7 g+ \' m1 ]{
% w+ a; o0 B* N( t unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据) q5 c1 J- K( q1 q
EA = 0;//禁止总中断
4 h5 x+ C+ @. W+ M4 FI1://标号4 _6 @+ |$ I6 [6 S
for (i=0;i<4;i++)
) f5 H1 g/ x- r, B {7 r+ z2 z8 R: Z7 n( a2 E
if (IRIN==0) break;( ^8 _8 Q8 Z7 t4 I$ q% A7 I
if (i==3); {, G7 H3 w7 K$ ~
{EA =1;return;}//如果i等于3就打开放中断& i2 {" N4 }% Q4 G: K
}$ g: F5 _+ V+ j7 ~
delay(20);
8 B# |1 s' \9 W, C- n% y; Q if (IRIN==1) goto I1; //确认IR信号出现% l9 I9 ^: t* o- X E2 U
while (!IRIN) //等 IR 变为高电平6 w1 [7 ]! B; f* J. s
{delay(1);}" Q+ a* D) a4 S. }1 v9 C
6 h) q \ o0 I2 ^5 [& S& W3 s; r+ B for (j=0;j<4;j++)* u6 ]& t/ v4 L) u
{ # @6 x/ N4 z1 A0 V; }2 Z( m
for (k=0;k<8;k++). G. l$ M+ Z: R
{
1 }8 J6 d3 @! G* B5 v4 }& C* f- h+ I5 L while (IRIN) //等 IR 变为低电平( |+ v' J0 A0 O* P" ?& Q
{delay(1);}+ x) n( l# K% G7 v D
while (!IRIN) //等 IR 变为高电平
0 N7 ^ ?% v2 ]( o- ^7 d8 u* o {delay(1);}6 W$ B2 C! M2 u) G" Y
while (IRIN) //计算IR高电平时长. q% c( f+ g6 o( n \: a' I; O. `, ~
{ //如果IRIN等于1的时候就计算delay的个数) Z- Z+ X) o! [( K- q. u
delay(1);& G8 H+ _' C* s% W( G
N++; $ ~3 O0 h; t! `; A. R5 v( p
if (N>=30) {EA=1;return;}' a# x& b& O2 d0 `7 K9 P- l
}9 I/ G" a4 y6 ~
IRCOM[j]=IRCOM[j] >> 1;0 Y2 V. s+ t& P* ?) g- j1 C5 Y
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
* d/ X* Z3 A4 C% j3 ^ N=0;, P ^7 w. B8 S( N4 R
}//end for k( F) b" }" ^9 I& `) k2 S
}//end for j7 M/ |" n6 C% `, G' F+ y! ~
# c' j* Q3 p! h1 o* }# N9 Q5 f
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
& q3 [! @) C% U2 B s+ u IRCOM[5]=IRCOM[2] & 0x0F;
0 b @$ N; V" [. h. M0 A IRCOM[6]=IRCOM[2] & 0xF0;
3 M7 Y( U2 q2 y2 U IRCOM[6]=IRCOM[6] >> 4;
; B8 A+ [- r& e c // beep();
& ^# k0 } U6 ]+ M3 j& u" m EA = 1;* ~+ J) Q: b% F+ A ~
|1 S4 N2 D. I4 Z6 W send_char(IRCOM[2]);: ?: M9 A- a) h5 D( e3 @
( e* i7 X" H+ p6 T/ M* b5 _7 ] h: u
}//end interrupt
. a5 `5 i5 Q. r- J- e0 U9 Z7 A* U3 q! B, s
//下面是延时程序
( f3 F1 }% l, B7 B) R, ^void delay(unsigned char x)//x*0.14MS,unsigned char x是参量
3 C( h' t% V; X' [7 u; `{4 C4 B! M! A8 ], _) ]
unsigned char i;% ` r& J+ x* M) N9 s
while(x--): V: {: o5 E4 _% q
{* ]& d1 e5 c7 L: a4 m: a1 [
for (i = 0; i<13; i++) {}/ a3 e- |9 Z; L. G
}; u3 r3 \, Y* \6 p
}
; A6 P% U6 r1 U" j$ ^* N" s4 l7 ~8 j: ?, W: D& j
//下面是延时程序3 @" V. ]: Q6 ]6 g2 S" [- l1 R
void delay1(unsigned char ms)//unsigned char ms是参量5 r+ P: X4 U( }3 J2 G. ^2 R* r
{
: d( t7 l/ P D4 a/ N! S unsigned char i;
$ J) e# g: V: z2 a: H; i8 [ while(ms--)4 r$ G1 v) r& i, m
{" s4 q8 f& f* u5 m* v
for(i = 0; i<120; i++)1 d0 U) X5 \4 ^0 J9 Q
{2 P; A5 x, A/ _$ {' c9 }9 r
_nop_();
% f9 \4 ?1 i' ?6 W1 C0 a( [ _nop_();, e+ B5 b# X( f x* F9 F2 u
_nop_();
$ T6 ?; ?, Z' }7 Z* P9 R& Z _nop_();4 S. c0 {; {$ j+ l2 h% r3 F
}
6 ^/ ]7 q V! {6 b6 d }. }4 c8 J9 J3 ?2 R
} |
|