为什么单片机中断程序执行时主程序还在慢慢运行?初学~~~

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit numsel=P2^7;
sbit light=P2^6;
sbit D1=P2^5;//将P2.5与发光二极管D1相连
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-9;A-F;编码表code
void delay(uint);//声明延时函数

void main()
{
uint num;
P0=0x00; //选通了8个数码管

EA=1;//打开中断总开关
EX0=1;//打开外部中断0,P3.2选通
IT0=0;//选择电平触发方式
while(1)
{

for(num=0;num<16;num++)
{
D1=1;//发光二极管灭,复位
numsel=1; //选通锁存器
P1=table[num]; //数码管显示数字
light=0; //对应的是数码管中a-g的亮灭
numsel=0; //关闭保持锁存器
delay(10); //延时0.5秒钟
}

}
}
//延时子函数
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<12000;j++);
}
//中断亮灯子函数
void bright() interrupt 0
{
D1=0;
}

你从哪看出来程序还在运行的,你的中断只有一句,马上就执行完成了,就跳出中断函数继续执行之前的程序了,你要是想观察中断后主程序是否运行,应该用死循环或者延时吧程序指针留在中断函数里,比如你可以在中断里延时个2S,等跳出中断后再观察主程序跑到哪儿了就一目了然了追问

我的中断是点亮一个灯,主程序是数码管从0-F变化,但是我在执行中断的时候,即灯亮的时候(P3.2接GND),数码管仍然缓慢从0-F变化,但没有不执行中断的时候快。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;

追答

如上所说,中断不是之程序断开在那里,而是程序放下之前的执行优先执行中断函数内的东西,所以你的程序的执行是这样的,主程序——》中断函数——》主程序。。。如此往复,在执行中断时,主程序实际上已经暂停执行了,但是你的中断函数太短,程序指针停留的时间也太短。你试试在中断程序中写入一个do{}while(1);的死循环,你就会发现在程序第一次进入中断体后就陷入死循环,无法结束中断函数,主程序也就不会继续运行了。这才是检验主程序在中断时是否执行的方法。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-16
前面的说的都有各自的说明,我想说的是,你选择低电平触发,你怎么触发它?
手动?还是一直给它一个低电平?如果一直给它低电平的话,因为中断是随机的,我们不可能知道它什么时候会发生中断,又因为你的终端函数太短了,执行一次中断只需要一个机器周期,一直接地的话,随时都在发生中断,所以你原先设置的0.5s变一次,就变成了差不多3s变一次,其实你仔细观察它或许不是精确的几s变一次,由于中断的随机性,导致你的0.5s的时间也发生了随机性。
第2个回答  2011-10-04
建议先了解一下中断的概念。它是处理异常事件时暂停正在运行的程序,跳转到一个特定地址去响应异常事件。随后继续执行原来的程序。详细概念到书上查查或网上搜一下追问

我的中断是点亮一个灯,主程序是数码管从0-F变化,但是我在执行中断的时候,即灯亮的时候(P3.2接GND),数码管仍然缓慢从0-F变化,但没有不执行中断的时候快。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;

追答

这应该是正常的,因为你选择的是电平中断,只要P3.2是低电平就会进入中断,当P3.2接地时程序就不断的进出中断,导致延时时间变长。将中断响应改为下降沿中断就不会了。
前面的朋友说的不对,为个程序的中断对主程序是有影响的。一次中断不会对主程序没什么影响,但一直进中断对主程序就有影响了。
把这条语句改一下即可:IT0=0;//选择电平触发方式

第3个回答  2011-10-05
和前面的朋友说的一样。你的中断程序太短,执行时间很快,所以你感觉不到它的执行。
第4个回答  2011-10-04
单片机是单线程的,不可能同时运行。追问

我的中断是点亮一个灯,主程序是数码管从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秒的时间内,数码管还能变化吗?

你现在的情况是中断太频繁了,导致主程序运行变慢,所以数码管缓慢变化。

