|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
& c5 A$ m& u$ P" q#include <intrins.h>2 c' _ l: @# d
void delay(unsigned char x);//x*0.14MS+ h$ a3 c' W2 R& H% z+ A! c6 ^7 B
void delay1(unsigned char ms);
, h5 y. X; J4 V, a7 G6 t/ ]# Z/ a$ Nvoid send_char( char txd);
$ Y8 I: |8 ]3 ^# T; I# ^sbit IRIN = P3^2;//INT0(外部中断0输入口)9 ~0 E9 Y: g9 Q2 V5 C
typedef unsigned char uint8;
" ~ u2 a- x! \* h' V/ H8 q9 dunsigned char IRCOM[8];
# w. s N) Z# munsigned char code table[16] =
. Y3 M% k( \4 Z/ ] Y& _) u {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,6 Q; Z3 j6 J6 P+ K# |1 N/ w
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
S/ T2 s. f9 t c- t" S7 }7 v/*波特率:9600*/' D% l- S- t6 H0 E% ?' ]; g
void uart_init()( a( _7 k5 k- W7 M
{
* {" M, k7 U) E; l) V: g TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率& k; S" O+ B, J
TH1 = 0xFD; // 波特率9600, W) q0 }& _, c$ O3 @( p( |3 M) s
TL1 = 0xFD;
3 V3 D7 N% a$ i9 o* e- y0 T
* x( {. r% w9 C# g SCON = 0x50; // 设定串行口工作方式
. L0 s& e0 e2 a6 W g# D8 E PCON &= 0xef; // 波特率不倍增
$ {+ ]+ H; A& H( e% A2 q! |
9 t7 K0 E: x# S M- Z TR1 = 1; // 启动定时器1
2 m* s. z) H- G B" y' a# N1 ] $ V9 U8 r5 Y6 B. F/ W
}
q, a( W7 {, O+ m# q$ n/*UART发送一字节*/
! g3 A% [. l( V! e6 P
% E1 J9 }, t& J6 U' ivoid send_char(unsigned char txd)( z3 m9 y/ ^1 X6 j. q
// 传送一个字符
. H( P+ V% m, t( f1 S{' i" |: ]* s. w. e2 x
4 \ I1 A7 O0 f) ]- _( K
SBUF = txd;
) L; t5 i* e8 i while(!TI); // 等特数据传送' P0 a2 a5 @# Q& h
TI = 0;
6 S+ e1 ?) O: c/ q" N3 Q5 U // 清除数据传送标志: i) `; V5 t% p0 ?; n' a# k
}
! F9 L _8 |5 U$ M1 o/ Y) a8 U8 e1 Kmain() A+ I. ^! H& V: u1 ~4 [. t$ q
{
) i% M* m6 {% k8 j' A ' b- {0 q% B; }' i: d! [; n
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
# w! ?( y% Z) m4 u1 K TCON = 0x1; //触发方式为脉冲负边沿触发: y7 t" n* X% p
delay(1);1 m) e3 V$ M- c' H# s* j2 T
$ ~3 @3 Y- |! {1 ~- p* F, }2 Q IRIN=1;
' G7 } [' o/ x //BEEP=1;
; {: J$ j/ w6 W5 O5 v. V" f //RELAY=1;3 U! L) M2 ^* r) w8 I9 ~9 R, a
for(;;)# X, R! V' `. V% b6 M2 [
{
: v N, }7 t$ w' q* ~# h uart_init();
3 d7 B( S2 s# G$ G: O 4 _' [1 ?) p$ J' E n6 _
}
* O# i6 d* ^8 k4 X& n% V& K. ` 7 w0 r% k, p7 n5 t) p
} //end main4 ?# h* q) }) `$ V
//以下是中断服务程序
# I' q" d$ V9 o8 P# S7 i/ Qvoid IR_IN() interrupt 0 using 0" v% _$ U/ o, q- P
{2 S$ X g0 T5 R3 A1 _0 ~* F
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据2 z5 y0 h# K. w% M2 u P/ Z
EA = 0;//禁止总中断% x: b6 b. s* w# ^& @/ d
I1://标号
: `; l) q E( e* @- P. I for (i=0;i<4;i++)7 s, H( S" ?) W
{
# A8 `% {5 u' O6 @2 T if (IRIN==0) break;
3 M# F- a6 L4 x: p0 e if (i==3)# \1 @# Y* K' ]7 `: x+ z
{EA =1;return;}//如果i等于3就打开放中断
( @1 f, r+ O, Y, {/ K/ F }
" n5 T+ i8 ^# o7 n) O delay(20);
' }. @( o, v) N# U3 a if (IRIN==1) goto I1; //确认IR信号出现* s4 Z5 |( T3 k( N
while (!IRIN) //等 IR 变为高电平4 C* e2 {( I* r; J8 n5 l9 E
{delay(1);}
$ M$ Y2 q, h4 i8 e5 V& N+ s8 l- \% G# v5 ?3 H f. ]
for (j=0;j<4;j++)
( Z& @4 z/ V6 t6 ^- i% s0 I/ w {
1 _' S5 Y; N$ m for (k=0;k<8;k++)/ c! a8 F+ A9 [6 R
{* ` ]: f% Q& F1 Q6 Q9 u: n
while (IRIN) //等 IR 变为低电平* R$ s; X* Q1 f
{delay(1);}8 x: H0 w) n, W2 |/ \* M
while (!IRIN) //等 IR 变为高电平& I: L! X; p" d W
{delay(1);}2 E3 K; q# _4 F$ ?8 Q: ?. v' y0 }5 M+ q
while (IRIN) //计算IR高电平时长% w/ a1 r- j9 p: C
{ //如果IRIN等于1的时候就计算delay的个数. ]) ?! Y+ u' L
delay(1); O6 @ {) ~( D2 J- k, P
N++;
5 Z7 F7 f' R% ^# \8 ] if (N>=30) {EA=1;return;}
2 S& I) C: F; l L* o }
9 [% I0 s4 `# x9 ]" c% M IRCOM[j]=IRCOM[j] >> 1;
2 h$ b5 M$ q6 L2 @ if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
2 \' w6 m6 I& A# X1 t/ d) A9 ^ N=0;
) g0 w2 C/ T$ U3 a% N, o }//end for k
! \' G# |% P; _+ q; i3 x }//end for j- I, u+ j" u6 s$ q
1 ?: F8 L. s% I7 `8 j' P" E if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}2 e7 W' ^( x* P$ V
IRCOM[5]=IRCOM[2] & 0x0F;
% B2 i8 }6 g( S! y; H: `! u IRCOM[6]=IRCOM[2] & 0xF0;6 `0 G) R9 [: `6 `
IRCOM[6]=IRCOM[6] >> 4;' n8 x% X; M! h; `+ k3 M
// beep();
7 s+ P0 d$ I( U, F: { z6 j EA = 1;
+ J% R. \+ ?1 m- N/ v9 y" o' G, [0 @- U) ^
send_char(IRCOM[2]);
1 h& X( H2 I' t! h! Z3 p \- g9 P: G8 A m
}//end interrupt
7 Y1 o2 Q& P. D; x. {
; g, O# w e( E! Y, `//下面是延时程序
$ b3 }" _- r+ s! |4 ivoid delay(unsigned char x)//x*0.14MS,unsigned char x是参量
$ I$ D, V7 h' c7 J6 e{
( f. N2 X4 R) I4 ^ unsigned char i;
, f3 m* U4 s% P0 v' n% _; K, K2 m& f while(x--)* N& W9 J& L7 Y1 L( A; F, ?
{& a7 K" j2 P% @5 c* K0 E6 u v
for (i = 0; i<13; i++) {}2 c. z+ P6 ~' q( {( f
}2 z. U5 o# ]6 w2 `) E5 b
}
" ^& f. O* O# F. d/ M% ~
7 a' ?$ u! Y. k8 S3 j! l//下面是延时程序6 Q0 ]* L n4 s' B) O% u/ i" d, r
void delay1(unsigned char ms)//unsigned char ms是参量
* k9 J* H5 D2 O$ N+ T. d{
# j) H) o1 }2 a4 U6 q+ H unsigned char i;
, {1 P. d, O! P' }( b6 v while(ms--)
: `0 a$ P4 M P {
( F* V( j* U$ i: b+ a. ` for(i = 0; i<120; i++)
2 s: ~( O2 y; R5 H+ N' q" Q6 [ {6 c* d% p. ^5 x8 J9 a
_nop_();3 ]5 a$ h' A. Q: [: I t
_nop_();
( F3 U7 O. f# |0 D$ ~% _ _nop_();
/ v6 O: o5 g, x8 D _nop_();
7 b7 O, ?/ A8 \ }4 b5 S9 \( X% _% ^& J
}+ N7 ^" R! h3 S2 t- q6 k4 `
} |
|