本帖最后由 zwf33 于 2021-1-10 18:26 编辑
51外部中断有两种方式
低电平触发 IT0=0 (检测到引脚为低电平就触发 )
下降沿触发IT0=1 (测到引脚从高到低下降时就触发)
你的程序是下降沿触发的,中断点亮d1又回到了断点位置执行主程序
增加IT0=0,中断程再加延时delay(200),P3.2一直保持低电平,数码管就不走了
#include <REGX52.H>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit wela=P2^7;
sbit dula=P2^6;
void delay(uint z);
sbit d1=P1^0;
uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
}; //数码管编码表
uchar num; //定义num数据类型
void main()
{
//********************外部中断0,电平触发中断********************//
EA=1; //打开总中断
EX0=1; //开外部中断0
IT0=0; //电平触发
//********************外部中断0,电平触发中断********************//
//********************打开位选********************//
wela=1;
P0=0xc0;
wela=0;
//********************打开位选********************//
while(1)
{
d1=1;
for(num=0; num<16; num++) //unmp赋初值,判断自加
{
dula=1; //打开段选
P0=table[num]; //table等于自加后的num值
dula=0;
delay(50);
}
}
}
void delay(uint z) //延时子程序
{
uint x,y;
for(x=z; x>0; x--)
{
for(y=110; y>0; y--);
}
}
//********************中断程序********************//
void exter0() interrupt 0 //中断函数不用声明
{
d1=0;
delay(200);
}
//********************中断程序********************//
|