ATMEGA16单片机外部中断问题!!!大家看一下

利用atmega16单片机的外部中断INT0,设置中断管脚为输入带上拉,下降沿触发,当给中断管脚一个低电平时,就会触发中断,执行中断程序,在中断程序中是PB5口由低变高,持续2s,但现在当给INT0一个下降沿时,PB5口会又低变高,持续4s,也就是变为原来两倍了,我加了一个延时函数观察了一下,是中断程序执行了两遍,我用示波器测得,INT0只触发了一次,低电平时间大约是120ms左右,这种情况有是有,有时候没有,将程序代码贴出来大家看一下/*******************************************函数名称: Init_kb参 数: 无返回值 : 无/********************************************/void Init_kb(void){ MCUCR =2; //设置INT0为下降沿触发中断 DDRD&=~BIT(2); //配置中断管脚为输入 PORTD|=BIT(2); //使能中断管脚的上拉 GICR|=BIT(EXTINT0);}/*********************************函数名称:迥Int0参数: 无返回值:无/***********************************/void Int0(){SREG&=~BIT(7); GICR&=~BIT(6); PORTB|=BIT(5); delay_ms(2000); PORTB&=~BIT(5); GICR|=BIT(6); SREG|=BIT(7);}
2026年09月28日 15:19
有2个网友回答
网友(1):

会不会是给外部中断的信号存在抖动的情况 如果是这样可以在中断函数中先读取管脚是否为低电平
void ISR(void)
{
unsigned char i;
for(i=0;i<5;i++)
{
if(portd == 1)//为抖动
return;
}

...
...
}

网友(2):

没用过AVR,外部中断状态是否需要手动清除?
另外别在中断里面放这么长的延时,
而且你调用的延时子程序是不是与主程序公用的延时子程序???