为什么单片机中断程序执行时主程序还在慢慢运行?初学~~~
答案:5 悬赏:10 手机版
解决时间 2021-01-13 09:47
- 提问者网友:富士山上尢
- 2021-01-13 00:43
为什么单片机中断程序执行时主程序还在慢慢运行?初学~~~
最佳答案
- 五星知识达人网友:罪歌
- 2021-01-13 02:02
你从哪看出来程序还在运行的,你的中断只有一句,马上就执行完成了,就跳出中断函数继续执行之前的程序了,你要是想观察中断后主程序是否运行,应该用死循环或者延时吧程序指针留在中断函数里,比如你可以在中断里延时个2S,等跳出中断后再观察主程序跑到哪儿了就一目了然了追问我的中断是点亮一个灯,主程序是数码管从0-F变化,但是我在执行中断的时候,即灯亮的时候(P3.2接GND),数码管仍然缓慢从0-F变化,但没有不执行中断的时候快。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;追答如上所说,中断不是之程序断开在那里,而是程序放下之前的执行优先执行中断函数内的东西,所以你的程序的执行是这样的,主程序——》中断函数——》主程序。。。如此往复,在执行中断时,主程序实际上已经暂停执行了,但是你的中断函数太短,程序指针停留的时间也太短。你试试在中断程序中写入一个do{}while(1);的死循环,你就会发现在程序第一次进入中断体后就陷入死循环,无法结束中断函数,主程序也就不会继续运行了。这才是检验主程序在中断时是否执行的方法。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;追答如上所说,中断不是之程序断开在那里,而是程序放下之前的执行优先执行中断函数内的东西,所以你的程序的执行是这样的,主程序——》中断函数——》主程序。。。如此往复,在执行中断时,主程序实际上已经暂停执行了,但是你的中断函数太短,程序指针停留的时间也太短。你试试在中断程序中写入一个do{}while(1);的死循环,你就会发现在程序第一次进入中断体后就陷入死循环,无法结束中断函数,主程序也就不会继续运行了。这才是检验主程序在中断时是否执行的方法。
全部回答
- 1楼网友:山河有幸埋战骨
- 2021-01-13 05:13
单片机是单线程的,不可能同时运行。追问我的中断是点亮一个灯,主程序是数码管从0-F变化,但是我在执行中断的时候,即灯亮的时候(P3.2接GND),数码管仍然缓慢从0-F变化,但没有不执行中断的时候快。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;追答你那个中断只是执行了一行代码:D1=0;
然后立即就又返回主程序了,在执行中断程序:D1=0;这一代码时,主程序是无法同时运行的。
比如你在D1=0;下面再添加一行延时等待程序。
void bright() interrupt 0
{
D1=0;
delay(100); //延时5秒钟
}
你再观察下,其中5秒的时间内,数码管还能变化吗?
你现在的情况是中断太频繁了,导致主程序运行变慢,所以数码管缓慢变化。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;追答你那个中断只是执行了一行代码:D1=0;
然后立即就又返回主程序了,在执行中断程序:D1=0;这一代码时,主程序是无法同时运行的。
比如你在D1=0;下面再添加一行延时等待程序。
void bright() interrupt 0
{
D1=0;
delay(100); //延时5秒钟
}
你再观察下,其中5秒的时间内,数码管还能变化吗?
你现在的情况是中断太频繁了,导致主程序运行变慢,所以数码管缓慢变化。
- 2楼网友:罪歌
- 2021-01-13 04:24
建议先了解一下中断的概念。它是处理异常事件时暂停正在运行的程序,跳转到一个特定地址去响应异常事件。随后继续执行原来的程序。详细概念到书上查查或网上搜一下追问我的中断是点亮一个灯,主程序是数码管从0-F变化,但是我在执行中断的时候,即灯亮的时候(P3.2接GND),数码管仍然缓慢从0-F变化,但没有不执行中断的时候快。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;追答这应该是正常的,因为你选择的是电平中断,只要P3.2是低电平就会进入中断,当P3.2接地时程序就不断的进出中断,导致延时时间变长。将中断响应改为下降沿中断就不会了。
前面的朋友说的不对,为个程序的中断对主程序是有影响的。一次中断不会对主程序没什么影响,但一直进中断对主程序就有影响了。
把这条语句改一下即可:IT0=0;//选择电平触发方式
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;追答这应该是正常的,因为你选择的是电平中断,只要P3.2是低电平就会进入中断,当P3.2接地时程序就不断的进出中断,导致延时时间变长。将中断响应改为下降沿中断就不会了。
前面的朋友说的不对,为个程序的中断对主程序是有影响的。一次中断不会对主程序没什么影响,但一直进中断对主程序就有影响了。
把这条语句改一下即可:IT0=0;//选择电平触发方式
- 3楼网友:狂恋
- 2021-01-13 03:34
和前面的朋友说的一样。你的中断程序太短,执行时间很快,所以你感觉不到它的执行。
- 4楼网友:三千妖杀
- 2021-01-13 02:47
前面的说的都有各自的说明,我想说的是,你选择低电平触发,你怎么触发它?
手动?还是一直给它一个低电平?如果一直给它低电平的话,因为中断是随机的,我们不可能知道它什么时候会发生中断,又因为你的终端函数太短了,执行一次中断只需要一个机器周期,一直接地的话,随时都在发生中断,所以你原先设置的0.5s变一次,就变成了差不多3s变一次,其实你仔细观察它或许不是精确的几s变一次,由于中断的随机性,导致你的0.5s的时间也发生了随机性。
手动?还是一直给它一个低电平?如果一直给它低电平的话,因为中断是随机的,我们不可能知道它什么时候会发生中断,又因为你的终端函数太短了,执行一次中断只需要一个机器周期,一直接地的话,随时都在发生中断,所以你原先设置的0.5s变一次,就变成了差不多3s变一次,其实你仔细观察它或许不是精确的几s变一次,由于中断的随机性,导致你的0.5s的时间也发生了随机性。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