|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
- `% U, ^- P; t#include <intrins.h>
7 D4 i( L9 M! U2 nvoid delay(unsigned char x);//x*0.14MS4 {! k) w9 I" O: @- t% U. |
void delay1(unsigned char ms);- v/ a( f, Q7 t9 n. h+ q7 m
void send_char( char txd);/ U% Z& {0 ~# b+ f: q) z4 F) ^
sbit IRIN = P3^2;//INT0(外部中断0输入口)# K! i0 D- q/ N% I0 E, X
typedef unsigned char uint8;" I' ?6 o6 \+ i
unsigned char IRCOM[8];. N( N ~7 I& w' G2 B3 T
unsigned char code table[16] =
0 l& s+ H5 A* ~) b) r; s" W {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
5 K8 E6 ?* K& N' x- S" v2 s3 o 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F4 H+ _, ?3 x, B# \+ }' |
/*波特率:9600*/
3 e3 o; r- B ~% I& n! P) B" ^; b: Xvoid uart_init()6 _9 [# f8 G3 Z3 p# k) ]
{
6 P( n. n& n7 I2 z! ?7 i4 d& k TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率5 T6 ?. r5 D( B; h& E
TH1 = 0xFD; // 波特率9600, q; n: }7 R9 p7 r
TL1 = 0xFD;& }- u# z1 d5 [ P
% C6 A& i$ Q8 l8 r z i0 ~ SCON = 0x50; // 设定串行口工作方式6 C" A2 u8 m6 ~& x* P
PCON &= 0xef; // 波特率不倍增
0 \) W1 q8 Q# E( P
9 b( g! P% T. I1 \* n$ E TR1 = 1; // 启动定时器1
: S* C% Y8 ^- |1 T8 s # E {/ [' Y' U! Z
}
3 m( _8 l# ]- ?/*UART发送一字节*/1 k4 d1 N2 `; K
+ x# y; }5 {9 i! a# W
void send_char(unsigned char txd)
. N! A7 ]6 y. ^5 D/ C// 传送一个字符
1 l6 h2 M! E+ \3 P# E! f+ G{
: Y w- ^1 H- Y9 L- Q1 Q $ q0 v6 @( z- Z8 N
SBUF = txd;7 T/ U( \% m) |- j
while(!TI); // 等特数据传送
2 |9 e* b7 P& [2 `8 a D TI = 0; / w: X4 M0 r6 T2 P
// 清除数据传送标志1 U# H9 a; d% a. ^
}
* B. r2 w- Y) ~) Bmain(): g7 f5 `) T' M6 c1 `% T) e, W
{
N' K* d) t' k1 b; w* S, u , q2 N0 W" x: N, S7 L
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
+ S$ e; }- p* M; P5 \" J- {; @! k TCON = 0x1; //触发方式为脉冲负边沿触发
) Y, m1 `/ o8 G" l v, j3 O delay(1);4 w, J6 K: g J9 B" [& |
/ E4 E7 _! @: |6 l% j
IRIN=1;
/ |5 C5 }9 {1 ]' q) k& K //BEEP=1;- b- h; [! a2 A" w/ U
//RELAY=1;! E* L3 C, V& [
for(;;)
: [7 }' I, n) c$ ] {
' z4 k! L! D3 R8 }% b2 n' C uart_init();
. y4 r2 G- o9 r6 F * P& i6 J# j7 z! m! l
}9 s- r* y+ E/ C; }1 y
) X7 Y- g4 ] F' u
} //end main* ^" c6 r5 E+ h4 u5 J+ D6 d
//以下是中断服务程序+ ]# R3 R# Z4 U; a S+ Q
void IR_IN() interrupt 0 using 0
. }' Q$ B6 F( D" {& L{/ y) v O/ T3 U2 t+ h$ f' D& U
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据: i+ E+ z5 S4 N( o2 |( f
EA = 0;//禁止总中断
: D! y; q. N. H5 L& J% y9 c0 ^6 S+ MI1://标号/ s* J2 c- T* R# B9 ]
for (i=0;i<4;i++)! I/ v, o+ L$ T- x: |/ s: z$ f7 g7 k7 A
{* \; z, { n6 N- ]) ^
if (IRIN==0) break;' ?+ W& v2 Q: R* E3 G; G
if (i==3)" J# O! C4 P' s
{EA =1;return;}//如果i等于3就打开放中断
! O. i( Z3 D* h/ S }
! H8 {8 R1 @% u4 E; [' c; D& | delay(20);7 C; d4 h4 A- I) c
if (IRIN==1) goto I1; //确认IR信号出现
8 P4 B; Z5 T; H. | while (!IRIN) //等 IR 变为高电平
- z, D1 U. Y- Z- R( ], p ` {delay(1);}# E3 D9 k; t# V6 H
3 B4 L# l9 @, A+ j* x* a8 W
for (j=0;j<4;j++)
( z( \5 d' P/ F. F. m1 Z { . x( n) S3 x( }* e# M' o4 \: C5 |
for (k=0;k<8;k++)! y* Z1 \) V) h9 s7 y5 y. S
{5 C2 h# i! W- P2 K
while (IRIN) //等 IR 变为低电平' q+ Y$ T3 N' M2 z- ^+ [
{delay(1);}& x( \6 e4 X2 G" A7 z/ ~
while (!IRIN) //等 IR 变为高电平
1 R; ?" p7 _* d( [. Q {delay(1);}
j# z5 I H- P4 a; _ while (IRIN) //计算IR高电平时长
9 F- @& x9 H2 s# w8 j { //如果IRIN等于1的时候就计算delay的个数% `+ p0 |3 I" O8 g5 \# r9 u
delay(1);9 ?* r9 b) z1 r3 d
N++;
& C: a. x# M* j( q/ F. \ if (N>=30) {EA=1;return;}
" x' M0 k: x" T8 W4 S7 n+ J5 Y }
: f: R5 [+ b7 d( f IRCOM[j]=IRCOM[j] >> 1;
0 j) `( g+ G% ?( q9 a$ `, I if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
, E" @6 J$ \. g# p$ ]; n, a- m N=0;/ q* u x C% F- a# V
}//end for k) F% }2 r: J5 I: x: N1 W$ m; n
}//end for j
0 Y$ B' g) h: V: n# Z ; z5 U. i4 `8 ^7 h/ k
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
: P5 B6 G; S3 N& s! `: h4 L: L# N IRCOM[5]=IRCOM[2] & 0x0F;- H0 q- o; N9 B
IRCOM[6]=IRCOM[2] & 0xF0;* x0 G7 i6 W5 i7 L- C6 E
IRCOM[6]=IRCOM[6] >> 4;
1 A; V0 `9 [( _6 D! j9 n, O // beep();
( F6 V1 n* g1 i: Y- s EA = 1;
' g. M: g+ o) e8 G% k0 @* d' c/ O8 [" I2 E: N( t) Q3 O: r
send_char(IRCOM[2]); c3 M) ]1 a3 ]" h! d1 l% |3 B
' F4 J3 b! r! F) H% ~2 q, [3 Q}//end interrupt8 Y' c8 n+ m3 w; W- T
$ t: b# Y5 w1 Z$ `4 d' q. Y7 m//下面是延时程序
1 X: H! ]; q$ E6 j; k% b2 Vvoid delay(unsigned char x)//x*0.14MS,unsigned char x是参量
& h, R5 q2 E* R9 s8 w# g: B{
* n1 v7 |: n d8 a0 ?! ?0 ? unsigned char i;6 t( o5 j; a w( |) u, h9 Z- \
while(x--)
* {8 |5 @. j3 \( `6 l% v$ n2 Q {+ w$ p' I8 t" k2 O4 T
for (i = 0; i<13; i++) {}7 c( D* I" \4 p0 K5 b4 d5 f
}
9 z% X5 `/ p5 ]1 _}" X! ~: P7 m, o
# ~9 b- P6 n/ [- m& ]( \
//下面是延时程序( b# t- M& b/ E9 F
void delay1(unsigned char ms)//unsigned char ms是参量1 l2 g r$ Y, ?7 c7 K5 _
{0 ]+ n+ L; k% Z9 s# _8 v) G" W; I
unsigned char i;5 n- }, ?# X4 M, R- t: A/ E
while(ms--)
$ G9 r: p( o% N {
+ ~& T1 b& z5 l; R1 a9 T/ _ for(i = 0; i<120; i++)+ o7 E( r9 v& ]8 U
{6 j* R- [& v6 T R
_nop_();% [: g+ n! H5 I; H: J' f
_nop_();
+ L4 ~- E' K" K _nop_();
# b- D0 y( c$ s3 g: M _nop_();
8 `0 G7 d% b$ f5 R }
( D0 q" y% J. T( p3 [. p" I }- Y$ M! D( m9 ]- J+ t
} |
|