|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
8 W8 Z3 l& o& Q3 k+ Q' i3 Z3 x# \#include <intrins.h>
& v& b9 I, K/ J" m6 ~5 a9 e4 |void delay(unsigned char x);//x*0.14MS
3 J( t, S8 K+ F- h$ E: ~void delay1(unsigned char ms);1 i% z" B: Z9 d
void send_char( char txd);
Z% H& s9 f3 J* C8 w Fsbit IRIN = P3^2;//INT0(外部中断0输入口)7 j6 g3 E* _, \. w: |4 M
typedef unsigned char uint8;/ ?0 C8 X' I) d0 [
unsigned char IRCOM[8];
9 S' i$ ?" a7 R9 \9 X7 vunsigned char code table[16] = ( v; y# o2 q1 Q: Q/ D5 v5 q
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
4 v5 h% h) i! o- p) U$ Z 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
2 Z. @. ?/ b0 v7 ?1 v/*波特率:9600*/
* \: {$ I ^5 v; Fvoid uart_init(); y6 N7 T4 x+ E) H+ L
{
$ i/ L7 s8 d- n% W/ t& [% {, k* s6 p, C TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
4 l! }5 Q7 L) k6 q# S TH1 = 0xFD; // 波特率9600
0 u8 K+ S- L' N. S TL1 = 0xFD;( Q/ z# X0 y+ U1 Q8 \, P2 b n
4 t' F8 i: T. [. h3 R
SCON = 0x50; // 设定串行口工作方式- t3 H# t9 m( i2 a3 G* p4 [
PCON &= 0xef; // 波特率不倍增
. X9 T* R6 y7 G6 N; d9 Y8 f' @ ! r" t4 V+ U7 `+ D
TR1 = 1; // 启动定时器1
0 Y; i7 p0 G# `, K9 e9 d- H 7 P) X) F4 i; t7 G# K1 y' h
}- K6 z' N }' {; t7 H9 g1 a9 c( F
/*UART发送一字节*/' n/ I8 r, G$ T0 c5 _% ?2 k" [) s
9 O' P' k# Z* l5 |; \9 I
void send_char(unsigned char txd)
0 j" @: l5 D D+ G// 传送一个字符( x% T9 A) A" j6 ~/ t( y
{
5 X% m# d- B8 |; r* Z 5 }4 X6 S% l* o/ s% Q' j4 a
SBUF = txd;
, n6 Q7 s7 J0 e6 A7 A while(!TI); // 等特数据传送) Z i& t' w: a1 w0 f( y
TI = 0;
$ o6 @* d- ]8 c x X* Z% l' K) Q // 清除数据传送标志/ u% i. n& F4 Y9 ~9 m% g! y
}: c: ]5 N7 G0 m& M, p/ k2 m$ y
main()3 o% X: _5 f4 y9 z
{. `; q; ^; z `2 m8 X
, @! @ N8 x* d i1 w7 ]3 C# ?" N' X IE = 0x81; //允许总中断中断,使能 INT0 外部中断
\6 B" g4 x& C6 ^: c& W TCON = 0x1; //触发方式为脉冲负边沿触发5 e: T, ~0 g/ b+ b" \
delay(1);
1 d" e% o6 Y" K: G2 ?- P
8 V; r/ F% f5 Q; `: Z IRIN=1;4 z; U- N8 }+ f
//BEEP=1;
: A1 [% C* @8 h4 L# m //RELAY=1;
4 Q! z a. D6 ]* o6 E for(;;)$ V: {! }) S R! ^
{
6 @' |+ `2 ]2 X* w( b2 b5 i1 U4 V uart_init();, @" X: [$ y, Z
9 u/ M1 \$ U# U6 C8 y( o2 h" o$ @
}& ~% y6 @ r) C
5 [- D+ \" K8 I* p) k
} //end main
* `" G7 m& i( T+ m//以下是中断服务程序
3 [1 x1 \, d# o7 |* avoid IR_IN() interrupt 0 using 0
3 l8 }. c- k1 Z1 [{+ N Y5 w6 n+ t
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
- G, c, h7 i6 l4 ~$ X7 G/ h EA = 0;//禁止总中断
0 B6 }3 y6 J( n+ f& TI1://标号
, S+ e. {5 R- Q( G for (i=0;i<4;i++)% _* W7 ]; ^% T" q; w$ j! F: l
{) X& }* H! x) C8 e
if (IRIN==0) break;$ O* V2 \4 Z2 q) T
if (i==3)
. C$ h# r3 x6 ?5 ^$ T, ^ {EA =1;return;}//如果i等于3就打开放中断# D6 D+ c( q2 T/ {( o1 D1 ?" f- \, S
}
& i. m0 ~ i- |; s0 v delay(20);
* R8 z8 e0 ^+ o+ J% I0 V8 l if (IRIN==1) goto I1; //确认IR信号出现3 K9 Q$ E' O+ O- [
while (!IRIN) //等 IR 变为高电平1 a' ]2 P6 |$ h( }0 ~: G
{delay(1);}. M) }7 O1 I8 x8 Z& J
) z1 q. z- w8 ?
for (j=0;j<4;j++)! f5 s8 x3 |8 w7 u5 a9 C- ?6 V
{
( d- j% Z* e9 K; ^ for (k=0;k<8;k++)
+ g7 h3 O+ G' y7 l7 Y {6 q6 o- V8 @8 Q, c
while (IRIN) //等 IR 变为低电平
9 N$ `1 w5 S& E6 K {delay(1);}
: b9 z+ s2 u: {# V6 t$ U/ m3 _7 G while (!IRIN) //等 IR 变为高电平; f. }1 H9 r! U% ?" H3 r6 V+ s
{delay(1);}
# n( o) n; g+ e" H while (IRIN) //计算IR高电平时长! o/ Y. s- i+ x6 k6 I. e
{ //如果IRIN等于1的时候就计算delay的个数. O6 F/ H, W& U5 u! W0 U
delay(1);; A% r' r! M1 ~' R3 Y0 k- {6 `
N++;
% t, M; I2 T( j if (N>=30) {EA=1;return;}
5 _- e* k! ]8 p' l. g }
% h$ _/ @$ [, {+ `* D IRCOM[j]=IRCOM[j] >> 1;& w b2 \9 F# J6 @& C% W
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
# T& W f$ {/ @. B6 Z/ ~2 K2 f N=0;
7 Z0 o, Q! ]' M }//end for k
3 M% j3 K4 d( U F& O8 {3 [6 C/ G }//end for j5 T* H! v0 G% l
8 C8 M* [% ?. y' ]# q+ C2 ~
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
( S8 t' Q( R2 c0 T, K8 k IRCOM[5]=IRCOM[2] & 0x0F;, a* z( p# m2 P( `8 L! ^4 F, A
IRCOM[6]=IRCOM[2] & 0xF0;0 j0 W7 i! |" Z# x4 p6 n
IRCOM[6]=IRCOM[6] >> 4;% D# I9 j5 G; }! h0 I/ D
// beep();+ r$ v4 \/ t' d0 @, c+ F
EA = 1;
$ ^6 m) g4 x4 B6 z4 z2 P/ C, }5 ?
send_char(IRCOM[2]);
4 A6 n" d6 P2 Z; ?
2 C* B5 B, Q8 @: C! J6 ~}//end interrupt
. d" x. h' X; U0 O% Y, @
' L% Q: J5 ?3 v1 r//下面是延时程序' k! A# M3 I: u' p3 }' h
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量7 j& m4 L1 W5 L8 x' ~1 R* U
{
! t" Y+ }2 {- E& [8 c) N unsigned char i;
. C/ [8 Q2 D8 |/ o5 K1 R& ? while(x--)& A: N: o8 t+ J
{5 W4 Q8 x: M7 E2 Y9 Z* N
for (i = 0; i<13; i++) {}! h1 I4 G9 ], m6 U
}+ \! l+ E, o0 ~) U# c9 c
}/ v/ o: T- ]6 `+ ^2 R
& N! p/ N: d+ Y# U7 \//下面是延时程序- V: |' |" r" b6 t# E U
void delay1(unsigned char ms)//unsigned char ms是参量% w t0 {+ ]8 ~2 p
{
& r l6 k' q; }4 U4 ^! ]$ A5 l unsigned char i;! Z9 s0 `8 |; }2 b- u! L
while(ms--)
7 h8 E7 L' q2 b( U1 ?3 G; ] {) L/ g: I( P" c6 f8 ` V% S+ Z* m0 Q2 V
for(i = 0; i<120; i++)% q; C1 p% V; r4 i& V
{
9 x t, [6 J& B$ b' O: I8 D _nop_();3 w/ n5 ?0 O! E: v6 V4 H
_nop_();2 I& a" T' [: }% B! o3 p
_nop_();0 }. ^4 O! c/ v
_nop_();# }- ~2 z L) u( C/ x+ M4 W+ M+ }! r6 @
}1 O$ k! J5 c' s8 [
}/ R& Y* E; M# o0 U4 P
} |
|