|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>: b& O7 \ T8 N+ D9 I" \
#include <intrins.h>+ I# w* A1 a* ` I# P
void delay(unsigned char x);//x*0.14MS8 X- |4 q& M; A9 _& _8 `' c f: e$ ^
void delay1(unsigned char ms);$ D; J% N6 a0 ?7 g% z
void send_char( char txd);
) W2 W \: V: @$ _1 {sbit IRIN = P3^2;//INT0(外部中断0输入口)3 }# _! O8 w' n' b( i; I5 \9 D
typedef unsigned char uint8;
% N3 |1 G5 o* Y0 k1 S! n8 M/ O5 g3 vunsigned char IRCOM[8];
, r; ^( F3 w2 o: q: i0 @( j$ yunsigned char code table[16] = 7 M! i- Q6 C: P
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
& U- Q- `& O; S+ \ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
8 p6 R' s: N, y/*波特率:9600*/- y) L! @* S9 B0 z* e/ a$ d
void uart_init(): v* F+ X* G' I. f8 v6 Y
{' F" U2 P, o6 t6 z
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
& @1 p, M/ L, A TH1 = 0xFD; // 波特率9600+ y7 I! G& ]) b0 T% X$ N2 n- D3 S( C8 U
TL1 = 0xFD;( ~, I7 N3 m# v7 f
J$ K0 g+ y5 F; U) g1 w, {
SCON = 0x50; // 设定串行口工作方式
7 q/ _1 S; o" C5 { PCON &= 0xef; // 波特率不倍增
. v0 t4 r# x9 o/ u0 }9 I5 U
5 t5 }# ]% c5 c& N TR1 = 1; // 启动定时器1
; M7 E+ G* {- F$ e& ^. f + w* P c2 B/ l9 x& O
}
9 F3 W% z* o4 i/*UART发送一字节*/# Y( g* }/ _ j0 }* h# c7 l/ j
+ ?/ z" ^5 n% t6 ?' n% w0 S4 d; ]
void send_char(unsigned char txd)
2 r0 R$ f9 B: |$ U4 t// 传送一个字符9 ?& C3 o. X3 Z) M; l, `
{- y( y \- `1 ^, Z# O& r# M
4 H1 l$ M# W9 y* F2 L; Z" u
SBUF = txd;# q) v4 f" C1 v6 f3 R) J5 \, r3 z
while(!TI); // 等特数据传送! f6 o. w! x& R) p o
TI = 0; 4 J) k- J- u2 B5 h
// 清除数据传送标志( s( c5 Z5 W, i
}2 D2 d7 z8 W9 v. U
main()2 J' U5 F+ _1 g |6 Z
{2 O$ Y; U, x% M4 m2 {6 y& v
- X( ]7 w3 A5 O0 ^' F% w% C9 T
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
+ u( s* x5 N F b* _ TCON = 0x1; //触发方式为脉冲负边沿触发
" A6 _0 P# _ b7 K. L; k8 B delay(1);
9 F* E5 x% y7 @3 `
; `: l+ }7 W3 s. P# O( S+ ~* g IRIN=1;$ H" w# ?$ q" J' l3 o: ?. [
//BEEP=1;* p$ v0 k& K4 w, c, A1 b
//RELAY=1;1 ]4 g) K" s& ]- e. _3 \; ?; h% ~
for(;;)
6 y: U5 Y; D0 c d {
+ t9 h+ X' ^/ }2 _1 I9 ~ uart_init();
8 O: F p: b& A( t : ?* o4 v+ R* A. d3 L6 ~' P6 V
}
/ ]9 E7 [: s, y 0 l7 y$ g, ?% O' b
} //end main
# B, G& b; g. b4 A; W//以下是中断服务程序+ ^1 T$ f! [0 m* ~( S8 T6 [7 @+ q
void IR_IN() interrupt 0 using 00 R' L3 e* G; D$ |/ L9 I e0 D
{, ?4 h! j, F+ ~# \
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
" ^% a K% G g+ K EA = 0;//禁止总中断, ^! l4 X' _4 Y
I1://标号 [. @5 g: r8 q- \) F6 Y
for (i=0;i<4;i++)3 E+ a7 T+ p/ O! @1 M8 ^4 t
{
7 w) M$ P/ y$ c4 i6 E* {* n% O if (IRIN==0) break;
/ W; K- n! T, D3 P! n( ^8 N if (i==3)5 [7 M. V+ t# _. g; G& D
{EA =1;return;}//如果i等于3就打开放中断8 ~ J. @3 ?# C$ K
}9 t7 A U2 k% H$ ?9 `& x; s1 c+ q
delay(20);7 o6 `8 X. {: F
if (IRIN==1) goto I1; //确认IR信号出现. T+ A2 `$ y8 z8 o
while (!IRIN) //等 IR 变为高电平* A _2 ^5 @7 C& q2 b0 H9 a
{delay(1);}* [( H) u( @. ]
& x# i0 L+ ], F0 `: \6 m for (j=0;j<4;j++)# F: [6 W$ |4 O& L8 z. o2 N, G1 g S
{ / u* z5 Q/ s- | d8 s4 l" r2 Q
for (k=0;k<8;k++)
7 U- z' l! G5 f4 I8 q8 D {
% b) p v4 s/ o# V: D while (IRIN) //等 IR 变为低电平) A* O, M8 ^5 n6 c& O; @! O2 `$ X% R7 B
{delay(1);}
9 i0 ~0 R8 r/ s while (!IRIN) //等 IR 变为高电平
/ y# i- r7 ~ v+ W/ n' F7 j q {delay(1);}) J& L: D8 R! D. d! h
while (IRIN) //计算IR高电平时长# i6 s& r% E& P d! D2 t6 l
{ //如果IRIN等于1的时候就计算delay的个数
, e8 m5 Q8 y0 w+ `# s, b/ s- T4 O/ V+ t delay(1);* D7 m" b: U6 n
N++; 0 l- D8 D, W6 x5 X) s" }
if (N>=30) {EA=1;return;}
2 B# p; O& t) Z; w1 L }
- ]7 P1 j- G( I: |4 [6 c% v IRCOM[j]=IRCOM[j] >> 1;
; F0 ]& I, j% u" i& w. n* ?% U" r# | if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}# V' P. K7 p0 {3 q [
N=0;+ f( l( k# ~6 |4 {
}//end for k
1 V/ Y. z5 T5 Q: e }//end for j* H& G' |/ g* X. K3 y
( I! \' C( [% z) P: r5 ?) V1 B4 t
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
3 D0 U- U3 X& ]2 f& S5 s IRCOM[5]=IRCOM[2] & 0x0F;
% ]$ F9 ]6 @( V& U IRCOM[6]=IRCOM[2] & 0xF0;
, R0 g2 u7 @3 g3 b IRCOM[6]=IRCOM[6] >> 4;
* X7 U/ M9 ?0 O8 e // beep();0 z1 j. y( d8 u) m; E
EA = 1;+ w& G/ k: r' q) N& M% X
8 d2 y/ m; F" ^5 q# W send_char(IRCOM[2]);
9 U$ N; n1 `$ }% A4 x
5 h! f7 d8 P/ a}//end interrupt+ ]( {; Y) ]% f$ g: P7 p! R
' ~7 Z1 N+ w: y9 e# h. s//下面是延时程序) V5 s+ c1 Y# f) i9 [8 I1 Z
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量 ~& x7 ]6 j. p' H, A3 a
{
3 `" ?/ c4 ] n* `5 I unsigned char i;3 ^: W# R6 i5 [! x7 g) `" f L1 t' M
while(x--)
, f8 ?+ F$ H+ _ {
; }7 }0 \' e, u$ L. { for (i = 0; i<13; i++) {}+ l4 e6 h1 f7 g
}: l- {$ L/ G. K9 g! e5 t u8 N% c6 }
}
' X3 C* h, u2 |4 }% ~+ J% Z `& M' H6 y( e- E9 }$ c
//下面是延时程序
$ j/ X+ S7 ~ u0 {void delay1(unsigned char ms)//unsigned char ms是参量
' M8 f3 e# z- C7 A( Z* Z9 x5 q5 g{' K- U$ V2 N; m6 K1 T
unsigned char i;
" H* o) q- B1 w1 p while(ms--)0 {0 Z: X# t# |+ M1 [2 b
{3 ~9 j1 z( q7 i/ y" {# h$ y; B) d
for(i = 0; i<120; i++)
; C0 O) {2 H6 X4 n- } {- Q& H) s) C) c$ U5 y! z) c7 H
_nop_();
; x; _/ X8 K+ B- B, n g* v0 e _nop_();( b! _' L6 f+ g& d* u1 y
_nop_();1 T- x9 v; e) H, m2 p
_nop_();# t1 U9 m" ^9 v$ R% P
}
) M; S2 w0 L$ G" s" X# g. N6 s }& T2 _( i( k6 X/ p# t. X
} |
|