51单片机外部中断0和定时中断0混用的问题

程序的目的是为了实现用红外遥控器的任意键或者与P2^0相连的按键按下后,第一次可以开启计时功能,并在数码管上显示,第二次按下后计时器停止,第三次按下后复位。但我写的程序用与P2^0相连的按键是可以实现计时功能的,用红外遥控器就不能计时,难道是这两个中断冲突了????!!
下面是源程序,请高手帮忙找找错误,万分感谢!!!
#include <reg51.h>

sbit IRIN = P3^2;
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
sbit P2_0=P2^0;

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned int second,keycnt,tcnt,x;
unsigned int LedOut[8];

void display(unsigned int d) //数码管显示//
{
static unsigned int i,j;

LedOut[0]=Disp_Tab[d%10000/1000];
LedOut[1]=Disp_Tab[d%1000/100];
LedOut[2]=Disp_Tab[d%100/10];
LedOut[3]=Disp_Tab[d%10];

LedOut[4]=Disp_Tab[d%10000/1000];
LedOut[5]=Disp_Tab[d%1000/100];
LedOut[6]=Disp_Tab[d%100/10];
LedOut[7]=Disp_Tab[d%10];

for( i=0; i<8; i++)
{
P0 = LedOut[i];
switch(i)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;

}
for(j=0;j<400;j++);
}
}

void main()
{
unsigned int i;

EA=1;
TMOD=0x02;
ET0=1;
IT0=1;
EX0=1; //外部中断0和定时器0的初始化//

IRIN=1;

display(second);

while(1)
{

if(x==1|P2_0==0) //红外遥控(x在收到脉冲后赋值为1)或按键//
{
for(i=0;i<350;i++)
if(x==1|P2_0==0)
{
keycnt++;
x=0;
switch(keycnt) //按一次开启计时,两次计时停止,三次复位//
{
case 1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;

case 2:
TR0=0;
break;

case 3:
keycnt=0;
second=0;
break;
}
while(P2_0==0); //确认按键松开//
}
}
display(second);
EX0=1;
}
}

void t0(void) interrupt 1 //定时器0设置//
{
tcnt++;

if(tcnt==4000)
{
tcnt=0;
second++;
if(second==1000)
second=0;
}
}

void IR_IN(void) interrupt 0 //外部中断0接受红外脉冲//
{
static unsigned int i;

while(!IRIN);
for(i=0;i<6000;i++);
while(IRIN);
for(i=0;i<6000;i++);
x=1;
EX0=0;
}

请注意void IR_IN(void)interrupt 0中的while(!RIN)和while(IRIN)这里会存在死机的概率,取决于你红外遥控按下的时机。一旦当你按下按键的那一刻后,单片机检测到了信号进入中断,此时恰好按键松开了又没信号了也就死机了。建议不要软件解码红外信号,可以采用专门的解码芯片。希望对你有所启发和帮助。追问

外部中断0的那段程序我用在红外遥控开灯上就没有问题,但加上了定时中断0后,总感觉这两个中断只执行了一个。。。请问外部中断0那段程序执行结束有是跳回到main程序的哪个部分?定时中断0结束后又跳到了哪个部分?万分感谢!

追答

不客气,希望能帮到你。

温馨提示:答案为网友推荐,仅供参考
相似回答