关于51单片机外部中断
是不是和数码管的驱动控制电路有关啊.
如果在最下面的中断函数里面加上delay(5);就可以。不知道为什么,求解释。
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define DataPort P0 //定义段数据端口 程序中遇到DataPort 则用P0 替换
#define SegPort P2 //定义位数据端口
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char code dofly_WeiMa[]={0,1,2,3,4,5,6,7};
//分别对应相应的数码管点亮,即位码
void Delay(unsigned int t); //函数声明
sbit led0 =P1^0;
void main()
{
char j=0;
EA=1;
EX0=1;
while(1)
{
led0=1;
SegPort=dofly_WeiMa[0]; //取位码
for(j=0;j<16;j++)
{
DataPort=dofly_DuanMa[j]; //取显示数据,段码
Delay(1000); //扫描间隙延时,时间太长会闪烁,太短会造成重影
}
}
}
void Delay(unsigned int t)
{
int i,k;
for (i=t;i>0;i--)
for(k=110;k>0;k--);
}
void intoLL()interrupt 0
{
led0=0;
//Delay(5);
}
如果用74LS164作显示驱动,要提供稳定的时钟.否则,显示会异常.中断服务程序处理时间应匹配数码管刷新时间.
有原理图你看下,数据是用74hc573,位选端是74hc 138控制的
这个是驱动和数码管的原理图

中断服务程序可以加一段类似按健消抖的程序,DELAY(5)就起这个作用,应该再判断中断引脚的信号是否为高电平或低电平.用示波器看一下中断信号是否不太好啊,是用按键作中断源吗?按键按下时,是有抖动的,所以显示不停止,造成多次中断,就是你说的不停止的现象.P37脚控制573的11脚C锁存使能输入,程序中没有用到啊.138的E3脚有接到单片上吗?DELAY(1000)可根据人眼视觉特点计算.主要还是程序的问题.
是用杜邦线连的,我开发板上74hc573用跳冒直接接的vcc,138的那个接的vcc,不过刚又试了下,有不对了,加上delay(5)耶不成功了,明明上午还可以的啊,数码管一直再走,也不变慢了,改用下降沿触发灯耶不闪了,呜呜呜呜呜呜
这个问题之前已经有人回答过了。进入中断后,并不是程序只执行中断程序。程序在执行完一次中断后会再次返回主程序,而后马上再次进入中断执行中断程序。因此主程序是一直会缓慢的执行,数码管肯定会变化。如果要进入中断后不返回主程序,只能加上条件判断了。
不是太懂,看的是郭天祥的教程,他也没解释,看视频中也有走慢的情况,我的程序也是这样,视频讲的是连接P3.2口进入外部中断0,主程序停止啊,拔掉线,P3.2高电平,回到主程序
很明显是没能一直处理中断,变慢就说明中断函数执行完不能立刻再次进入中断执行,这个应该跟MCU有关,可能有些MCU你这样能够实现。不过从程序员角度上的话一般会去避免这个问题
