|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>( ], K( K, t6 z6 F6 f/ y4 k( l- }
#include <intrins.h>/ q. ]( I# f2 U2 I
void delay(unsigned char x);//x*0.14MS
( f' W6 w8 q; p7 ?" V( g5 ~void delay1(unsigned char ms);( ]( `8 b* F+ @$ S' p, @ K
void send_char( char txd);
/ X' [% r, H5 i3 |+ k* Hsbit IRIN = P3^2;//INT0(外部中断0输入口)) i2 q; \2 S, j# d+ D$ R
typedef unsigned char uint8;8 u+ b/ w+ `. a4 w+ a. u+ v
unsigned char IRCOM[8];
, y* Q& Y6 X b- l sunsigned char code table[16] = % n2 x& B% x8 w9 L# Y
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
' I6 {" S# Z- S+ ]- b& C& \; v 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
, S! U G. y* ^# p/*波特率:9600*/
( [6 s5 E: W: d; x& ~( \8 Lvoid uart_init()
i4 Y' f9 x) a1 x' G1 x9 T{
9 R1 B' x2 l: N$ P6 _- A/ F8 c% R TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
4 w: E; u1 Z( G, N* h& ^ TH1 = 0xFD; // 波特率9600
+ Q* c, n3 j9 _* n' j% x; [ TL1 = 0xFD;
8 w2 ]( A0 m( O& g) u* j r% G . S8 v3 l* A* A! Y
SCON = 0x50; // 设定串行口工作方式! J" R% k' @ P# M( P6 T
PCON &= 0xef; // 波特率不倍增
' m$ d6 s9 |2 g4 D0 e + G6 c8 i2 L! D: W4 O9 @
TR1 = 1; // 启动定时器18 F2 f0 ]( j" M+ A$ a5 U
0 X3 u9 [) O# \/ T& V1 ? m
}
' L6 ]4 O2 i* R4 g5 \3 q/*UART发送一字节*/, G( J1 U# L* i7 K
: e1 Y1 e$ k, L5 R5 @! e0 ]) d- Uvoid send_char(unsigned char txd)0 {0 b3 K, F& A: c4 ?& W# d4 w
// 传送一个字符
% ~0 F# t5 I7 M3 A! ~{
8 D6 O8 K+ |( @' K# p$ L% k/ _ 6 Q- Z! ]* I9 H7 s3 A- b5 Z
SBUF = txd;! f' b1 w. k4 \' I4 H+ U
while(!TI); // 等特数据传送/ _" R( |7 j; M% h' }, f+ n
TI = 0; 0 u# |! o+ \* E1 W4 l& v' b
// 清除数据传送标志 W% A% Z1 j+ d$ d H- R1 e
}
. J0 d: x, @" Y* e8 y4 p( o- Xmain()
' K! l/ I- c* i0 I3 Z4 n& c{8 M9 C ?( G* x" d9 f
0 v. e& ~, q9 X7 o IE = 0x81; //允许总中断中断,使能 INT0 外部中断
; U8 r7 X- V$ R: P! U: P TCON = 0x1; //触发方式为脉冲负边沿触发$ N* y" P7 r" \4 M/ k
delay(1);* H# w- m" T8 q; e
+ h( _( { k8 ^9 X IRIN=1;) N* n4 ^2 q2 L0 n( }
//BEEP=1;6 j7 b$ t7 f" [& W3 e
//RELAY=1;; n2 d$ \: ~7 I) T" z, \# n, g
for(;;)
/ i5 H" j Z, i0 x% ?. @ e {
( F ]0 K- f9 A6 V6 f4 l uart_init();! M& z/ d- @1 w" `5 `) D
2 }3 g* y' W: U- Q5 o, l( h- H' V
}
1 |3 l0 [, L3 F" c' p 6 ]. ~2 }+ U: {. x. |7 X* j' t. M
} //end main
/ ]6 M% a( b" a2 U v//以下是中断服务程序* ~2 N( r8 I+ K5 S+ i0 d
void IR_IN() interrupt 0 using 0
4 O( K6 |! Z! X+ |8 i: d0 ~{
1 b( B! |/ v' F* F, u8 v unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
4 ?0 g G0 M. h; W* Z9 E; h7 P EA = 0;//禁止总中断
) j0 G7 {1 t( N& yI1://标号
. n* n9 |8 F& y for (i=0;i<4;i++)7 ?4 G6 s T* O# y; _
{
' V" s$ ], N+ x. C" ^ if (IRIN==0) break;3 |) A4 [+ E" c5 a6 r3 o
if (i==3)
) ]8 i4 i F8 T" w! Z4 R {EA =1;return;}//如果i等于3就打开放中断
( Z) K4 x# L1 x }" }! u% _5 E, Q: a7 [5 k1 }
delay(20);
4 Q, r! n4 @: V/ f6 D0 k if (IRIN==1) goto I1; //确认IR信号出现
& t* x" C2 d; _9 C while (!IRIN) //等 IR 变为高电平
- @; g& ^2 P j1 |, |7 q {delay(1);}
! P5 B, f5 w0 `, i
% q. I, q% A2 n for (j=0;j<4;j++)
6 N+ n) N/ T- U- |& }0 U/ R, U I {
9 M" b4 @9 H6 g( f- u5 Z5 E4 K+ P! n for (k=0;k<8;k++)7 H6 A2 K2 I# z, V7 K+ b
{2 O# h8 ~. v* x. l7 Y5 k+ Z
while (IRIN) //等 IR 变为低电平% b1 b/ R3 u* c! T, [( I* @
{delay(1);}
7 r' ?8 w; }5 x, J+ L while (!IRIN) //等 IR 变为高电平
' x5 o) G- |$ [! w {delay(1);}
5 ^6 [9 \& D1 Z. z& o" v' y) j while (IRIN) //计算IR高电平时长
- L! f% K* n* O { //如果IRIN等于1的时候就计算delay的个数
$ P* B. ^. z; h& {# o9 |( v delay(1);
! ~7 f# d' N8 \6 t H% _ N++;
# a) y. |# H1 f3 h5 G7 L7 B" { if (N>=30) {EA=1;return;}& j$ B$ L, k d; ~9 z% R
}
. E$ G8 |2 t. g5 W5 J' I IRCOM[j]=IRCOM[j] >> 1;. G/ s- A @3 {' Q1 f" y7 G
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
1 o" ]: G9 q, U( `8 H# I N=0;
; T' Y m5 o5 h4 E! H$ L- { }//end for k: I5 N8 I/ X6 T( ~% X
}//end for j
, _5 a6 K$ f6 D4 F+ n- b
- a7 }! a$ C# }: w. U3 g if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
# Z3 I+ B9 Y0 S8 ~; \ IRCOM[5]=IRCOM[2] & 0x0F;
+ C$ g ~1 m0 W) `" J, A) V IRCOM[6]=IRCOM[2] & 0xF0;
% W0 {" X: l; |% @- ^ IRCOM[6]=IRCOM[6] >> 4;9 |2 X: D9 a( I
// beep();
3 g( `1 I$ y r+ Z1 V+ ~5 \ EA = 1;
/ {+ G5 D) n* l$ x4 l5 H4 p3 ^! k M7 {4 W G8 a5 K
send_char(IRCOM[2]);
7 ]8 r, T8 S2 |( V. P2 b+ N1 p. Z# \% o7 C: C9 d% q6 {
}//end interrupt1 a" |: H3 a& E- }: N; i& q
6 F/ o4 Y, {- H' ], }. F% J//下面是延时程序
8 y2 D: w0 H9 [void delay(unsigned char x)//x*0.14MS,unsigned char x是参量4 s# p+ r: y2 p9 p9 T* @
{! L; d" b U8 R2 `
unsigned char i;
( {( D' p5 f2 x2 ?4 `8 y while(x--)
9 A' r' f" \+ ], L {& w/ J& W+ D7 X8 o
for (i = 0; i<13; i++) {}: L! K; Q: a1 H
}
: T6 i& p B$ T}8 I4 m) A8 J# E, [
$ Z _. j3 X8 Y+ i- ~//下面是延时程序1 F3 `9 C7 G% L9 F
void delay1(unsigned char ms)//unsigned char ms是参量
6 B3 l* r; }1 a T- P2 j7 N{
0 s, p f! Q" G unsigned char i;! _' O5 i Y+ W7 t7 t( i
while(ms--)8 p8 D( d o+ C+ V1 s# X
{& w' z7 ~9 R+ A/ t
for(i = 0; i<120; i++)! \* D7 \1 Z) c$ X
{$ i# S2 p- ^+ Y6 c: o" M H
_nop_();4 e. h3 a* u d, n* H3 E
_nop_();4 L- n3 x3 I% |: Z$ B' A
_nop_();
4 b$ }% Z* l: e( }. V1 X1 f* p L# R _nop_();
! |. K8 f! I k, |- f }9 ^* Y; j2 U3 |/ F1 Q
}
4 O2 F& v9 w7 k1 E. O$ V) `} |
|