标题:
51单片机关闭中断再打开中断下次还会进入中断吗(附程序)
[打印本页]
作者:
gguo2
时间:
2018-10-13 09:09
标题:
51单片机关闭中断再打开中断下次还会进入中断吗(附程序)
本帖最后由 gguo2 于 2018-10-13 09:10 编辑
外部下降沿触发中断,进入中断后EA=0关闭中断,while 语句执行完后再EA=1 打开中断。
请问下次再出现下降沿的时候还能进入这个中断程序吗?我目的是每发生一次下降沿,执行一次这个中断内部的函数。
void main()
{
TMOD=0x01; // Timer mode 1
TR0=1; // Timer 0 enable
TR1=1; // Timer 1 enable
IT0=1; // Falling edge trigger
EX0=1; // External interrupt 0 enable
EA=1; // Master switch enable
while (1) ;
}
void EXINT0() interrupt 0 //0 stands for external interrupt 0
{
EA=0;
TH1=0xB1;
TL1=0xEC;
cnt=0;
while (cnt<=100)
{
P1=0xE3;
Delay10ms();
P1=0xF3;
Delay10ms();
if (TF1 == 1)
{
TF1=0;
TH1=0xB1;
TL1=0xE0;
cnt++;
}
}
EA=1;
}
作者:
sxhwdz
时间:
2018-10-13 10:59
只要中断是打开的,每次下降沿都会产生中断。
作者:
chenghaidong
时间:
2018-10-13 11:01
可以的啊,只要退出中断就能再次进入的啊
作者:
cjm82
时间:
2018-10-13 11:07
进入中断后,关闭中断,执行中断程序里的代码完后,再打开,还是可以进入中断的.
但是一般不这么写,更多的是某中断执行完其代码后,将自身使能位关闭,然后再其他中断或者main函数里根据需要条件触发再打开,如.
void main(void)
{
.....
......
while(1)
{
....
.....
if(xxxx&&ex0==0)
{
ex0 = 1;
}
............
............
}
}
void ex0_ISR() interrupt 0
{
.............
...............
.................
ex0 = 0;
}
建议中断程序里尽量不要写循环,更加不应该写DELAY,完全可以通过写IF来判断,然后设置标志位,main函数再根据标志位来执行对应的功能.如:
bit flag_1;
void main(void)
{
while(1)
{
if(flag_1==1)
{
while(xxx)
{
.............
...........
}
delay(xxxx);
flag_1 = 0;
ex0 = 1;
}
}
}
void ex0_ISR() interrupt 0
{
ex0 = 0;
flag_1 = 1;
}
作者:
Y_G_G
时间:
2018-10-13 11:59
不会C语言,但原理是不变的:你可以在中断程序里先关闭中断,在中断返回的时候再打开,下一次一样的可以触发中断,这样可以避免中断等级低的中断被中断等级高的中断打断.
作者:
啊哈0098
时间:
2018-10-13 13:39
会,只要中断打开了,申请通过,就会进入中断服务
作者:
qscwdfr
时间:
2018-10-13 14:19
会的会的
作者:
83543
时间:
2018-10-13 15:00
注意中断时间的设定
作者:
青桔柠檬
时间:
2018-10-14 20:52
可以的
作者:
yzwzfyz
时间:
2018-10-14 21:17
取决于中断源有没有消失!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1