|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>+ |0 G" w0 m3 |
#include <intrins.h>; W, r# C3 K. H) p
void delay(unsigned char x);//x*0.14MS
6 S7 d( V: W5 Dvoid delay1(unsigned char ms);
4 K3 u2 _# D: o+ T# w7 T6 {, Ovoid send_char( char txd);/ f' T: ^' M+ x4 x- @
sbit IRIN = P3^2;//INT0(外部中断0输入口)
3 w4 w9 Y4 }4 v- \$ d) ~7 W5 {typedef unsigned char uint8;( ?$ f" @, I2 o5 d- @9 R
unsigned char IRCOM[8];: X/ ?- L. A2 V* P) ~
unsigned char code table[16] = # T! O( D5 D) _1 D( X9 [
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,+ Y7 [" p: _5 G
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F$ m6 \4 S6 s4 {# H4 }* N) Q
/*波特率:9600*/
6 I4 U' X2 Z, E% Mvoid uart_init()
- ^9 N% x( \1 c# W) V- ~' i6 `5 u{
- B1 A. n5 x5 O5 i$ t; j, H TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
5 S7 ~$ g( Q; o" V9 M0 Q; J1 r TH1 = 0xFD; // 波特率9600
8 q0 Y: Y$ T) ]6 d. d" X/ H- d5 z TL1 = 0xFD;4 g: T1 A; f* D* W$ B
) I5 {. C: o3 s3 \% `; S7 k C
SCON = 0x50; // 设定串行口工作方式" V+ k0 V7 v$ S/ @) u9 e# }% g
PCON &= 0xef; // 波特率不倍增0 }6 |( s! i: i, N5 g
0 B2 d1 E* F3 R
TR1 = 1; // 启动定时器15 a! M& i) g9 e" f. k" ^' G4 n4 Q
1 s, W- Y" `5 I3 l' I) m; l9 y
}
# M, c9 v) z6 T6 E/*UART发送一字节*/
% o. c, \) b- }6 Z) R3 J3 T
& s% P8 E$ P" M% U# B T P, i& nvoid send_char(unsigned char txd)
" v/ T( S4 ]7 T. L// 传送一个字符. `: ]& v7 Q; Y$ l% K
{
" { ^9 V7 u) c F; a, { ! A+ I/ {* Q' M, c* p! @9 B
SBUF = txd;, V; e1 ^2 v+ i$ M5 w
while(!TI); // 等特数据传送2 C4 u& h5 U, B3 n/ t( A. `2 P
TI = 0; / G4 x# F2 s& \, s
// 清除数据传送标志
0 `( i( d l" d% W9 a) ?' H! W4 O}* `7 d$ ^4 ~9 ^3 n6 I. W
main()
B0 T4 d0 e9 T4 v4 b{+ Y4 C% j [7 m: ~) h$ K
6 Z8 J M6 ^3 i- s1 V( I
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
! T$ c4 W. x5 p/ J* m# ~ TCON = 0x1; //触发方式为脉冲负边沿触发6 v$ d1 r- l" N. h; L4 n8 L4 n& d
delay(1);
3 u9 u4 X( E) T9 {2 C2 v/ X
7 b6 i6 I0 h0 I: v" R- S IRIN=1;" H4 P3 m. W9 u/ y# s9 j0 g7 U0 ]
//BEEP=1;
6 M& _9 v/ h7 w; n0 {; ?! a: B //RELAY=1;
! {$ c* P$ S9 @( ?2 I+ v) S for(;;), Z& D& ^6 O; R$ W" M- n
{4 }9 b. b7 M% ?# e
uart_init();
6 x. }. T$ |+ A3 L6 p
# ^" C5 O# C( L! |) K8 C3 m }7 z1 c! f9 w% J4 q0 g; W7 R
3 S8 D3 L4 E! f9 s8 L9 i8 o
} //end main
* `0 l0 E p5 _: F7 W( j' c5 J! @//以下是中断服务程序) Q8 r8 @% _8 ~4 s6 i
void IR_IN() interrupt 0 using 0( h6 O- A1 b# q5 ?8 A
{
1 c. e9 l: g! Q unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据8 u9 ^5 q8 D8 `4 d0 O, H
EA = 0;//禁止总中断
' c* T& f' e! sI1://标号
. j2 e" @/ z/ q- ~. k: M for (i=0;i<4;i++): S' I6 `( [5 l) s; [; ]
{
* p, o. D. t, k- P5 u* _* S# U0 R! [ if (IRIN==0) break;1 b! t& w0 V5 M B
if (i==3)
) b! u- r* L* p3 C% e {EA =1;return;}//如果i等于3就打开放中断
+ v8 f( ?3 I& L }
" s( @, ]1 R, f! d) a2 Q delay(20);+ y \) N' J) x' d% {
if (IRIN==1) goto I1; //确认IR信号出现/ L4 u9 W+ A+ {3 C( [
while (!IRIN) //等 IR 变为高电平. a) x; u* i: R5 k2 U7 \
{delay(1);}& i" D4 k/ J2 |) `0 b; n2 U; ]
' q) L9 [: s+ _8 K" ^& g8 O! E for (j=0;j<4;j++)/ |3 E F4 f; H; s/ G
{ 4 e* @% l/ L1 l# p* P- r$ g+ Y9 z/ L8 ~! I
for (k=0;k<8;k++)
/ @. g' s8 c0 y( U2 W3 v {
: K3 Z- I: e" R; e$ A while (IRIN) //等 IR 变为低电平) b4 ?7 x2 n0 ~* r) H
{delay(1);}( t: x" G0 ?' L8 r, H. |% U
while (!IRIN) //等 IR 变为高电平
8 Q' z0 i$ O4 w) f/ \* K! R {delay(1);}
* ^5 a- @% a% d" B while (IRIN) //计算IR高电平时长
. T9 }( ?2 W3 o, w* \! X. J { //如果IRIN等于1的时候就计算delay的个数
9 ~7 i3 n4 s9 i3 n+ g delay(1);
2 ]) E' s- h( N- E3 l N++; , N( {$ ?* ~$ K% K& F- M2 m
if (N>=30) {EA=1;return;}
" f2 N+ ~5 Z3 W0 V3 d/ ]/ Y% j }; l( ]* F5 ~8 f3 V, J
IRCOM[j]=IRCOM[j] >> 1;
& N4 L3 x1 U4 V3 j2 W1 { if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}5 ]- j4 Q% J; v5 l# Q" A. i
N=0;' G( Y. i6 V5 w' G- R
}//end for k9 q' |, @- U3 X1 Q, [
}//end for j
3 }5 C/ L/ q Z+ v P; P8 l' O P' h ' p' B( \9 i8 c+ `( U
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
$ V+ i0 P- d1 F IRCOM[5]=IRCOM[2] & 0x0F;
/ r/ y& A& M+ M8 @! d/ l IRCOM[6]=IRCOM[2] & 0xF0;
- i3 q) O3 w! b3 }- x- Q2 U IRCOM[6]=IRCOM[6] >> 4;
' X" S( q5 J) t+ k0 P) k // beep();1 z! b) I; F0 [! A/ N) j4 l
EA = 1;
5 S6 C5 j& q, Y8 Y! G4 Q6 ^3 M. J5 z y# x
send_char(IRCOM[2]);! R" N' [4 f2 Q! V8 p
9 T' @3 C0 N' ~0 y- i' B5 ?}//end interrupt4 i5 Y+ P7 b" S; U7 `
9 R! L7 p2 H0 v1 C0 d$ o C: H
//下面是延时程序
" B- d7 U! W) ]$ q( B) s$ B( w5 pvoid delay(unsigned char x)//x*0.14MS,unsigned char x是参量
$ c- Z6 e, c$ y+ l( E{+ }4 T( K5 n% J$ i' U7 p- A
unsigned char i;
2 |; X# K- C {& t+ P; `/ v while(x--)
0 c8 A3 ?7 R5 [2 z! u3 w5 l* r8 O {
" M% Y9 z7 v2 n2 x s' o for (i = 0; i<13; i++) {}
a2 b# i( \; G: `/ \9 q }
, v) }# Z2 D, @* M" K}
6 t/ }# y* X9 \% |, `" f2 Z! k, E5 e" ?( B# Q! ]7 ~
//下面是延时程序
6 Y: S& b) k5 i: u3 Z6 M( T# ?7 Vvoid delay1(unsigned char ms)//unsigned char ms是参量
5 `9 f9 p& n( C9 K) J- d{5 _! \0 E# p5 P( o% Q
unsigned char i;4 F# U6 T/ e1 {2 `
while(ms--)
) t( R6 K0 d3 W3 _" C, I# b {
# [8 N2 \8 f% R for(i = 0; i<120; i++). S( m9 \& l" k4 J
{3 a }" }- l8 `& i/ F; F N
_nop_(); r2 v3 K$ Y% M2 d; q/ a
_nop_();
' z: X) W. i9 [ _nop_();
/ L- w- u5 d- o+ ] _nop_();
$ W4 c" J8 g4 H8 x# p$ [+ p: m }# ~% E+ E, ~+ p2 H
}) l& j8 W9 Z& k: }4 v
} |
|