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

#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;
}

第1个回答  2020-02-15
遇到和您一样的问题,请问您现在知道原因吗?

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

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

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

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

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

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

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

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

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

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

相似回答