|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>8 m% K, e& E( U) @
#include <intrins.h>+ H Z. i& L; U: |" o# K3 \ ^4 J
void delay(unsigned char x);//x*0.14MS
/ |! \# D+ j- ?1 N3 \void delay1(unsigned char ms);
# @: I7 k0 x! R; q* v4 j& y( uvoid send_char( char txd);
+ A- w- [9 F$ T7 F" t4 Z4 U6 D5 Ysbit IRIN = P3^2;//INT0(外部中断0输入口)
) m1 s# P1 ~& ~, s0 Y! \typedef unsigned char uint8;
8 B/ T1 [% I$ e- I# b0 Wunsigned char IRCOM[8];
+ n! v7 S, H* gunsigned char code table[16] = & }0 K0 c. \( @9 k* I+ y
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
8 r/ ~: ^$ U, m5 k8 C6 I6 F* Z% V 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F/ g" x( |0 M0 f6 K. D0 d' `
/*波特率:9600*/
7 ^1 R, z8 Y2 [# N* |void uart_init()6 T5 Y _) e. R# k9 D
{
1 F6 u' D# d1 M. z0 \. Z TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
: ?6 I6 Q. k5 i6 T TH1 = 0xFD; // 波特率96002 E& B# a( o5 I! L
TL1 = 0xFD;" {! Z0 Y/ ]! C; U8 j9 ^
, k' r! Z L0 \% W9 y0 T
SCON = 0x50; // 设定串行口工作方式" m+ A# u% l. ^/ @8 h% W) h6 v
PCON &= 0xef; // 波特率不倍增
: {# f/ W' S* H$ k& I% [' t5 g I# U7 [4 Y r" a. J$ i' _
TR1 = 1; // 启动定时器1
* _# U- [6 g7 z; J n' j5 |* U8 R
, b/ B+ R) {3 U J: w3 d}
/ @! a6 |6 n/ r/*UART发送一字节*/
- |# v+ |' k" Q/ U6 ~( J l8 m2 Y0 N, e8 Y3 n$ m! n
void send_char(unsigned char txd)
# Y; f- v3 ]% L// 传送一个字符3 Z* G1 N( P1 S% G7 S
{
7 {# ~2 s# U! k$ G
% B: Q' v# X3 }$ x+ a& d SBUF = txd;8 w+ a7 l6 q/ q1 A
while(!TI); // 等特数据传送$ [" e: C! V' e5 x- {# V3 D' m
TI = 0; ! ?; s4 _8 O% F) u" V
// 清除数据传送标志, k0 s1 m Y7 H' O( L
}! s6 M# n+ q% ]. I$ Z4 Y2 X3 w
main()9 W3 f: m! `; D8 k" a& A, Q3 O4 C. d
{( O$ q( Z* d: d
* J: T, \8 K7 s* y: F: C @: L! v
IE = 0x81; //允许总中断中断,使能 INT0 外部中断9 ~7 @( d' \& ^
TCON = 0x1; //触发方式为脉冲负边沿触发
4 j: ]' l9 W* P0 j1 \2 `/ `7 ^( K# b delay(1);$ A# p% x% |3 `7 N
+ q8 N" i3 K5 W& g5 O `
IRIN=1;
8 H C+ J- M& U' t //BEEP=1;4 n2 b/ z: P5 D1 ?# Z: r! Z
//RELAY=1;" }3 S1 w9 Y+ F! b
for(;;)( E& h( Z# H4 y: Y
{; w2 Y" @8 l: |2 i* a
uart_init();
0 [7 p4 T' f" D# J$ D ; d% m6 s$ }& U( N9 z0 p' s
}& n0 j6 ^3 ^2 r. h# A
$ K1 J- w d7 k+ N) Y9 d
} //end main7 O/ h9 J+ m6 F3 B" H4 v, q
//以下是中断服务程序
+ S% Y+ \* a6 {* J& R9 Evoid IR_IN() interrupt 0 using 0
, ^; [6 s% ?' Z$ ]* o{
8 K2 N0 Q. T( i, s s% F; z unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
2 W& G. D! K: ?' j4 P$ l EA = 0;//禁止总中断: p3 N( @* a$ Z- t% R! V4 N
I1://标号6 Z$ } h+ i+ \* F$ l
for (i=0;i<4;i++)
/ C0 P+ ]4 J* a& i' } {4 x2 o0 x# D. Z( k9 P# A
if (IRIN==0) break;
- \! k7 x; Q0 j& h; x5 I4 ]8 Z* j9 |2 { if (i==3)1 k# h- S- {0 @
{EA =1;return;}//如果i等于3就打开放中断
( x% Q2 s( J# q, Q; F, P4 K' e }; L6 y( I( W4 T5 H, n" ^7 {
delay(20);' d+ h3 v- u# M& ` }7 K; f
if (IRIN==1) goto I1; //确认IR信号出现
# L1 { l- r8 U- o while (!IRIN) //等 IR 变为高电平
' a) q0 k" B) d {delay(1);}. Y3 ]* H( C! Q5 V
. j; M5 _/ v9 X/ _, c for (j=0;j<4;j++)% [1 J! F) P7 I
{ , g! s: c5 `! ~ t& _
for (k=0;k<8;k++)& ?' p) Q1 l! v& z
{
" w0 P0 L% n# S2 V while (IRIN) //等 IR 变为低电平4 R8 L1 ?9 p. P8 r. E8 {
{delay(1);}4 q! d* n ~+ P. w
while (!IRIN) //等 IR 变为高电平1 I, L2 b e/ c: e" m8 H! o* C
{delay(1);}
$ a9 T+ w7 y" c5 l5 M2 ], w( a: { while (IRIN) //计算IR高电平时长. M( h$ c, [% a) c8 d6 t
{ //如果IRIN等于1的时候就计算delay的个数/ k# g+ z9 h; P; @# J, P9 D# T
delay(1);
* ^. S$ F n, c) @ N++; * r5 f( y8 a+ f1 f0 c1 V; }! ~6 ]
if (N>=30) {EA=1;return;}! q$ D7 _* g& w9 i ?& ~9 |
}
% D% K7 M* y+ c IRCOM[j]=IRCOM[j] >> 1;$ J7 G! F! c- L/ k
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}5 H; W% z+ N, w+ R
N=0;' Z7 _8 v( d4 X$ |. A9 u2 m
}//end for k& K* G! s9 p( U* h: ~3 ~
}//end for j6 R8 H/ g/ E6 [
3 n: A- X& W8 e, L: \ if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
/ c( t' I# i' Z IRCOM[5]=IRCOM[2] & 0x0F;
; {( a5 u& P& d4 ?1 b. l9 _0 L IRCOM[6]=IRCOM[2] & 0xF0;
' [/ [( G) U k* ^, [ Y IRCOM[6]=IRCOM[6] >> 4;
6 \8 V5 Z q- z: z0 f: e // beep();$ V2 u" Q7 R+ L) D
EA = 1;5 b$ _6 `, P, J I) C
" J7 r! W+ U' c1 s* ? send_char(IRCOM[2]);
. d3 ^0 T- J) A" V' m; V% x6 a+ F! l: N8 ^
}//end interrupt9 C+ Z3 r1 m' r
9 ^* j: W. Z4 V, r$ `//下面是延时程序0 c% Z: m) a/ X, p
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量
3 R2 c+ ?3 _% \* l7 I) n{
% Q. w, L6 a. G* J5 m1 k+ F$ V unsigned char i;
5 ?% \5 \# m8 p3 d: S while(x--)
( Y7 G. g; I6 d% R$ \! E( M {
! Y7 Y' q0 b" X) c l7 E& q for (i = 0; i<13; i++) {}
7 r$ ^4 L/ ^8 H* ~; o } V9 m5 \4 g: ?& u- {; W
}/ L' o. u- c) M- ]. ^) J8 T
* ]3 [" n7 `7 V- d( y0 @
//下面是延时程序
7 @% D4 R6 h& m* Y) e: g2 M' ^void delay1(unsigned char ms)//unsigned char ms是参量
/ b4 _ x" w! `# c& Z' V{
, Y1 W- f5 E2 m6 j4 u! L unsigned char i;
, B3 q$ I1 |( @; e$ s7 [ while(ms--)
7 O) W0 b8 a+ w1 t {2 [5 q7 G, r9 g" c
for(i = 0; i<120; i++)& ?3 ]9 W3 i9 y4 D
{
" v: @0 W0 x# e: l# x _nop_();7 Z' ~& }* A3 B* o* x$ B
_nop_();
" C" |& o# \3 _- Z _nop_();
. ?2 [& Y ^& U, b! ^4 W _nop_();
" {0 c3 g$ c+ m; [; ] }
* N7 N' C& y0 G6 d5 l/ t }- a3 S2 P: _, V; h2 B
} |
|