|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>( z0 Q0 \8 y1 w Y& c8 W$ Q
#include <intrins.h>3 F2 G6 Y- U/ c$ {6 M2 |8 i5 e
void delay(unsigned char x);//x*0.14MS
# S: K' l+ M2 L( h3 ]void delay1(unsigned char ms);# c0 e# t. T3 q2 V! b9 L
void send_char( char txd);$ U5 \* z! y4 r+ M( j8 }2 ~
sbit IRIN = P3^2;//INT0(外部中断0输入口)
3 M+ T: F0 ~4 D4 vtypedef unsigned char uint8;
1 s; M) v2 N3 L# |1 i0 F* tunsigned char IRCOM[8];
1 g. U9 J* L4 G* V9 w- @) Junsigned char code table[16] =
9 y* B8 _- t& |/ B. b {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0 L7 M7 l/ _+ j% h$ W, k8 l4 r- i# m 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
3 ]+ f1 f1 ~( l0 B" B9 W/*波特率:9600*/9 K, F/ I- p) o
void uart_init()
, ~) |9 m- `* o; A3 s$ q/ |7 ]{0 F* k3 o' p# e* H, s, |
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率+ ]5 l+ A* Q; C* Q E. N9 K# P, J
TH1 = 0xFD; // 波特率9600
$ h6 H) Q# h& \( ~8 O* r' u, T/ k TL1 = 0xFD;
8 }' e: `) y& p # I7 N: Z) v! T' ]1 `. s( m
SCON = 0x50; // 设定串行口工作方式4 P( |$ c% O3 K$ P8 Z
PCON &= 0xef; // 波特率不倍增# b5 D4 r$ Z' h @# `' t
9 s# ]8 t0 A: y( c- U4 K& I
TR1 = 1; // 启动定时器1
! H( {; \3 N- D- h $ ~4 G, N# B& F
}% ?: b8 r4 N) D$ {- ^5 M
/*UART发送一字节*/# J; ^6 D* k3 d+ q- @5 Z
! c. s9 W' Y# T/ T- l$ j4 t& X, Q
void send_char(unsigned char txd)
1 x* Z9 T7 m9 [. s0 H// 传送一个字符2 \; I; U; o2 Z
{! h" a6 z# b+ x4 w5 U7 J5 l
. s7 J q4 V" g& Y' o4 g4 D SBUF = txd;
9 O+ `& Z% N; j1 w- H. U2 A while(!TI); // 等特数据传送
8 C- U8 _, K2 I# a TI = 0; * {) v. C' ~# E, [9 k
// 清除数据传送标志
/ r4 c+ r9 @. U5 X. C5 ]( C6 s}) i6 B0 I1 ^8 \2 {" r7 W( [+ _
main()' Y. s0 ~0 j8 m; \, c. e
{1 e, x, Z* c* z3 G
2 p2 X% o; C& c1 z
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
. h: b _0 O) J$ W TCON = 0x1; //触发方式为脉冲负边沿触发1 S! J2 k' e+ S" B# Y% K
delay(1);
# o+ e: p1 i4 t y : v/ F* [' M* n+ W' L: A! Z4 j1 p
IRIN=1;6 |$ o" l9 G2 F7 s1 F; j& u4 @/ g
//BEEP=1;
! g5 ~& c/ _' u8 x) b! e. u8 t //RELAY=1;
4 R ]) Q- _2 p8 c for(;;)
& z4 ]( o4 f+ b2 D4 z {
( s% I- j( G& @+ t8 h uart_init();& B( N a$ i; v* {6 Z7 I+ f+ W, h
( b+ j2 D4 Z3 ?
}- {0 i8 I$ O5 F" i/ u' R1 t* p4 L. T
* t! g2 V% j1 I P9 W* g: v) O9 ^} //end main
8 q" c: Y& ~ J//以下是中断服务程序8 E6 W3 J9 y4 a4 g1 b& n5 n) q
void IR_IN() interrupt 0 using 03 A) t/ a- L8 W& x; d8 c" u. n
{+ ]! h8 Q w; E8 L* d- V
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
3 E+ @. m7 z! F0 Z EA = 0;//禁止总中断8 u% k& @! v: l, H( h
I1://标号/ q" n1 `5 P$ C- g, R7 y& }/ m
for (i=0;i<4;i++)* i& T3 K4 J! V, K4 a
{
' Z( D% y9 m) p0 G9 G7 s if (IRIN==0) break;
& G6 E' F( \7 }( V% e# C# l if (i==3)
( \. R* t# v8 j2 u {EA =1;return;}//如果i等于3就打开放中断
9 `: N2 m2 W9 W }
- N, u2 f' z' w' s delay(20);! Z" ] O" q! i' @
if (IRIN==1) goto I1; //确认IR信号出现
4 W/ Y# t& f6 Q% F) i# Q* o while (!IRIN) //等 IR 变为高电平6 I F0 j7 B8 m8 K/ p
{delay(1);}+ Z$ r/ I8 `& C$ V
) q8 X+ R; w" n6 V$ c; n
for (j=0;j<4;j++)
, [, ]$ z5 _- p1 \7 \ { 6 M, n$ M" Z# _, W
for (k=0;k<8;k++)
# g+ i" K8 N: l/ F* B* `4 i {6 m y, k3 s) E* s. H- w5 \# F0 ^
while (IRIN) //等 IR 变为低电平% n: Z; L0 o: g: X
{delay(1);}
* U& w, r& M$ P2 c% y$ b# |* t while (!IRIN) //等 IR 变为高电平
9 ]; p+ O+ w5 @ {delay(1);}/ l8 o' k# x. l5 s8 r
while (IRIN) //计算IR高电平时长& d. _4 K* L/ j, b+ D( X. a1 C
{ //如果IRIN等于1的时候就计算delay的个数2 z4 Z8 W& U3 Y; n
delay(1);0 e' v8 A( a1 r7 |8 t
N++;
0 f8 `% H0 R5 E* \3 g. t% _5 W$ { if (N>=30) {EA=1;return;}. H/ i: ?* _5 i2 o. j! r
}- C$ S C5 q0 a6 t
IRCOM[j]=IRCOM[j] >> 1;
/ V/ i. V9 `# D2 T5 R/ a if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}% _4 n& M4 I, \$ \
N=0;
8 i+ i$ k4 J0 f4 I }//end for k
; ]% B b: z8 c/ F }//end for j, t, _8 K7 F J- h7 q$ m0 S! Q
$ B+ B1 `& T& t) w# C( w$ d if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}! k8 e5 F' {8 M/ P% t* F( M
IRCOM[5]=IRCOM[2] & 0x0F;
, i1 p9 S* Q$ V( d6 A IRCOM[6]=IRCOM[2] & 0xF0;
' v: \& _7 K$ S3 O( X4 G, r IRCOM[6]=IRCOM[6] >> 4;
7 d0 u5 s0 y- k3 L8 ~( O( ^% z // beep(); N" ^( d9 z3 C2 k
EA = 1;
% K' A5 D& p- ~0 }% v$ _8 i( @) z
$ b4 t* R K! h4 i! | send_char(IRCOM[2]);
* `$ I. g3 V+ t4 |1 U$ ?7 p3 f% Q
) |1 p! w2 y Y3 } Z) }; K; B}//end interrupt
0 t5 Q( T9 d$ j+ ^5 f4 b3 p5 C; h0 b' } `
//下面是延时程序7 r; i- s$ n" n. B
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量4 N9 e: B- `3 c8 A
{
5 _' T: X5 ^9 @2 L1 `4 J$ p unsigned char i;9 e' d/ @. B1 l* z. i
while(x--)
! c R( I1 g; z( p$ U: N4 w {: r$ d+ E* K# \6 z0 w( S- {
for (i = 0; i<13; i++) {}( s0 }; z3 N5 I y
}
6 b1 ?$ {2 w4 B) F% S; A}/ c g' O! J2 R6 G: T3 g
. y- D/ c* ]: ]5 p- j
//下面是延时程序
9 k" E5 I* f0 E* `2 D; q: |void delay1(unsigned char ms)//unsigned char ms是参量9 q4 I# Z. C7 i+ M
{
]7 ~6 t# @/ _8 N. m unsigned char i;: `, r! [9 q/ p v$ C. f$ ]
while(ms--), B5 x* y1 d" d4 L, J
{
0 b' m3 I2 l' i) X% E for(i = 0; i<120; i++)
5 |9 A" p5 G& K! J9 N {
}& P8 u" |4 I' G, n' j _nop_();, y5 ^! B& q2 f
_nop_();
+ h/ C0 e, B; e+ [& O% i _nop_();1 W; Y( I( _: d6 X8 V! t: f
_nop_();; i2 M+ T- E9 n& L C$ Q8 a- F1 I
}, u) f* W1 h+ m* `
}' ~' [5 ~. P! ?( k7 a0 J# y, I
} |
|