|
楼主 |
发表于 2010-5-2 12:05:32
|
显示全部楼层
谢谢斑竹,我已经有一个程序了6 I' J3 R `6 l+ t
6 l N! V( z7 ^; z9 D0 L8 s2 G
只是不太明白. @; g: b7 X* R
t: r9 @4 `- v$ b: o( A; }#include <AT89x51.h>, r7 f0 h9 V t+ x# c
" D4 b, X7 C3 \7 N$ E0 G2 B/ P8 @5 _
8 d) n* A6 P" ^1 |' V% h6 Y8 `: L* u
7 E0 I$ }: r$ P D; ~9 G. G
static unsigned char data IRCode[3],IRCON,IRCON2;static unsigned char data DT;
?) X0 M, `1 |8 p+ g& `& N0 H
$ a& U; M& \3 q2 @4 N8 j( G7 ^. t, f
2 m8 I5 c3 ]' \3 A) c
* x$ x' a, |8 W- z. M" a1 Fvoid main(void){unsigned int de;- J5 F# a) L7 {9 v; H- p3 F* Q
1 \( ^0 A% W f# k- _2 t
$ P$ K. h) J' v$ a; o. |. k% ?% t9 e) w" d# S# w" y% W
TMOD = 0x01; //定时器0方式1EA = 1; //允许CPU中断IT0 = 1; //INT0下降沿有效EX0 = 1; //开INT0中断;do{ for (de=0; de<10000; de++)P3_6 = 1;for (de=0; de<10000; de++)P3_6 = 0;if (DT) {for (de=0; de<30000; de++) //这里起到按键值正确后会有一个延时,防止重复按键P3_6 = 1;for (de=0; de<30000; de++)P3_6 = 0;DT = 0;}EX0 = 1;}while(1);}( H& K/ o5 Y `3 v F- Q, {
! ]# B- V; ]% U9 v: P% T* |, L/ N
0 i- @" q, |% l) S! X
/ k) T) ^2 ?) M8 o//定时器0中断处理void timeint(void) interrupt 1 using 2{TH0=0xFD;TL0=0x1E; //设定时值为800us
8 I# A# q4 u5 ?; b+ j' S9 M4 Z5 A) e5 a
' X9 f. ^& f- ^; Q$ ]; I
1 `; Q1 K8 K+ c& \. yif (IRCON<3){if (IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位{IRCON2++;IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位}else{IRCON++; //填满一个字节,指向下一个变量IRCON2=0; //计数清零}}else{TR0 = 0; //关闭定时器ET0 = 0; //定时器0中断关闭if ((IRCode[1]!=0xFF) && (IRCode[2]!=0xFF)){if (IRCode[1] == 0x55){switch (IRCode[2]){case 0xAB: //1-8键控制P1_0 = ~P1_0;DT = 1;break;case 0xAC1_1 = ~P1_1;DT = 1;break;case 0xAD: P1_2 = ~P1_2;DT = 1;break;case 0xB2: P1_3 = ~P1_3;DT = 1;break;case 0xB3: P1_4 = ~P1_4;DT = 1;break;case 0xB4: P1_5 = ~P1_5;DT = 1;break;case 0xB5: P1_6 = ~P1_6;DT = 1;break;case 0xCA: P1_7 = ~P1_7;DT = 1;break;case 0xD2: //按关闭电源键,关闭所有继电器P1 = 0xFF;DT = 1;break;}}}} }
" b; V" L, Y; s# ]0 |. R/ o
3 ?1 h$ B _8 n F3 [! T3 R. I! H6 @7 u+ _' f; j9 ^
0 k! K6 k9 ^" c/ U- I+ m' N/ t0 z//INT0中断void INT0Fun(void) interrupt 0 using 2{EX0 = 0; //外部中断0关闭ET0 = 1; //定时器0中断打开TH0=0xFD;TL0=0x1E; //设定时值为800usfor (IRCON=0; IRCON<3; IRCON++)IRCode[IRCON] = 0;IRCON = 0;IRCON2 = 0; //计数清零1 O- k+ I# u) L4 T4 P6 F
C2 `0 }* ]: P; E* c8 ^% R
; G$ a# G% b, @+ F9 B9 O, d
! X1 p& a6 b: L3 `TR0 = 1;//开始计数} |
|