|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <reg51.h>' U) `& @+ b0 e2 G; F5 A
#include <intrins.h>
* n; G) h, i! |1 E9 j# `# dvoid delay(unsigned char x);//x*0.14MS% ?7 i$ L# |; M Z: u* w
void delay1(unsigned char ms);$ u; Q, X! E9 }* ^0 l
void send_char( char txd);8 M0 h- E# ?' A u- b* s" P
sbit IRIN = P3^2;//INT0(外部中断0输入口)
- m5 t; e# G: Ttypedef unsigned char uint8;
6 F" M) y1 C$ \& m; C) d+ t8 d! Vunsigned char IRCOM[8];
, M+ Y% f: j5 J3 J E- s2 ounsigned char code table[16] =
. t8 W2 W9 h8 o# l {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
9 c% E) X. M- q4 F1 M7 y- C 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F2 g6 F6 p6 u- Z/ e5 K( C& U
/*波特率:9600*/% d% u6 t3 A& y. F9 M8 p8 L
void uart_init()% B2 t8 E9 H( k
{0 x4 ?4 H1 M3 \- A
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率/ F, {& c/ y& }+ P- M2 ^( q
TH1 = 0xFD; // 波特率9600
+ v) P& G- e4 l5 ^; v4 F% K TL1 = 0xFD;
1 n1 r4 Q x' J& O1 G
4 G7 H- ~2 W6 x% ~2 e0 c! L3 W SCON = 0x50; // 设定串行口工作方式0 v' T& d; O1 G
PCON &= 0xef; // 波特率不倍增& {6 d& w) X1 Y5 _, r
# _5 l7 t6 ]* ], M- ~8 s, f
TR1 = 1; // 启动定时器1
5 w o. g( |! a, v& W* H 3 A* R- B, b2 c. {! B' @
}* ?* B4 @ s3 d, y
/*UART发送一字节*/
/ N/ R# T% i" h, U! X/ P+ X, h, y2 p1 _; M! w7 H
void send_char(unsigned char txd)
9 j- x; `( H! }: e// 传送一个字符; y9 }' K9 o: {
{
4 z" W8 V. A$ ]% Z7 f( g * H& C# j$ G i+ p" q5 E
SBUF = txd;
8 I' m* S! R3 w0 t9 d while(!TI); // 等特数据传送9 y. D$ X/ }' L' ]2 t2 F9 _! ~' Z
TI = 0;
$ F! x' z+ D( ]2 Z, Q0 f# Y // 清除数据传送标志
u6 Q* S! M8 c- L2 Y7 ^}" [& l/ R" C. v/ `7 K
main()
4 c* z. J6 k# U% {{' A9 M" c. ~; ?5 g% r' ]
( k z% }+ ~0 c9 N/ X
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
0 C3 x- F; h) @3 T# w4 g7 e) ~ TCON = 0x1; //触发方式为脉冲负边沿触发
* a" ] H# M ^ delay(1);
/ S# R- p$ d% ^6 D3 l+ v+ Q ) L' |0 x. P7 V, ?9 T# t
IRIN=1;
* u; [9 C- g! i, e* ]/ K //BEEP=1;
" s+ U0 Y1 g/ `+ U# z //RELAY=1;* ^3 q) Y& B* |9 Z! u4 d
for(;;)
( I+ `6 x6 r. h8 y5 Y6 P {
P! k) i$ u- T# s uart_init();5 h- |( y' i' m0 A5 u, |& ]* m4 ?. y
2 v: s$ E' i1 [. X1 z: ]3 ` }% M4 u! h, K5 i! `% V+ P
: u( h% E3 L a, D
} //end main
% W2 Q- |* r1 b# y: ?0 u//以下是中断服务程序9 v" {) Y+ |" j1 V& H
void IR_IN() interrupt 0 using 0
6 B. d: \% e1 A8 u# h n$ `" ]{
, B' Z1 V" l. h9 i6 d5 O unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据
' H: a' }# s7 D* J& t$ X0 i4 Y EA = 0;//禁止总中断7 a: G, \& u$ q: e9 q
I1://标号8 j2 B1 L5 k) J$ j! l
for (i=0;i<4;i++)1 Q& A' Y& `& L9 D0 F0 N- q* z
{
1 G; j5 ^2 N: _5 K c3 ^0 u# [8 l# r if (IRIN==0) break;
/ W* W" H v0 p, K" O5 Z8 L: j if (i==3)7 y& b, @! ], Z- h* w" t# N
{EA =1;return;}//如果i等于3就打开放中断9 u& _# d; L" [2 e; |
}9 z( o( V' F* U% ~6 y
delay(20);
- n9 D0 ]) e6 M1 g if (IRIN==1) goto I1; //确认IR信号出现8 u, z, t+ F, o
while (!IRIN) //等 IR 变为高电平
+ ?& h0 I1 ^# m$ Q. a8 T6 \4 o {delay(1);}5 K" J& w( X% O3 O6 g% n }
: l, f& h) v# E9 G8 Q, l1 p for (j=0;j<4;j++)$ J1 L2 v; S' U( B. {
{ 4 m; c+ q9 T- ~" S( _# f1 o% _
for (k=0;k<8;k++)
/ B7 a9 F& e, C* Q' k) ?/ E# T {. `( a' {. ]0 l& N
while (IRIN) //等 IR 变为低电平
* P5 s) x6 f3 \1 w4 C2 m# m {delay(1);}
/ F- U+ L3 d' Y* o8 b while (!IRIN) //等 IR 变为高电平! F! P% j% {8 R( B5 ]
{delay(1);}0 H/ v8 v; v( t8 i" I+ }1 G
while (IRIN) //计算IR高电平时长
9 b( T1 D; a& W/ A { //如果IRIN等于1的时候就计算delay的个数' H# x" T0 k! a: q
delay(1);
) |: a3 m. j5 | N++; ! o* F8 @2 Z8 @# z* V
if (N>=30) {EA=1;return;}
- n! x) A$ ]! F( c6 M4 Y: B }
, Q0 [1 F7 f0 L3 p5 j/ m% f IRCOM[j]=IRCOM[j] >> 1;
5 y- l6 ~/ R2 i/ t+ s" k# B if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}- h- Z9 ?0 {" N( Q: D
N=0;
* d# z5 C( H# B9 g: h( a }//end for k% T9 X9 _6 B) k; N6 l; f+ i4 _
}//end for j( y: m" U8 a, i* m
9 J8 N# n& i/ U; @" e- }8 N
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
t3 ^$ ^" O k" t. H* m IRCOM[5]=IRCOM[2] & 0x0F;! \5 u1 w) F( m7 b/ F0 Y! H
IRCOM[6]=IRCOM[2] & 0xF0;
/ |' K0 o2 ?' m. P! Q, o D IRCOM[6]=IRCOM[6] >> 4;$ V2 O, H1 U4 U% W3 Y6 S3 D- R
// beep();
8 n" N; R; ~' [4 B6 v: Q EA = 1;' ?6 x% C6 h6 K- ]$ o
, C* a, |1 A7 D) g* c
send_char(IRCOM[2]);0 h0 Y( V6 j x, w' Z' K- \* m
+ q$ [# Q& C3 D/ G1 G
}//end interrupt0 M# a. x: Z3 }4 B$ A
! ?' d+ e0 P- C* t8 }//下面是延时程序
; G4 w5 `; v0 x* r: Z( g1 z4 ?void delay(unsigned char x)//x*0.14MS,unsigned char x是参量" |0 d0 f- {' R* P( ]
{
& Z+ `8 I+ n" H( j: Q unsigned char i;! U+ k# l2 M9 J
while(x--)
* ~; Z( p3 O4 X3 v: R* X& @7 N% z {
9 K- A4 Q9 P+ P2 F1 h for (i = 0; i<13; i++) {}
+ K( ]# ^0 z# x' r6 k }/ f; B/ N& m9 P6 A% ]* _
}, b& y3 h: r9 f7 v. A
1 S; q, y# n5 |# z' y- }& c
//下面是延时程序' }6 |4 n3 Y. [( A: c, M. E
void delay1(unsigned char ms)//unsigned char ms是参量
6 h: @ g6 o/ Y- l{
0 L' c4 U3 M' ?& G! H unsigned char i;8 y' c" F0 p4 X7 I2 S) R5 N
while(ms--)
+ j' z4 g" [" r1 F, I' l$ h {' @5 I0 B% F! t @; n
for(i = 0; i<120; i++)5 m, r2 o1 {! X' X
{3 ]' \0 J9 X* [7 f G9 e+ J; i
_nop_();! _- m0 t6 ?/ O$ f( S
_nop_();: h- m% w! E8 z0 V
_nop_();
! g% o6 U+ b7 i% p, A) [ _nop_();; g/ j! ~. f. I2 I( ]. {% J
}
- c4 E) v' k, h/ I8 ?% A7 K }
/ I# m X. ~/ `, f, S} |
|