|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>6 [$ i( ^8 [3 t4 R
#include <intrins.h> |) U; F# _& k+ I- Y
void delay(unsigned char x);//x*0.14MS
W0 J: G1 c! a- j* T Ivoid delay1(unsigned char ms);
! D5 ]5 p. q% e& x, T% E ~( |3 Wvoid send_char( char txd);
4 i' [4 N2 F& t% u1 j6 g/ Tsbit IRIN = P3^2;//INT0(外部中断0输入口)5 x0 K, r& T, M, Y5 K4 O! X
typedef unsigned char uint8;
* v' S3 Q. J1 a/ ?6 ~. Punsigned char IRCOM[8];1 A, g& f0 d1 T/ ]2 A1 J$ }$ _
unsigned char code table[16] =
3 o; L# K4 X: v: R% Y$ P z9 n7 V# F {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, H5 J9 R: U8 i+ i7 |
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F* A: R! e) n! h. t, h& D
/*波特率:9600*/
/ j. G9 N- ^* z$ q! k9 dvoid uart_init()1 J1 V# `$ r4 g ]
{
* F4 @/ A. T7 G( D1 W9 t+ r' _6 n TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
8 p; X5 l+ M9 Y. Q( F( N" { TH1 = 0xFD; // 波特率9600: i$ u0 ~* H! w' E) R
TL1 = 0xFD;
. J2 B4 f, j/ j8 }+ q! | 9 o/ s" k. z$ f5 T* b$ h
SCON = 0x50; // 设定串行口工作方式- M- l) r2 d8 w* x6 @% l
PCON &= 0xef; // 波特率不倍增* l: Y' _% D! n( s- U) b. h8 r& l/ a
. W9 z$ J: L( Z& T: S _6 y1 w TR1 = 1; // 启动定时器1: @# X8 D: p# R* W. m! ~( F& I
; |" ~) V8 f8 h
}, ]6 d" K }7 o$ G* I3 r5 z
/*UART发送一字节*/
& a! ]0 Z' D9 P' B$ u0 c$ Q
: I% M1 C. G; Gvoid send_char(unsigned char txd)) M* g: I5 l) w+ K5 @- Z" N `3 q
// 传送一个字符8 W: t2 i9 \2 @( t8 F8 S
{) h, ?) J# j3 Y& n$ V
1 R4 { ~* b0 h SBUF = txd;* B: r$ W# }% l! }7 V! J
while(!TI); // 等特数据传送
* A, b5 N' X) s5 f) @7 j TI = 0;
f' x% i+ }2 L6 L# a // 清除数据传送标志8 O3 A( n0 r" u' m" P5 U
}
. n7 B7 ?+ M+ Gmain()
% f: t0 T, `; L{4 A) O" ^* X: l0 |2 }, J9 ]0 v3 Q
8 _# u8 @! _, E: @1 g
IE = 0x81; //允许总中断中断,使能 INT0 外部中断; A/ e1 P$ d+ h% i; }5 D, x
TCON = 0x1; //触发方式为脉冲负边沿触发
: z" g) w! ^/ E delay(1);
0 ~9 z( N% _0 b2 ]4 B+ M
0 o6 R& Y) e9 V8 N. n0 v, c IRIN=1;. H5 _# l* q9 n7 k ~
//BEEP=1;1 J( [, g& |$ V1 ~6 Z9 q# m
//RELAY=1;2 }: T& J ?& g$ ~6 L
for(;;)
, x# i# }' b; w! s {4 U- W# N9 @ c9 l9 l
uart_init();5 Y# W4 Q2 C9 C* b- M
% A4 _# W! T6 W8 }6 e/ L }
( f# [, T) R; y' C. z4 W% Y
, C9 }5 F, l8 Q} //end main3 Z/ C9 G% @5 c9 B8 x- ]
//以下是中断服务程序
$ \2 B. y2 }' e. x$ ]void IR_IN() interrupt 0 using 07 c1 u# @! b3 h2 S
{3 I. k; M9 A6 s) ]9 V
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
8 g( n8 V" E: O# @ EA = 0;//禁止总中断/ ?" T# {, [# i
I1://标号, a/ T% w# t4 H, W8 X* n
for (i=0;i<4;i++): x+ e) N) m$ j% N; r
{0 f6 \! O0 C2 Z) X' K' C
if (IRIN==0) break;
7 p! t- W' l1 N! n8 ] U4 b if (i==3): \5 R- ^2 J u0 r
{EA =1;return;}//如果i等于3就打开放中断
7 l7 c4 L2 G- W% b% m5 J }9 B6 h/ M% o$ K0 G
delay(20);
' J' Y* g* G* _2 w7 _/ l( e% f if (IRIN==1) goto I1; //确认IR信号出现+ M+ Y& o$ z6 s
while (!IRIN) //等 IR 变为高电平
4 e" X4 w s6 {8 r+ Y {delay(1);}
+ U P2 X3 X0 |2 _; x
2 {3 K" J8 m& W2 l& {$ Q1 k" l) ~2 i! L, y for (j=0;j<4;j++)" g8 O" Y+ ?: B% Z% p
{ 9 F+ K! w7 s; ^, h2 P6 ?
for (k=0;k<8;k++)
& i5 ]& Q6 i- G- ?# j! w3 P {
6 l/ f( [( I: W while (IRIN) //等 IR 变为低电平
- y$ T2 R7 T. n& g5 p0 | {delay(1);}
) M5 F% p; p3 g' }. T( V while (!IRIN) //等 IR 变为高电平0 \8 _ H( d9 b1 Q; N
{delay(1);}
0 ~3 N# H, I8 p% k- [/ A( B while (IRIN) //计算IR高电平时长, J x: `1 c' J$ N2 x
{ //如果IRIN等于1的时候就计算delay的个数. [) c% ^, `% H
delay(1);# X* ]+ R9 z1 }! i
N++; . L8 B( D$ Z, M8 e$ X) O. N
if (N>=30) {EA=1;return;}2 j0 m) P, Z. K, x3 ^6 Q4 t7 |" x! K1 S
}5 D7 X, t* h6 z* T
IRCOM[j]=IRCOM[j] >> 1;0 c% d7 j5 ]2 @3 `
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}+ N! C, B+ V5 n/ E
N=0;1 x9 W' ~0 j& b% _) v
}//end for k
$ C5 ^9 v$ | S8 U* p& O+ i }//end for j
) ]8 A8 _5 }" e9 A$ c! K 9 `* r% j. _- u! M. R' U7 n
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
3 S8 ^- |& i r IRCOM[5]=IRCOM[2] & 0x0F;
1 _" P5 M$ B! P8 C$ A! j1 S! W9 X IRCOM[6]=IRCOM[2] & 0xF0;
% S5 n9 g& Y& |; C; P IRCOM[6]=IRCOM[6] >> 4;9 P$ G0 O% U( }; V8 U% _0 S1 f
// beep();5 s/ w% `& n6 t; Q
EA = 1;7 s9 g, s4 j- u" H2 h: u" a
8 ?& R: V* P+ { }! r* u' l send_char(IRCOM[2]);
! p' Y+ x9 Q5 b6 o% k
7 S, Y2 m6 ]% _}//end interrupt
+ T' W3 j2 d8 t+ X2 ~" I! H( v# p$ t- ]) Q6 o& A
//下面是延时程序7 x5 R1 c; E4 p0 g% p) d; ]3 p' C
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量0 H6 ?! t+ |+ s1 E# k
{
v$ K; ]; L6 H4 y6 q( u+ N' [ unsigned char i;3 I" y! H* |, V( d5 L' S
while(x--)
2 n/ c/ B6 I$ a8 X7 E3 @0 i5 C( H {/ i, P, e( m$ u& S* I7 t
for (i = 0; i<13; i++) {}: L* u9 `3 Z" T! R
}
4 z: f+ `4 T$ g$ S! E$ C$ n}
4 z) s( v0 W2 ^0 U! _( b( [. D9 p' v& u) w* m
//下面是延时程序
- q+ }5 E3 G- _: Y/ p) j, S7 ivoid delay1(unsigned char ms)//unsigned char ms是参量
1 i$ p& `! q. I/ n{9 a, d. T: G: j
unsigned char i;
) d. ~( ]! T4 j+ @" d while(ms--)0 B7 g. Q6 i$ I$ `- L: V) s2 [
{
# g4 S+ o" X( m# N for(i = 0; i<120; i++)0 h4 _5 e$ X% e
{
7 o/ y1 z8 L; L2 o5 j _nop_();% @* k8 a% W# l F& M
_nop_();3 o7 O7 m2 w8 Z3 R8 ?) U! d1 |' {
_nop_();7 U2 y6 u. L2 p$ l- }# l
_nop_();* H7 a) ~; o! q( C" M) V2 M
}
, W4 E5 K8 J3 w! x) g( I }
; H$ x) ?: n+ H4 A8 G3 a} |
|