为什么单片机中断程序执行时主程序还在慢慢运行?初学~~~
#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitnumsel=P2^7;sbitli...
#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;
} 展开
#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;
} 展开
6个回答
展开全部
你从哪看出来程序还在运行的,你的中断只有一句,马上就执行完成了,就跳出中断函数继续执行之前的程序了,你要是想观察中断后主程序是否运行,应该用死循环或者延时吧程序指针留在中断函数里,比如你可以在中断里延时个2S,等跳出中断后再观察主程序跑到哪儿了就一目了然了
追问
我的中断是点亮一个灯,主程序是数码管从0-F变化,但是我在执行中断的时候,即灯亮的时候(P3.2接GND),数码管仍然缓慢从0-F变化,但没有不执行中断的时候快。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;
追答
如上所说,中断不是之程序断开在那里,而是程序放下之前的执行优先执行中断函数内的东西,所以你的程序的执行是这样的,主程序——》中断函数——》主程序。。。如此往复,在执行中断时,主程序实际上已经暂停执行了,但是你的中断函数太短,程序指针停留的时间也太短。你试试在中断程序中写入一个do{}while(1);的死循环,你就会发现在程序第一次进入中断体后就陷入死循环,无法结束中断函数,主程序也就不会继续运行了。这才是检验主程序在中断时是否执行的方法。
展开全部
前面的说的都有各自的说明,我想说的是,你选择低电平触发,你怎么触发它?
手动?还是一直给它一个低电平?如果一直给它低电平的话,因为中断是随机的,我们不可能知道它什么时候会发生中断,又因为你的终端函数太短了,执行一次中断只需要一个机器周期,一直接地的话,随时都在发生中断,所以你原先设置的0.5s变一次,就变成了差不多3s变一次,其实你仔细观察它或许不是精确的几s变一次,由于中断的随机性,导致你的0.5s的时间也发生了随机性。
手动?还是一直给它一个低电平?如果一直给它低电平的话,因为中断是随机的,我们不可能知道它什么时候会发生中断,又因为你的终端函数太短了,执行一次中断只需要一个机器周期,一直接地的话,随时都在发生中断,所以你原先设置的0.5s变一次,就变成了差不多3s变一次,其实你仔细观察它或许不是精确的几s变一次,由于中断的随机性,导致你的0.5s的时间也发生了随机性。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议先了解一下中断的概念。它是处理异常事件时暂停正在运行的程序,跳转到一个特定地址去响应异常事件。随后继续执行原来的程序。详细概念到书上查查或网上搜一下
追问
我的中断是点亮一个灯,主程序是数码管从0-F变化,但是我在执行中断的时候,即灯亮的时候(P3.2接GND),数码管仍然缓慢从0-F变化,但没有不执行中断的时候快。
不执行中断的时候,0.5秒变化一次;
执行中断的时候,差不多3秒变化一次,同时灯亮;
追答
这应该是正常的,因为你选择的是电平中断,只要P3.2是低电平就会进入中断,当P3.2接地时程序就不断的进出中断,导致延时时间变长。将中断响应改为下降沿中断就不会了。
前面的朋友说的不对,为个程序的中断对主程序是有影响的。一次中断不会对主程序没什么影响,但一直进中断对主程序就有影响了。
把这条语句改一下即可:IT0=0;//选择电平触发方式
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
和前面的朋友说的一样。你的中断程序太短,执行时间很快,所以你感觉不到它的执行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
单片机是单线程的,不可能同时运行。
追问
我的中断是点亮一个灯,主程序是数码管从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秒的时间内,数码管还能变化吗?
你现在的情况是中断太频繁了,导致主程序运行变慢,所以数码管缓慢变化。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询