|
楼主 |
发表于 2010-5-2 12:05:32
|
显示全部楼层
谢谢斑竹,我已经有一个程序了
9 ?' ~ Y/ P3 K6 r1 i7 \" w! m7 ~0 q
只是不太明白
# T- ]* c4 B+ l2 j; T% Q% y* j/ U% `; z
#include <AT89x51.h>( k. {4 `3 U2 b; m
# C7 S6 X: p7 F w9 n2 S$ C
3 d5 v: l) r1 G
+ b& I" z5 m b9 M6 xstatic unsigned char data IRCode[3],IRCON,IRCON2;static unsigned char data DT;4 ?* \# H9 U& v5 e
$ S6 ^" z- C+ I$ B) K" v0 L
9 D: m2 z+ a6 [( `* Z6 ?
; f; ]0 h6 u0 e& B3 Lvoid main(void){unsigned int de;. d+ y; N4 R6 b- e
0 I0 T. I5 S& X, v
2 C0 D$ J+ g% S
: p" W/ I f1 c* f/ w: ^- s
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);}" S$ J9 R+ I6 I H' |
8 {& @& v2 Z( F+ O4 M
' N7 D: N9 |& H5 v
. w3 K, _' m- V f8 B9 G2 J% h
//定时器0中断处理void timeint(void) interrupt 1 using 2{TH0=0xFD;TL0=0x1E; //设定时值为800us
5 v* {2 S) ~; g: r6 d, J% o, p+ E. \) _5 J( ?# j
Y4 x" e! S- ^# o$ u
0 h) m& l1 K' X5 F1 Aif (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;}}}} }
5 r6 N% S" q8 `$ l$ K' Y& D' J0 \( F& v8 ]4 j. e" s
3 z. } X4 Q' w2 L6 ~; r- I! N
$ [, @/ w- W* A* A7 j; i//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; //计数清零
7 e" @, J f! R/ p/ |$ B- Y) Q+ N- c0 g' \, [ e
1 B/ ~4 z0 s' p5 ^( a/ D# u: P/ d0 a6 O ?
TR0 = 1;//开始计数} |
|