|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
2 G% c0 ~/ O1 `4 F#include <intrins.h>
/ k) R( Y& L% h/ {9 ?* t4 lvoid delay(unsigned char x);//x*0.14MS
+ N0 t" A. R% A. }8 [7 nvoid delay1(unsigned char ms);
8 a6 m" s7 z5 Cvoid send_char( char txd);
& i( A( h5 w4 q# ? q. Qsbit IRIN = P3^2;//INT0(外部中断0输入口): {, M- p: |/ \6 V( w7 h$ M! L
typedef unsigned char uint8;' [% @1 {7 l# R9 U& v9 \
unsigned char IRCOM[8];0 q9 t' s5 Q5 S% K/ N f
unsigned char code table[16] = 7 o, e" B- ~9 _1 D/ `3 d1 ^7 ~
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
! Q( a2 @/ q ^ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
* N6 ]& Q1 G* N) b/*波特率:9600*/
P2 u9 Q- B; p; e7 E, F; nvoid uart_init()/ u* F7 e* p. r) M4 Q: Y
{9 f/ ^: T/ k5 f* R- Q
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率 \; b' m6 K0 I: e, F1 l$ T5 v
TH1 = 0xFD; // 波特率96009 N+ ?- j3 `2 l& W
TL1 = 0xFD;+ m2 m' N* q# ]6 n% _
/ j+ k5 a2 H. J6 q
SCON = 0x50; // 设定串行口工作方式- t. t( C0 u! v. I. J# z$ E5 O6 D
PCON &= 0xef; // 波特率不倍增5 _$ e. F2 r$ q9 y
. |, n+ V% O) _1 \; ]4 G( Q) t TR1 = 1; // 启动定时器18 F) F% A* P# p4 Y) a* Q. }
+ I+ S" o# ]' L. d/ u: m}8 F+ B' G0 B1 Z7 ~8 v
/*UART发送一字节*/
0 ]$ {9 [2 R- i! ^- c; U
. u) v$ C2 o% c; vvoid send_char(unsigned char txd)
1 f b; O' w0 C+ a' J0 O9 e// 传送一个字符0 M/ p' L7 T9 S7 N
{6 q {% b' b6 x9 T" u
) b- S- d" c) v0 k% U, k SBUF = txd; k K, i4 S4 R- i2 J/ F
while(!TI); // 等特数据传送! n1 m% f8 |, V4 p" x: l1 a& T5 e
TI = 0;
7 o% @$ b( O6 ?/ |" V4 x // 清除数据传送标志! r4 i2 N2 P9 j1 q
}7 p8 _" P2 z( W: |
main(). J- j0 t7 B+ y8 _
{
4 y8 ` E! X% Y0 M# Y : ~3 z* I O* G/ ~
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
6 E2 @6 S ]8 _# L ` TCON = 0x1; //触发方式为脉冲负边沿触发
' ~7 t' B' `$ e. v& ~ delay(1);7 _7 D, W' x" G* g
. T, y2 I6 \( J; T+ w8 q# ]
IRIN=1;
2 t- A% G4 T, c //BEEP=1; ` Z2 V7 v- e, A
//RELAY=1;
% k5 Z" }# V! s M k1 e1 ^* u for(;;)/ @& J! o! ~+ w' l) R
{
% G1 u. p1 c" T4 G9 B! A$ k3 @1 ? uart_init();# i5 [) l! K2 ]# ~8 {
V6 I4 H' e" V5 l9 I8 i
}
5 |7 w1 E# i0 L& |: ]/ `
/ }6 s W. V) I! d# o* s( y} //end main3 ?; x2 s9 J1 \" h
//以下是中断服务程序: ]4 G' G. L2 ^. m# E
void IR_IN() interrupt 0 using 0
2 H. e: S6 `5 z. w$ I J{
( F, _/ D; Y- m6 y# q3 O7 J! S unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
1 R: N. \, V( C L6 J EA = 0;//禁止总中断5 t' G) X# j7 @
I1://标号) A+ r- ?9 @& ~5 }7 r7 @: S8 _3 i' @
for (i=0;i<4;i++)
9 p. q% B$ V9 q) z" F% ] {
/ D- D. H: z7 b5 K1 t* x if (IRIN==0) break;2 p, l4 M# j+ J+ Y1 ^# X
if (i==3)" o5 r* G }3 } P" c
{EA =1;return;}//如果i等于3就打开放中断8 S t7 t8 Q: A* q
}9 a' a. i& d' p" F9 d, G1 _
delay(20);3 P) I7 }- Y/ I1 g6 x8 `
if (IRIN==1) goto I1; //确认IR信号出现0 m' \5 b8 b/ u
while (!IRIN) //等 IR 变为高电平
# ]( }/ g, Z; g8 I% L {delay(1);}
) H0 }5 O) g7 ?( V/ w0 Y+ \# q$ q! x, g8 i4 d/ y6 H
for (j=0;j<4;j++)- y# }7 L4 C# \6 k4 Y
{ " V2 G, ?( E$ i4 a* u1 z
for (k=0;k<8;k++)
0 }! m6 T6 t/ e4 f% @ {
( P1 w5 c7 C! G1 D1 g3 k4 t while (IRIN) //等 IR 变为低电平
2 G5 d# M6 A( l; S" o: t+ I {delay(1);}
+ E2 s' s3 w2 g, I" F" k while (!IRIN) //等 IR 变为高电平: f' Q. U. _* O) Q4 U/ f) o
{delay(1);}3 a) @$ T4 @2 n! {
while (IRIN) //计算IR高电平时长6 K) z3 ~% X" I- x1 J
{ //如果IRIN等于1的时候就计算delay的个数
, Z+ X8 |4 C) s delay(1);6 }6 v; s5 t4 m3 W8 ]( b( j! G
N++; 9 |# U0 J! ]+ \/ m# P' [! s$ Q+ ~1 Z
if (N>=30) {EA=1;return;}1 u7 I. U0 `7 b( C2 M' }! O
}4 J& B5 f9 i! A( Z) |* n( k! ~) o' ]8 s
IRCOM[j]=IRCOM[j] >> 1;4 c% d% D' V! ]0 A! ^: B
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}2 r' Z5 `; F h/ G0 ?' n
N=0;
3 G# k: j! W$ W( e; i9 m3 d" N }//end for k
; {% j' B- [$ f6 T, Z }//end for j8 C8 ~5 p8 N p
4 X# p6 T+ h/ Y; L2 B: ^
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}: h1 z1 [3 P# F- p
IRCOM[5]=IRCOM[2] & 0x0F;% A m/ W" W/ p
IRCOM[6]=IRCOM[2] & 0xF0;5 p% ?9 m; @) I, z! I
IRCOM[6]=IRCOM[6] >> 4;
3 D/ A# w2 F0 _ // beep();- W0 q) b, X0 S! \0 t) c* ~" N( d
EA = 1;
# w. V% K/ P4 |: J7 F& _' h
W% z( e, }! D5 R send_char(IRCOM[2]);+ H4 \4 j4 @: a' L
2 u1 x& B. v1 j
}//end interrupt& _6 _/ P$ ?5 L" k% O6 E! [8 M1 H4 H
: Q2 S: a: ?9 I( H: j& a$ @
//下面是延时程序6 }! ]" D7 B8 I
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量* F4 N4 C9 e2 q) n
{
; `2 \; D( w8 Y* D) T unsigned char i;! n. d' o; y, R' t
while(x--)
0 f1 d) h0 ^) I {+ A' R, x9 c/ O6 E
for (i = 0; i<13; i++) {}% ?5 n( R2 v0 A# ]0 Z0 i4 u2 Q
} w2 k: i8 ]- _0 m+ @4 w% {! u- j$ h5 e& N
}
4 X# P; Z$ g# m. M( W! D$ v! L. c/ _/ a. ], @
//下面是延时程序8 Z7 k, ]! Y/ w/ ]% h3 ]# Y
void delay1(unsigned char ms)//unsigned char ms是参量
. b& N* j$ H: K d7 ?2 r2 n{
0 Z+ O; P6 _: k6 Z unsigned char i;2 J5 }0 I ]( K) x, D9 t0 l. o/ h
while(ms--)6 `) b/ [( x* _, l, }
{! @" Q2 U8 i* r! }
for(i = 0; i<120; i++)! ]- @) b( O+ f! X
{
& V8 \4 M; F6 n _nop_();- K' o# ?( e% `0 c8 _- Y
_nop_();4 {, z9 i& f" L
_nop_();
9 l- Z0 ?" g& p9 N2 |2 P" a7 F _nop_();
$ W/ d/ u$ G+ i- _( {3 l$ T }
: k" u3 H# J2 K/ P# n9 Q }
, ~0 z6 S# d* v% z: S% ]} |
|