51单片机外部中断子程序为什么会执行两次呢(我只触发一次) 下面是我的程序代码

#include <reg52.h>
sbit beep = P2^3;//蜂鸣器端口
void delay(unsigned int);
unsigned int i=0;
unsigned char main()
{
EA = 1;
EX1 = 1;
IT1 = 1;
while(1);
return 0;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void inter1() interrupt 2
{
unsigned char a;
EX1 = 0;
i++;
for(a=0;a<5;a++)
{
beep = 0;
delay(500);
beep = 1;
delay(500);
}
EX1 = 1;
}

一开始 我用杜邦线一端连在单片机的GND口 另一端触发一次P3.2口(接触一下就离开) 然后蜂鸣器响了十次,为什么中断子程序会执行两次呢?

你的外部中断应该是属于下降沿触发,当有一个下降沿到来时外部中断请求标志IE0或IE1(外部中断0或外部中断1请求中断标志,下面简称为IEx)就会置1,当进入中断程序后IEx由硬件归零。也就是说单片机当检测到IEx为1的时候就会进入到外部中断程序。
现在来分析一下为什么你的程序会执行两次中断。
当单片机外部中断引脚第一次接收到一个下降沿时,IEx被置1,进入中断程序,随即IEx被硬件清零。然而由于你用杜邦线接触P3.2口存在抖动(你感觉不到),外部中断引脚再次接受到一个下降沿,IEx又被置1,单片机又要响应中断,但此时由于上一个中断程序未执行完,单片机将等待外部中断程序执行完(你可以理解为有两个中断事件,但这两个事件优先级相同,所有按顺序响应)。在这个过程中,你的接触仍然会产生很多下降沿,但因为IEx只有响应了中断事件后才会清零,因此IEx一直为1。当第一次的中断程序执行结束后,单片机检测到IEx又是1,马上又再次进入中断。因为你的接触时间远远小于你的中断程序执行时间,因此在第二次执行中断程序前已不存在下降沿,所以进入第二次中断程序后,IEx就被清零了,这样执行完第二次中断程序后就不会再次进入中断了。
说了那么多希望你能明白吧。不明白可以翻查相关单片机外部中断相关资料。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-01
先去找找按键处理的文章,搞清楚按键去抖。
按键抖动,会触发多次中断,第一次进中断后,延时期间可以多收一个中断,第二次再进,按键已经放开,所以只有两次,其实是很多次的,不过你只收到并处理了两次。
一般来说,不应该在中断处理中延时,也不要长时间的禁止中断。
第2个回答  2013-04-01
一次中断,循环五次,蜂鸣器响了十次,这不是很正常吗?

一般,单片机常用的都是《无源》的蜂鸣器,它只是在电压变化的时候响。
电压高电平,它不响;
电压低电平,它不响;
只是在电压上升、下降的边沿时刻,它才响一声。

如果,电压变化的很快,将听到连续的长声。

楼主的程序:
beep = 0;delay(500);
beep = 1;delay(500);
变化的时间间隔,长达几百毫秒,人,就听出来断续的声音。本回答被网友采纳
相似回答