|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>
# i2 x6 q$ y$ A9 W#include <intrins.h>; C( D; d9 U7 j0 z& g$ P: k$ H
void delay(unsigned char x);//x*0.14MS
3 T" ^& j; X/ b, uvoid delay1(unsigned char ms);
. K. E3 H8 p% x! P6 y- wvoid send_char( char txd);
* U3 J% x* _- _sbit IRIN = P3^2;//INT0(外部中断0输入口)
0 B+ o$ c- e' J# z1 W" {- h4 w: rtypedef unsigned char uint8;
3 H3 a" q+ b( t3 C/ J W+ wunsigned char IRCOM[8];& \& x+ R; Q. E6 M
unsigned char code table[16] =
( |5 H$ Y+ R+ O" O$ H5 T {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
! x; C% r$ F! R. v, i( H( W) ~ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
1 f6 S$ t/ }6 t' j {2 _3 q" n r/*波特率:9600*/
* m& F" A# P) M- cvoid uart_init()3 l! [: s- g( G( g
{
" ~" y9 T% r4 f1 S+ l' T TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
J \. v1 j* Y4 A: T0 U" D8 a TH1 = 0xFD; // 波特率9600$ x4 ?5 V* j8 h0 @% v" y
TL1 = 0xFD;
; G+ O- F5 d) I5 v+ Z
" i8 ~# q U. v$ s! Z: ^# | SCON = 0x50; // 设定串行口工作方式" L# {6 N3 L- T4 l& t; f
PCON &= 0xef; // 波特率不倍增- B- x6 w% y% ?3 A" I+ y
" J4 g# x5 t1 T2 {+ E0 x9 O TR1 = 1; // 启动定时器1
! ?1 k1 H- z( Y' V8 A9 U3 O
( h, k) ?+ l" I4 A} J. s( W0 [. C* p# @$ f1 i
/*UART发送一字节*/
( E- x* N; l, i: u
+ L9 l2 P# D& s+ {( |void send_char(unsigned char txd)
) N$ K( Y) v7 _// 传送一个字符
! V; V& n2 _/ |5 S a1 V q+ i{
$ G; P9 @0 ?7 K/ z: l4 _
' `5 V! r0 i: L' p" w SBUF = txd;
4 Q) i7 e# N* ? while(!TI); // 等特数据传送
z, I" }1 M$ C+ ? TI = 0;
0 n5 @6 m- A0 n# v/ w // 清除数据传送标志. i1 A+ P* H$ C( }: F7 F* ?9 t
}: C8 G1 j% W* X4 g" P" ^7 U N
main()
4 P4 c' l1 v& l6 v{
3 B8 A) a; Z, i7 `6 L n+ _1 ]% s! c. ~
7 P" r: I* ]+ c0 q/ {& Y& h" `) L1 @ IE = 0x81; //允许总中断中断,使能 INT0 外部中断
0 e* Q% _4 [ i4 v% C. \ TCON = 0x1; //触发方式为脉冲负边沿触发
1 M; P. _+ B+ O0 B delay(1);+ n0 g- Z0 u3 z6 g( B6 X
) A/ `5 G7 m3 R' G1 d% C
IRIN=1;
# t" I' }( o/ c% h2 z6 ~- N //BEEP=1;0 o' V; ~% M1 i- p
//RELAY=1;
1 s7 Z; }( Z6 p for(;;)
% r+ ^, d" y+ f4 k* i {7 l4 s* z9 @( \8 H1 `8 X% z
uart_init();
2 G; _& F6 H; ?6 K: A! c% ~ 9 f W( U3 B. [) M8 l0 ]* ]8 R4 g
}
2 {6 Q( {4 S. i# q+ i
3 [) o# ^+ W2 r' V) o/ b- D} //end main
7 G% z2 G& F; X, x//以下是中断服务程序1 g( ?4 Q6 C5 |7 C( f5 G/ w! R
void IR_IN() interrupt 0 using 0
1 o1 o z: P" O) u) X{
0 _! L2 q% ~7 j' ~: ` unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
' o& K9 w& u q2 A% o EA = 0;//禁止总中断
. p* W1 e% U1 L& T8 k4 L7 r9 S P+ wI1://标号5 z: d/ M+ q( I
for (i=0;i<4;i++)
' f% ]6 k9 P( H1 [+ c3 \$ N7 }2 A& V {3 v2 g8 ~6 t' P2 o0 T
if (IRIN==0) break;
3 B2 V" J6 E' _* J if (i==3)
5 ~5 S7 V# U9 L3 g; q# u( i {EA =1;return;}//如果i等于3就打开放中断
0 G9 ~. C2 B4 X }
m8 Z4 p0 I) k! e* H& V delay(20);
. F; |3 C6 n2 R' W# G if (IRIN==1) goto I1; //确认IR信号出现' b. T4 G) v+ j L- C7 C
while (!IRIN) //等 IR 变为高电平
4 a2 A$ V" F" O' C' h$ k {delay(1);}, v7 l2 n; ]4 S9 G' Y5 `" c; i# [
) C8 d. t; ]3 c$ {. _; d {
for (j=0;j<4;j++)
+ l. d. r# l M; F( |6 O% t { 4 R" [1 C+ A! r7 C, j: [. C
for (k=0;k<8;k++)9 Y S4 z3 x1 X/ A
{
: V: m$ s& G& Y1 |9 Q( h$ q# }! w while (IRIN) //等 IR 变为低电平) m7 L; J# H) |# _; N! g
{delay(1);}- Q4 e8 I# Z' Z5 s+ U
while (!IRIN) //等 IR 变为高电平
% r2 J1 t/ m$ B K {delay(1);}8 \0 o m" ]7 s# ?- K1 F5 T
while (IRIN) //计算IR高电平时长
_, X* ^; F4 R7 [* K, R0 ` { //如果IRIN等于1的时候就计算delay的个数' k# N3 z# `8 C
delay(1);
/ w$ d: V2 a. ^9 M/ o' v N++;
5 I t6 K7 g: ]" ?2 ?. r# o if (N>=30) {EA=1;return;}
* d; ?8 j- e" F; \5 Q; M8 } }2 K& ` e q O) x: Y3 i& V. y
IRCOM[j]=IRCOM[j] >> 1;% E# v1 {: d7 ^9 q( N7 ]( I5 q
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
2 C: u) Y% P0 Q/ e& s3 d6 Y* I N=0;' g; }! Z0 r9 C
}//end for k
k$ a* _3 ?* C9 ^' q }//end for j
1 T9 Y/ f1 K1 K$ D- m
0 {5 Y) X O" z, E" [. F7 k if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}' M+ ^9 ^ B7 T B
IRCOM[5]=IRCOM[2] & 0x0F;
' G) ?9 W2 _' d% I- } IRCOM[6]=IRCOM[2] & 0xF0;: X6 j$ x' s s# |" n3 e4 a& \
IRCOM[6]=IRCOM[6] >> 4;
* r: {! o9 Q3 K V6 ? // beep();2 f' f" m/ t+ U) T
EA = 1;
" f- _, f5 J( x$ S4 j0 G4 h
' m4 a R7 ~- o8 L- b q send_char(IRCOM[2]);( S8 G: y% n, K$ l( p- J/ F
3 v+ ]$ b' b6 \/ ~' _
}//end interrupt
* H1 |( j* {# G; f" u! _: z* A, n+ q' l7 Q+ z
//下面是延时程序
# s. T0 p: V/ m3 o7 G: @3 v2 }void delay(unsigned char x)//x*0.14MS,unsigned char x是参量
+ Y- G; a* Q" Y{9 Q/ i; N( W5 p# D
unsigned char i; A4 ^( [" O/ H _
while(x--)
4 W) l: |; a0 D6 C7 r! l {3 q, {- o9 R+ ` k; [1 q
for (i = 0; i<13; i++) {}
* l% ` i* Z3 W Z1 T }" v( y" a$ f& \# |$ w! M, j
}! s1 K7 L5 `* G: k) P' q& R4 S D
6 z' u7 V, R7 X: w3 b
//下面是延时程序
4 h& U! K5 c& W, O- A% \5 \void delay1(unsigned char ms)//unsigned char ms是参量
9 S: F7 X0 g1 f ]/ Q{% {5 {6 M: R0 a) W
unsigned char i;$ w7 |" `- {$ D" U
while(ms--)
7 w& V5 L9 u2 K4 w6 U {% J' [+ Q( E" o, i
for(i = 0; i<120; i++)9 c1 U# ]: C p
{! d1 Z v+ X& L# s- D7 o
_nop_();. ?, i0 s( m1 F& [8 ~
_nop_();
( R) l* ^* p4 t/ h$ _8 P# r+ i' s0 v _nop_();! l; B( d- h; Y, D4 s B
_nop_();( K$ j7 I! g1 f' a* M2 a) z$ j
}
0 C5 ]$ h# V' X }+ R1 c @8 }9 H. x
} |
|