51单片机设置外部中断来实现计数,下降沿触发,可是为什么把程序烧录到单片机时会自己跳动?

主函数部分
EX0=1;//允许外部中断
IT0=1;//下降沿触发
EA=1;//开放总中断
while(1)
{
display_data(0x06,(pulse_num/100+'0'));//显示百位数字
display_data(0x07,((pulse_num/10)%10+'0'));//显示十位数字
display_data(0x08,(pulse_num%10+'0'));//显示个位数字
//delay(1000);
}

void timer0(void) interrupt 0
{
EX0=0;
delay(10);
pulse_num++;
EX0=1;
}

第1个回答  2012-11-04
硬件应该没问题,是程序的问题,主程序中的循环中一直在显示引起调动。追问

那应该怎么改?

追答

若是静态显示,想办法设置成每中断一次显示一次。若是动态显示则延长延时时间
while(1)
{
if(dis){
dis=0;
display_data(0x06,(pulse_num/100+'0'));//显示百位数字
display_data(0x07,((pulse_num/10)%10+'0'));//显示十位数字
display_data(0x08,(pulse_num%10+'0'));//显示个位数字
//delay(1000);
}
}

void timer0(void) interrupt 0
{
dis=1;
EX0=0;
delay(10);
pulse_num++;
EX0=1;
}

第2个回答  2012-11-04
中断触发会不会选择了内部时钟触发追问

那如何改为外部下降沿触发呢?非常感谢!

追答

对着手册设置寄存器

追问

帮我看以下程序吧。非常感谢 、我已经设置了下降沿触发了吧。

追答

P3.3外部加上拉电阻

第3个回答  2012-11-04
程序贴出看看追问

已经贴出来了 帮我看看吧 非常感谢。

追答

程序不全
display_data
函数里面加了延时没?先显示固定的数,确定显示没有问题。
if(P33==0)low=0;
if(P33==1)high=1;
if(low==0 && high==1)

这三句逻辑不明确,作什么。

追问

恩 谢谢 这三句是没用的,已经去掉了,应该是while(1)里面的问题吧,display_data()里面没有延时函数,显示应该没有问题,因为可以显示字符串。再帮我看一下吧 ,非常感谢,我实在不知道怎么回事了。

追答

display_data()没有延时是不正常的
因为
display_data(0x06,(pulse_num/100+'0'));
display_data(0x07,((pulse_num/10)%10+'0'));
你中间没加延时。数码管关闭需要一定的时间,这样容易造成余晖。但你说显示时正常的,我就认为他是正常的。因为没有看到全部 程序,无法判断。那你用示波器测量一下P3.2脚有无波形。

相似回答