请教:进入中断后主程序仍然运行
只是比没中断前数字的变化时间长了很多,是因为要执行中断占用了时间 单片机执行中断程序后,会回到主程序继续执行,如果还有中断触发则在进入中断程序,如此循环。主程序当然是在运行了。不明白可以去看看书关于中断的那章,说的明白的 其实我不是很明白你的意思 ^-^ ...

单片机为什么按下外部中断后程序仍会进行,只是比原来慢了
如此,这个程序一直反复的被打断,当然它的执行时间就不对了,就比没有打断的时候慢多了。这种靠循环次数来延时的程序的延时算法,只适用于“单线的”流程。也就是说,没有考虑系统中还有别的同时要做的工作。一旦有其他操作打断他,延时就不对了。所以,凡是多个任务穿插执行的程序中,通常不用这种延...

编制中断服务程序时,为什么在主程序的初始化程序中
一般主程序和中断服务程序都可能会用到累加器、PSW寄存器和一些其他寄存器。CPU在进入中断服务程序后,用到上述寄存器时就会破坏它原来存在寄存器中的内容,一旦中断返回,将会造成主程序混乱。因而,在进入中断服务程序后,一般要先保护现场,然后再执行中断服务程序,在返回主程序以前,要恢复现场。

单片机定时中断执行完中断程序后将返回主程序哪里
每个单片机都会有PC(程序计数器)值,每执行一条语句PC值加一,当中断来临的时候,PC值会被压入堆栈(有些单片机是硬件自动压入,有些是需要软件压入),当中断函数执行完毕的时候,PC值会被弹出堆栈,这样程序会跳到PC值所指向的那条程序继续执行。当然这个是单片机的运行机制,如果仅从表面现象来看的...

单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了...
你非要这么做,也没有人管,但不符合逻辑。既然采用中断的方式,就是为了充分利用单片机的时间。像你说的这个问题一种解决的办法是延长中断的时间,中断的时间要长于执行中断程序的时间,因每次中断的执行任务需要30ms,而中断时间是10ms,这根本就不能完成中断的任务吗,当然了,中断时,没有从中断...

51单片机写个程序,好像在中断里面出不来了,主程序只运行了一部分,之后...
又显示液晶,这里面花的时间远远地超过10ms,它肯定死在中断里出不来啊,因为你不关闭中断的话它一直10ms进去,最好在中断里设置几个标志位,进中断就让标志位置1,然后出中断,在主循环里判断标志位,如果标志位置1了,就清零标志位,然后做其他的动作。好好想一想,思路一定要清晰!

51单片机中断怎么跳出去继续执行主程序的问题
中断函数执行完成退出后,便自动返回主程序继续下一个指令的执行的;在中断函数里,不要做太多的事情,更不要有延时函数,除非其延时值比中断间隙要小,否则中断会乱套的;

单片机为什么使用中断
中断保护现场,是为了你中断子程序执行完以后能够返回到你程序中中断点,即产生中断的地方,使程序能够继续向下执行!!!如过你说的不用保护现场的话,那么程序执行完以后就不能够回到现场,那么你的程序将不知道要跳转到那里去了,也就是飞鸟,呵呵……你说的中断嵌套,也是一样的,两者都要保护现场...

单片机定时中断的问题
比如你的主程序有加减乘除法,中断子程序中也有,那么你就必须对ACC,PSW等标志寄存器进行保护,因为你在执行中断程序的加减法时可能已经有进位或者借位,已经改变了某些标志位,而回到主程序中时若主程序的加减法没有进位时,标志位在子程序中已被改变,现在就可能出错了。所以在进入中断子程序时要首先把...

单片机 c语言中的定时中断函数,在mian函数TH0和TL0有了初始化,为什么在...
因为定时器计数溢出时才产生中断,th0tl0全等于0。这种定时工作方式不会自动重装定时初值,所以中断子函数中要人工装载。主函数中如果省去初值,那就是从0开始计数,第一次进入中断的时间会有误差,所以不能省。

相似回答