51单片机外部中断问题

刚学不久,有些表述可能不太专业。
片子用的是89c52rc以及12c5a60s2。
程序如图

功能很简单,main就是八位数码管0-7流水显示,外部中断0(低电平触发)驱动蜂鸣器和另一组二极管。
但实际使用时,表现为不中断时,蜂鸣器响八次之后(也就是执行一次touch函数),八位数码管流水显示一次,然后蜂鸣器再响八次。
如果这时候将外部中断口接地的话,八位数码管停止,但蜂鸣器却继续工作。
当时就理解不了问题出在哪里,猜测会不会因为某些原因,使得单片机没有正确识别中断程序touch,并由此反复执行main和touch,但main本身就是个while循环,后面还补了一个while(1),照理说未中断情况下,程序是绝对不可能跑偏到touch上的。
拿去给老师看了看,猜测是片子的问题。但换了12c5a60s2问题依旧。
这时候,突然考虑到,外部中断0不行,那改成外部中断1呢?结果修改以后,居然可以了!
那这诡异的结果是什么道理?没可能两块片子的外部中断0都出问题了吧……

第1个回答  2019-01-30
如果是下降沿触发(it0=1)就只会执行一次中断程序。电平触发(it0=1)的话每次执行完中断里面的程序(只要不关闭中断)就又跳进中断里去了,不断的循环执行。
循环的频率跟晶振有关,晶振的频率直接关系到单片机执行指令的速度。频率越高速度也就越快。
第2个回答  2015-07-24
看程序,我怎么觉得应该是:
不中断时,蜂鸣器一直响,八位数码管流水显示;
中断时,八位数码管停止,蜂鸣器响8次。追问

蜂鸣器beep只在中断程序touch里改变过……main里没有再改变beep的值……所以按程序,不中断的时候,蜂鸣器是绝对不响的才对吧?

追答

我不知道你的蜂鸣器是高电平响,还是低电平响,如果是高电平响,那么在main中beep=1,则一直响,否则就一直不响(非中断时)。也不应该是你说的那样非中断时是会响8次

追问

1就是不响,main里那个beep=1纯粹是初始化一下,touch就是响八次,而现状就是不中断的时候,main跑完会无视while,跳出去接着跑touch,再返回到main,重复执行……现在的问题应该不是程序上的,毕竟外部中断1可以正常驱动,外部中断0却不行,但也不可能是两块片子的外部中断同时出问题吧,我只是想了解一下可能的原因有哪些,好自行排查。

追答

嗯,懂你的意思了。确实很迷惑,从程序来看:不中断时,八位数码管流水显示;中断时,数码管停止,蜂鸣器响。为何为无视while(1),相当奇怪。你试试改成IT0=1,即用下降沿来触发外部中断0看看,我猜测会不会悬空也算低电平。

本回答被网友采纳
相似回答