stc51单片机的外部中断问题
我开启STC51单片机INT1的中断,触发方式为低电平(IT1=0;)。但触发并进入中断后,主函数的程序仍在执行!不过执行的速度变慢了。主函数是LED灯做二进制加法。这是...
我开启STC51单片机INT1的中断,触发方式为低电平(IT1=0;)。但触发并进入中断后,主函数的程序仍在执行!不过执行的速度变慢了。主函数是LED灯做二进制加法。这是为什么? 程序如下
#include<reg52.h>
unsigned int e;
sbit k1=P3^3;
sbit led=P1^0;
void delay1ms(unsigned int i)
{
while(i--)
{
unsigned int j;
for(j=0;j<125;j++);
}
}
void main()
{
EA=1;
EX1=1;
IT1=0;
P0=256;
for(e=0;e<256;e++)
{
P0--;
delay1ms(200);
}
}
void Tdd0() interrupt 2
{
led=~led;
} 展开
#include<reg52.h>
unsigned int e;
sbit k1=P3^3;
sbit led=P1^0;
void delay1ms(unsigned int i)
{
while(i--)
{
unsigned int j;
for(j=0;j<125;j++);
}
}
void main()
{
EA=1;
EX1=1;
IT1=0;
P0=256;
for(e=0;e<256;e++)
{
P0--;
delay1ms(200);
}
}
void Tdd0() interrupt 2
{
led=~led;
} 展开
3个回答
展开全部
请问你这个触发中断是一个按键?你触发的方式是长时间按下还是瞬间按下?我觉得你应该是长时间按下的。回到正题,你这个中断服务函数里只有一句代码,那么中断服务函数执行的速度会很快的,所以如果你只按了一下的话那么看起来就感觉没有执行一样,更重要的是你这个中断服务函数里没有对按键进行消抖,同时也没有关闭中断,这就可能会引起,当你瞬间按下中断按钮后,其实中断被执行了多次,而当你长时间按下中断按钮后,那么程序会不停的在main和中断服务函数之间快速不停的切换,这就导致了main函数断断续续的运行,看起来就像是main运行变慢了,其实是因为程序需要不停的进入中断服务函数,所以看起来就像运行变慢一样。
改进建议:在中断服务函数里加入按键消抖的语句,或是直接进入中断后关闭中断,处理完后再开启。而且如果想明显的看到效果的话请在中断服务函数里加一些延时语句。
改进建议:在中断服务函数里加入按键消抖的语句,或是直接进入中断后关闭中断,处理完后再开启。而且如果想明显的看到效果的话请在中断服务函数里加一些延时语句。
追问
是一个按键的,而且是长时间按下。
我还是不明白,我看郭天祥老师的视频,进入中断后,main函数不是暂停运行了吗,为什么还会不停地切换呢
追答
他那个进入中断后会关闭中断,这个时候如果中断引脚就无法再继续产生中断了,而你这个进入中断后没有关闭中断,那么当你长时间按下按钮的话就会不停的触发中断,而又因为你这个中断服务程序非常短,所以在完成这次中断后程序刚要去执行main函数就又被中断打断,所以就会反反复复的重复进入中断。问题就出在你的长时间按下中断按键和你的中断服务函数中没有禁掉中断。你要看看中断的原理,看看为什么人家的程序里在进入中断后要马上关闭中断,以及为什么要进行按键消抖。总之,你的程序在发生中断时程序确实令main函数停止运行了而跳转到了中断服务函数里,只不过因为你的中断服务函数太短了,短到跟没有一样(此时你的led应处于大概1/2的亮度),所以看起来是既执行了中断又执行了main函数,你如果在中断服务函数里加入关中断以及增加延时函数后,就能明显的发现不同了。
展开全部
进入中断,肯定影响到主程序了,你一直置低电平,肯定要不断进中断。
追问
我在main函数中,for函数前加了一句k1=0;结果和我按下按键一样,主函数仍然在缓慢执行。我换了AT89S52,情况一样的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-07-29
展开全部
中断处理函数没有清中断标志,导致反复进行中断。
追问
请问什么是清中断标志?
还有,
我在main函数中,for函数前加了一句k1=0;结果和我按下按键一样,主函数仍然在缓慢执行。我换了AT89S52,情况一样的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询