|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
+ m, L& a$ r6 k9 \2 g#include <intrins.h>
2 }/ ?' k, _( w1 N. H, zvoid delay(unsigned char x);//x*0.14MS9 L; y% H/ t4 z& N7 q0 n3 X
void delay1(unsigned char ms);/ {! v6 J2 C$ U8 i7 k6 s
void send_char( char txd);7 S9 T' A2 c+ q* z7 z
sbit IRIN = P3^2;//INT0(外部中断0输入口)
/ b; S% c% y+ C F6 ntypedef unsigned char uint8;# K& K. Z+ c; a% m: _
unsigned char IRCOM[8];
$ v( E+ B& o x4 O( y$ A5 @unsigned char code table[16] =
! e' w6 C* q3 s+ X {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,8 ^" @2 n; f) G/ H* L' E- f0 ^
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F Q, T7 _8 K& `- C$ O# K
/*波特率:9600*/# x' T. b$ y8 b( O% v. ~
void uart_init()) j p& m) B# ^* S* P; ~$ |
{; \( \' N0 ?' m: Q7 d
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率2 {. `, U/ `7 x6 N j& }
TH1 = 0xFD; // 波特率9600
! t7 ?) R: s# Z: ]6 | TL1 = 0xFD;# a. Y3 }( t$ n1 I0 G
3 |9 z- ^( c& R SCON = 0x50; // 设定串行口工作方式8 O. C. q* N! p1 U, r
PCON &= 0xef; // 波特率不倍增
$ T& G) H5 K X c2 Q
# X' F0 N- a% }; L; h: ^' a3 }" u) _ TR1 = 1; // 启动定时器1
$ F, `7 y! R) k) E" Q- Q ! r$ N" y! `" O/ j( K) ]$ M; ~' e5 W) x
}
$ {4 v, t( b3 `1 `! Q" e& j/*UART发送一字节*/- f: j C$ c' J+ [$ {1 t4 q# d
5 {2 h7 f$ P/ e8 X$ t& Z- ]
void send_char(unsigned char txd)( u6 _# Y1 E- T( a- z2 S; C
// 传送一个字符
6 H d1 v7 W+ L: C/ P" A{
; C U p4 `- k( }0 y- M
' P3 F+ u. a/ h* U( K SBUF = txd;
& r4 a0 O* {" e' i( ]3 P$ t while(!TI); // 等特数据传送6 Z0 c2 a0 G3 w6 n6 [1 Q) M8 p* [$ j
TI = 0; * r- D, q! W2 C' Q! `4 Q2 i
// 清除数据传送标志
U2 J; X- E( U}* g8 z( r: W. }5 u
main()
$ ?) |% z1 y, s# v ~{: a: x v5 b, b4 m& D4 U* `
* y K1 a1 x) P0 \$ n
IE = 0x81; //允许总中断中断,使能 INT0 外部中断* v- ^- f( Y t+ n
TCON = 0x1; //触发方式为脉冲负边沿触发
1 P- D' u/ v9 Q+ e( w5 n( Y delay(1);
! Z) O0 M1 h( m- \. V# j& R/ i# A! N
( ~2 G* o9 i8 b; r c: R7 t IRIN=1;
1 ~4 D4 r! \& ?1 q1 w1 b, ]8 K //BEEP=1;
4 H: j- d& n! U& j/ _4 j //RELAY=1;
% O; e4 Q( K2 B8 L6 x6 U for(;;)
9 s. v/ L% l/ h7 P9 }4 e, ?+ \* Y6 K, B {
) b/ N, E4 Z7 v* u+ T uart_init();
* U& _2 i! C+ G$ q5 \) I
" M6 c ^5 I. t0 f0 g1 o }
8 k; P3 O# z* G0 W' L( y
7 t6 c% ?, T" a0 P} //end main
2 g/ B2 \0 k( B9 }7 T6 b8 w//以下是中断服务程序
* ?/ W( B8 y* [void IR_IN() interrupt 0 using 0+ l* }5 i9 }0 v+ n' ]! p6 a5 L
{9 s1 A: ?4 }) o% n
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
3 { p, `8 _# t2 m EA = 0;//禁止总中断& ^6 @/ X* F1 ]% Y
I1://标号+ c& a* u* _% ~0 Q) d' x( S& o( @
for (i=0;i<4;i++), M/ w+ V' l! h2 l8 J
{
4 {- v; z+ F8 S3 w3 z8 a if (IRIN==0) break;
; |6 k. z* }/ j4 e- g$ g* V if (i==3)) r ?2 T& E& N. N8 l
{EA =1;return;}//如果i等于3就打开放中断
4 k5 s; N2 Y( \, B( N }
$ R( S6 T/ ^2 {9 O) T1 w$ p2 c delay(20);; b- i( s: J2 k1 U/ t
if (IRIN==1) goto I1; //确认IR信号出现
4 v: n& k' f: B1 y& `. R while (!IRIN) //等 IR 变为高电平
5 o O1 W& m" x# m4 G# A# t9 W1 w4 f {delay(1);}
# w0 B) R' p6 p C# `
! j- J% u' _2 m; k) I, } for (j=0;j<4;j++)
+ s: K+ R2 V8 P { 8 y- N( }8 v9 D; D; x5 R4 @! s( T
for (k=0;k<8;k++)
# ^( Q$ ]" k9 ]% f e' z: ] { |0 a: D$ y- L
while (IRIN) //等 IR 变为低电平: b6 Y. s- Q n: k
{delay(1);}
. w- E8 B+ X1 \4 `/ t while (!IRIN) //等 IR 变为高电平* Y* S4 Y: b1 s) W: T
{delay(1);}
, @3 d5 g( p% l4 [7 u; }$ C while (IRIN) //计算IR高电平时长; H0 J! I8 J& }5 e
{ //如果IRIN等于1的时候就计算delay的个数
- W4 w4 i: B+ j$ U3 Y delay(1);; k2 t: I6 B1 Q. u' H& O5 \
N++;
/ y& l, |+ v. T! n1 h if (N>=30) {EA=1;return;}
' |' q4 E6 H1 d! I" x* O& S }8 D* l7 N3 M4 Q" ?# b1 S
IRCOM[j]=IRCOM[j] >> 1;' K5 J2 J5 Q4 u% |+ o S/ G7 r F
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
X8 c3 S5 A C N=0;
7 n' I: x% W. Y8 f3 @ }//end for k, x* }, z; }% \ C' t" d4 u
}//end for j
3 Z( @2 c0 ] R9 S% \0 f6 D9 p% J
0 {' N. X7 z! \7 T. u+ ~5 ], C if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;} }" ?( u6 P. N" E/ ]
IRCOM[5]=IRCOM[2] & 0x0F;
/ ?) F" y* f7 x7 @, O IRCOM[6]=IRCOM[2] & 0xF0;- F, b, b% m6 a
IRCOM[6]=IRCOM[6] >> 4;
" y8 o j7 H+ h4 {0 n% [2 G, J, { // beep();
/ [! A* g: c* u9 D v0 u% j EA = 1;/ ]: V& k8 {4 @
( w) z$ v1 ]# K) b, r- S send_char(IRCOM[2]);
" ?& C6 v1 b/ j {) X7 H" L u& b! e( w" U) h' c
}//end interrupt
* X. Y4 y; h1 X3 ?% j2 o" S6 ~4 I2 H" S' l1 T5 I
//下面是延时程序
* n- }. }" {! s% tvoid delay(unsigned char x)//x*0.14MS,unsigned char x是参量
6 q6 z7 [0 x9 P2 F{
x0 ?* n9 L! `* N; q+ Z unsigned char i;
2 t" E- ~3 z, A while(x--): P9 U( H6 O- k2 e& k
{
X" {# w6 R: Y) I9 ^ for (i = 0; i<13; i++) {}
$ r1 O6 P6 d7 u1 C* K0 j8 p }# y$ ?" S: \9 D! q+ _5 \; e
}4 {: ^: R$ Q2 w
& j w' O* W' ]2 i
//下面是延时程序
n& z- ^3 J9 k( t2 \void delay1(unsigned char ms)//unsigned char ms是参量: R7 e/ j6 Y% N/ s6 O1 `; q
{
1 q1 a0 }. }: l0 N5 T unsigned char i;
- a5 {" c6 x& s4 ? while(ms--)
; |. B& l' Y/ X. G4 C6 u {
& I. ^! L; E) w9 N/ U for(i = 0; i<120; i++). @$ X/ m+ T4 ?' L/ K
{* k- P& g, k5 Y. W5 v
_nop_();* t( X' x6 a- X1 k/ R
_nop_();/ G5 e8 i# V5 u" U! o' V$ e' D( R" ]
_nop_();
- Q" h6 K) p' z6 X$ f0 L9 |4 ^ _nop_();% t2 o$ y: i- K% c
}+ ^2 u9 \) l! T9 Z
}
0 M1 p( f) b4 o9 Q0 M} |
|