本帖最后由 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); } //********************中断程序********************// |
silvanesw 发表于 2020-4-3 22:09 感谢 这样就解决了 厉害啊 我的大神 |
www12www 发表于 2020-4-1 07:00 是 原理是这样 可我的程序执行时 没按这个原理运行 不知道哪里出现问题了 |
man1234567 发表于 2020-3-31 22:53 我也知道啊 ![]() |