|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
" q( |! t/ O& Q" d# d4 Z1 W" \#include <intrins.h> q. F' F2 u) @2 m! _( X1 `& B
void delay(unsigned char x);//x*0.14MS
! \6 ^3 A. ]0 k' |; w: Qvoid delay1(unsigned char ms);
0 O. v D F$ ^1 R( R5 y& `' R9 ]void send_char( char txd);
4 f* T/ A& x! ~; H* ?) k4 l1 qsbit IRIN = P3^2;//INT0(外部中断0输入口)
: `" T6 @4 e! L( c% N; dtypedef unsigned char uint8;
/ t2 x* o3 k E+ \unsigned char IRCOM[8];
5 P! }$ l2 c* H$ }$ Xunsigned char code table[16] = 2 E; L3 ^, h' r$ _2 h
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
6 T4 f8 j2 |5 a1 h! ]3 r* C9 Z7 e0 O 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F T9 g8 m f7 ~+ |" O3 @) `
/*波特率:9600*// f$ U0 q* K* g
void uart_init()
5 K& d4 l z4 o4 n3 i, U* g{7 v& o. f+ ^6 r( P
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
8 f/ P, n; Y4 Z4 F" e TH1 = 0xFD; // 波特率9600
' [0 _, r3 Q6 b# v TL1 = 0xFD;
& L5 s; r# s) t' i8 w2 w9 j 0 B: z$ A+ J8 o& N0 N
SCON = 0x50; // 设定串行口工作方式
$ Z& A$ q( b; R% E: Q$ D PCON &= 0xef; // 波特率不倍增! J& u7 u- F7 X: H: b# o( K1 S% e
% ?) Y$ V8 C& M( S
TR1 = 1; // 启动定时器1* ^! `6 F8 N! w+ E# R
C+ h4 u5 q6 a; ]* A
}# s' Z9 x6 k4 i) h6 Q# ?' j' R4 D
/*UART发送一字节*/
+ \1 r3 L8 j/ [% _* F0 o `: |" [, g3 Q( s q
void send_char(unsigned char txd)( u* s) |0 t: I% Y8 b# u) x# D
// 传送一个字符
1 ^& p# U/ ]3 ]( B# j) j{
% _8 p. [ Z2 h
7 I+ ~+ e/ R( m# ~0 b$ m8 O3 `- e SBUF = txd;* N9 k9 v3 E+ I# \/ F
while(!TI); // 等特数据传送' ]/ f S/ L1 i# Y0 O
TI = 0; , G9 r- s0 ?4 [5 W
// 清除数据传送标志
8 b, K# C0 s4 P5 m}
- \, n+ g x; x/ `main()
; Q$ v& l" C9 H8 w{! W7 p) }& ~) K& W
3 A/ _9 m+ \ L- d, K IE = 0x81; //允许总中断中断,使能 INT0 外部中断
$ X7 Q7 j7 I1 {5 M" J" l TCON = 0x1; //触发方式为脉冲负边沿触发2 }! D! [5 d. ]
delay(1);- J, }' i: ]2 m
& v. C& V% O! b3 B& {& p0 E: J* g IRIN=1;) |8 ?3 o2 i- h4 n
//BEEP=1;
: D8 L% M; y) r: Q //RELAY=1;
3 X1 Q S: d3 {$ n& ~/ v/ f for(;;)
6 k3 U- J+ c( j& F; w6 c {
- q' s1 F- T1 t0 A0 |% \, ^ uart_init();0 s' M7 i1 X- T6 U( `3 M8 Q! }- m
$ x$ s- V# B/ z3 a* Q2 S
}0 z0 k$ P1 u" }+ Q h, E n- X
: u9 ~2 o4 y$ q9 s( u} //end main) U$ z7 p1 s# U9 m5 w+ }
//以下是中断服务程序/ i1 ~8 g7 k( C, F- k. B: E# {+ A9 G, ~
void IR_IN() interrupt 0 using 0
( B' N0 C% |1 x8 A7 M{
9 }8 N6 u) {; q3 K2 B unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
, v3 Q3 q# y; ]& P* h& f; e7 ^: M EA = 0;//禁止总中断
; a, N* N: C* {# O- l( ^. `I1://标号$ q' L0 O" y* N
for (i=0;i<4;i++)* A W3 o. A0 l$ o- q* Z2 ~
{4 G: @. F. N% O/ \: H9 @
if (IRIN==0) break;
$ w% G, g9 [" p3 \ if (i==3)
" n2 R# Q0 V3 P {EA =1;return;}//如果i等于3就打开放中断
( p4 D5 o* C& e! k6 A. o( O }
2 ^: b# q# \& k( |) N. Z8 J u delay(20);
+ s5 I" [, |0 j1 \1 P1 j if (IRIN==1) goto I1; //确认IR信号出现3 d9 u+ }9 I2 J) q$ t8 g
while (!IRIN) //等 IR 变为高电平
: x6 S: k& s! \1 A; ~. G4 C( I$ W$ w+ G {delay(1);}
/ d' W5 U' q5 L7 R' H9 ~3 H3 n
U ^# t) h/ l4 j' C* j1 H for (j=0;j<4;j++)
6 D8 e5 |8 D Z0 R# x' y { 0 Z! Z* G& s% b% J
for (k=0;k<8;k++)! Y3 c8 z0 Q) o2 {" r% S9 \8 S3 T
{7 X, u/ l! ~# h4 X3 d
while (IRIN) //等 IR 变为低电平
! s! X1 l6 \0 g3 a {delay(1);}! x% O' j4 N/ Q) z! C% _
while (!IRIN) //等 IR 变为高电平
" s1 D7 d( K, C6 T {delay(1);}* g& a* D; P5 p+ i) b6 N
while (IRIN) //计算IR高电平时长! B, n# u& Q2 M. R# }
{ //如果IRIN等于1的时候就计算delay的个数
5 r7 b1 p p( n6 m9 [0 P) C delay(1);0 ~5 l! w$ d, l$ D8 Q8 d
N++;
5 ~; Y# @- E. d if (N>=30) {EA=1;return;}. B* z0 L. Y. [8 q: }* i
}' m& E+ U& i% w4 `
IRCOM[j]=IRCOM[j] >> 1;8 p* [ }4 r' P6 m% F
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}* e% `$ R" P) w/ J* c6 K$ Y# U& f4 X. p
N=0;
, f" _0 D( S- D$ B }//end for k' J# U2 Z: a8 Q; U
}//end for j
/ j1 t- m* ~, W6 d4 Z
/ G9 M! a0 S: o4 H( e2 S, C if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
5 w I7 W) z) i' W- H) B IRCOM[5]=IRCOM[2] & 0x0F;/ T) }0 D2 w' N" K# W4 t0 o
IRCOM[6]=IRCOM[2] & 0xF0;7 I* `5 f# P) B% ]7 R& A; [( F
IRCOM[6]=IRCOM[6] >> 4;2 |0 b) l! @2 x
// beep();* B) O7 A! Q3 t. i% [
EA = 1;% w2 }8 g9 ?, |, w$ E
' F4 ?# o1 Z$ y' C6 k
send_char(IRCOM[2]);8 t& {9 s5 `( V( z9 l3 b
) q t' U p2 [' o7 {}//end interrupt4 M2 Q) W# M9 X) Z7 d3 |! m( q
' X, \, n5 X% r3 P2 A( d& O. H4 j//下面是延时程序( z/ k$ Q' ~) V h
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量
]. A t9 r" E( Z{3 H Z! V' e. c' R
unsigned char i;1 Z" \: H5 M! `3 j
while(x--)
; @8 l+ J o1 z# t8 Q {# M) r, H! i k! a% i( A" G
for (i = 0; i<13; i++) {}
& j8 K; A9 {' e* A0 C }/ C' S$ T& n! m' a
}2 P6 \# Z# ?% O: v( H
1 P/ Q! ]/ {, @; m//下面是延时程序( p/ E- S( j6 w s
void delay1(unsigned char ms)//unsigned char ms是参量
4 `8 L7 L. W2 B' k3 z" T j{/ ]$ j+ ?& c4 S0 A+ {7 t
unsigned char i;% t8 R3 h9 F' }0 D: \
while(ms--)5 L$ I" ^5 X0 c1 x2 q3 f
{* E3 q7 H# Z u' _6 o3 @ p
for(i = 0; i<120; i++)( O* |! [# e+ q1 R0 e6 B
{0 `0 V% A) d8 |( @ v
_nop_();
' `2 u. e% p' a( O1 w _nop_();
6 A3 U$ t- f: Y4 U# Q _nop_();. K! l5 L. z" j2 Z+ I1 |, ?
_nop_();/ _: L3 K- ?/ f( z% t
}
& W5 h1 G5 |* P! G( _. V& a" i5 E }
6 k$ q/ \# c8 \) y7 x t} |
|