|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
. p$ k1 x8 T! }; \4 C- p#include <intrins.h>
+ b0 L' b3 E. Avoid delay(unsigned char x);//x*0.14MS
7 m8 l% r( I2 R' e7 l! Kvoid delay1(unsigned char ms);
, T. F9 A n3 U7 E- mvoid send_char( char txd);
4 t; Z- B2 c, p5 r& D+ asbit IRIN = P3^2;//INT0(外部中断0输入口)& N/ Y- x9 {# @5 f) P* j& d2 ~
typedef unsigned char uint8;7 t! z' q% W) O8 y7 e
unsigned char IRCOM[8];
$ A+ B% d. u, }0 Q7 J( @. g* B+ Tunsigned char code table[16] =
: T. H( `9 J9 N {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
4 Z. t& U D' R* X8 x" y# E* X 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F$ E+ y7 j9 q G+ k# n0 f: ~5 _
/*波特率:9600*/' e# j! R4 ]2 h5 r! W' A+ P
void uart_init()
5 X" @0 ~% ]* F4 P{
6 M) A; s2 |+ Z6 i ~( e' J7 Z TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率3 H1 \/ d, l9 C, l6 F" y
TH1 = 0xFD; // 波特率9600! T: {- E8 B: S4 q( u$ k! H) H7 S
TL1 = 0xFD;
% W, ^9 }- h7 Z/ r* n0 s: o 1 P' g {$ h7 k3 X: M2 _
SCON = 0x50; // 设定串行口工作方式/ V5 B4 }# |) u3 t
PCON &= 0xef; // 波特率不倍增
^. D0 X4 v2 D
, u9 I5 L7 H* T+ S7 y' j! O TR1 = 1; // 启动定时器1
0 `, C+ c6 n- t* M3 d$ h 0 T+ b$ D' i) ~- z& S ^( a
}
: C$ t+ @9 b* P7 C! `" N/*UART发送一字节*/
: T8 ~) a0 g! @+ c' {6 Y- j; v8 _# ?" e" U; R+ W
void send_char(unsigned char txd)0 R5 J7 a- M9 a8 v, t
// 传送一个字符. C' `4 ?2 R+ [ x8 I
{
, C1 A* P" G* N- a" ]3 j
5 y' z; q4 `8 S& b6 l* Q SBUF = txd;6 ?# _0 e5 {+ @) t3 c9 b- {
while(!TI); // 等特数据传送: K3 v9 a4 q: w& \4 \% u
TI = 0;
# w& Y2 c5 C+ | // 清除数据传送标志
2 p: \( p, Y- v# v. I}
1 |# H @7 [ Qmain()- H9 F+ V: A$ P3 R8 A
{; K/ L) f1 ^9 ~# P% W( H
- t$ j8 w; p. C0 z% t/ U IE = 0x81; //允许总中断中断,使能 INT0 外部中断
6 N: u# l3 d4 K" w3 Q1 a+ S: B7 e TCON = 0x1; //触发方式为脉冲负边沿触发1 @% I) n& P- }* S$ q5 j
delay(1);# D# V, x' d8 E+ n( t9 T% \* T
8 m$ ]8 a( z9 @1 i$ }9 P6 C! z, I, ]
IRIN=1;
& M3 i/ I8 k8 U3 Y# K2 N //BEEP=1;- k& n9 s! U9 e* I! u
//RELAY=1;
: \' c* r' b. Z3 d. m) Q& X for(;;)2 L! `$ k6 Y. N- m( |2 X. ?& Y
{
8 q( ]& S; N- k8 M uart_init();+ q. |9 N7 O7 N9 k3 H4 D% O
; S" j% ?1 Y( G: o
}
: M& M4 p" d9 h: K e + O, x$ g6 D1 E" `3 l/ s
} //end main
% l$ c, |, @ J7 y//以下是中断服务程序# x2 I j4 Q J) Y B
void IR_IN() interrupt 0 using 0
- d" B( W. U. C$ N) a# ?{
$ k. o1 w6 b. K6 X+ k9 c7 X' M( B" D3 ^ unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
1 k- C" n8 N. z1 X( L EA = 0;//禁止总中断
% N0 \& L7 _) W+ A9 pI1://标号
$ c( K" Z0 ]8 ?1 }( S for (i=0;i<4;i++)
' ^- G9 ]/ d9 }# W' e/ F {
6 _' s9 } m" Q3 m8 e# [, t if (IRIN==0) break;3 r( X; S+ M7 c& f( W
if (i==3)
$ ^/ ?9 ^5 o4 r6 T {EA =1;return;}//如果i等于3就打开放中断
; a5 q5 ^! h. \ t( b }
$ }( X: V/ x5 D9 F# ^ ] delay(20);
' \; d p3 p! R; L6 F( Y if (IRIN==1) goto I1; //确认IR信号出现
* m& w" x' S# C$ h3 B2 Y" O while (!IRIN) //等 IR 变为高电平
& C9 n- R) P6 Z {delay(1);}: K9 {- ?/ f/ K+ D
) p1 e( ?/ a: t% G
for (j=0;j<4;j++)* q1 D4 _, Q% o" y/ O
{
) G6 x9 m! h. Z% n for (k=0;k<8;k++)( C, _/ \: M+ l
{+ F5 y5 \3 J4 P
while (IRIN) //等 IR 变为低电平
, e) d* m& V* I$ H- U( n {delay(1);}0 ]1 f2 }! V& y- u
while (!IRIN) //等 IR 变为高电平
" |) M3 [' @. J: q" O0 W7 h- ]# } {delay(1);}
~! l3 X) A# z" K' |, [' x while (IRIN) //计算IR高电平时长2 E' b, X: T. f3 Y5 G
{ //如果IRIN等于1的时候就计算delay的个数* Z) I' m( n5 f% W& l- P
delay(1);, ~+ b, e& E* k" W2 h( H
N++;
! h( D* L* a2 f: X if (N>=30) {EA=1;return;}
1 R) w; w: Q1 X' h' J5 c }
" N" a5 ^( x1 @4 ]. {- {- z IRCOM[j]=IRCOM[j] >> 1;* s4 n* G: J4 q' M% _" W
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} l" O! E) T) F3 F2 r! A( T; W
N=0;' T" [% v, H' Z: J" z* O
}//end for k
/ i4 k& Q7 ~% w }//end for j6 D7 I: P- U% G6 o$ ~! A. X
$ r+ S5 A) [# X; g6 W" j
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}, X2 r3 Q+ |7 u
IRCOM[5]=IRCOM[2] & 0x0F;4 s0 ` R$ l$ s- N
IRCOM[6]=IRCOM[2] & 0xF0;
; ] M \6 m4 G6 c0 z! x+ v IRCOM[6]=IRCOM[6] >> 4;
- E1 C/ [. `# m* q T( S# ~8 ? // beep();
+ p8 ~* g: n( I4 I) g+ q EA = 1;$ h7 W1 l* }1 y5 C
. X, n1 A+ I& c* m# `6 r5 \" b) l
send_char(IRCOM[2]);3 d0 {* L; s t6 c
% x! F# d/ L2 b/ S3 m7 v0 d( s" [" [
}//end interrupt- i2 A1 l% {7 g8 |
0 J3 M; |3 @7 s/ x/ l, o+ F% ~- i
//下面是延时程序9 u/ @, c$ j$ Z* M; n
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量! A& V6 s% B; `1 O j
{8 m' _) M% J+ T2 R- E/ ^; I
unsigned char i;
4 A7 O5 a$ @- O, O/ g v, q while(x--): E; |, ^* E# [! t* {5 G
{% {+ h& _; L. ]3 ?0 [
for (i = 0; i<13; i++) {}
1 `( U( ^! t$ W }2 n6 j% g' H: G4 a8 i; K8 l( {. R
}8 A7 [9 S9 H/ I
9 Z4 `- [) g0 S$ i* }
//下面是延时程序9 i6 g! f% a+ ]8 p5 {
void delay1(unsigned char ms)//unsigned char ms是参量1 {2 ^( w/ X* _: {8 R* O6 p' o
{5 f1 q5 y3 v) O$ Z* p% Q0 G
unsigned char i;
5 r) W' K$ \) d U2 o% ? while(ms--)3 B8 {- y+ W& n1 K7 }
{
! ]' g- e' k1 u for(i = 0; i<120; i++)# w L2 ?# C+ W4 O0 I
{9 _0 J/ n- n6 G9 w @& D
_nop_();
4 A$ `/ H' K8 o _nop_();
( f5 i6 l j. I _nop_();7 L% H0 X! i& \$ P: d5 i5 J: [
_nop_();+ Q( K% P: G- f0 w( B
}
3 D0 L% z% X. c0 D4 g8 w' S }& K0 N' @) J8 \8 n" a/ d
} |
|