51单片机的外部中断0实验(P2.3引脚)
我做51单片机外部中断的实验除了问题程序如下:#include<reg52.h>#defineuintunsignedint#defineucharunsignedcha...
我做51单片机外部中断的实验除了问题
程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit d1=P3^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num;
void delay(uint);
void main()
{
EA=1;
EX0=1;
P1=0xaa;
while(1)
{
for(num=0;num<10;num++)
{
d1=1;
P0=table[num];
delay(1000);
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void exter0() interrupt 0
{
d1=0;
}
其中P1接8位数码管的位选,P0接8位数码管的段选
P3.0口接一个led指示灯,看是否中断
当我把外部中断0接GND时,数码管上的数字依旧跳变,并没有停止,只是跳动的频率比没加中断时慢了而已。
不知道是哪里出了问题 展开
程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit d1=P3^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num;
void delay(uint);
void main()
{
EA=1;
EX0=1;
P1=0xaa;
while(1)
{
for(num=0;num<10;num++)
{
d1=1;
P0=table[num];
delay(1000);
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void exter0() interrupt 0
{
d1=0;
}
其中P1接8位数码管的位选,P0接8位数码管的段选
P3.0口接一个led指示灯,看是否中断
当我把外部中断0接GND时,数码管上的数字依旧跳变,并没有停止,只是跳动的频率比没加中断时慢了而已。
不知道是哪里出了问题 展开
2个回答
展开全部
答:
先看看你的中断程序:
void exter0() interrupt 0
{
d1=0;
}
也就是叫d1置零而已。执行完这句就跳出中断了,继续执行主函数。
那么你叫中断一直低电平,是不是就一直触发中断呀?是的。
你认为只要一直触发中断,是不是就应该永远执行中断函数,而不干别的了?
当程序从中断函数跳出时如果又来了中断,单片机会在跳出中断后执行一条指令才进入中断的! 也就是执行RETI这句汇编指令后,接着又执行一条语句,才进入中断函数。跳出后又执行一条语句....依此类推
所以你的程序就是这样的情况。你看到的就是跳动的频率变满了。
先看看你的中断程序:
void exter0() interrupt 0
{
d1=0;
}
也就是叫d1置零而已。执行完这句就跳出中断了,继续执行主函数。
那么你叫中断一直低电平,是不是就一直触发中断呀?是的。
你认为只要一直触发中断,是不是就应该永远执行中断函数,而不干别的了?
当程序从中断函数跳出时如果又来了中断,单片机会在跳出中断后执行一条指令才进入中断的! 也就是执行RETI这句汇编指令后,接着又执行一条语句,才进入中断函数。跳出后又执行一条语句....依此类推
所以你的程序就是这样的情况。你看到的就是跳动的频率变满了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询