因为单片机执行的速度过快,也由于程序的复杂程度使程序走到部分代码阶段会出不去,出不去就一直执行在你按按键和执行中断的时候刚好走进这个循环里,程序判断当然是进入中断,然后中断完了回来这个循环造成这个循环变死循环了也就是你中断改变了一些因子使程序原本那个循环的因子突然遭到改变而出不去然后死循环了
其实,控制秒表的启动和停止,很简单。要做秒表,一定要用定时器吧,假如用T0,那开始初始化时,不写TR0=1,先不启动。
当按一下键,再启动,TR0=1,就开始计时了。
再 按一下键,就停止,TR0=0,就不计时了。
程序好写,先 定义一个按键
sbit key=P1^1; //具体是哪个 键,你自己改
主程序中,判断按键和启动/停止
if(key==0)
{
delay(); //具体延时时间自己定
if(key==0)
{
TR0=!TR0; //每按一次,取反 一次
while(key==0);
}
}
给state的定义加上 volatile 关键字试试。
C编译器有一个优化功能,如果他在当前函数中看不到state有其他赋值,可能会认为while(state)就是一个while(1),就是死循环,从而直接忽略掉后面所有的代码。
当前,您其他代码必须正确,比如真的退出了stop,那么下一步的代码是否正确,不要因为其他错误导致以为while没有跳出。
一个简单的方法,设置两个标志,例如Flag0 、Flag1,初值为0
在主函数中配置置中断0和1并开启中断,再主程序查询Flag0 和Flag1,Flag0=1,是开始(注意查询到为1后记得清掉Flag0=1),中断0和1的服务程序就写上Flag0 和Flag1 为1 即可
仅提供一个思路,很简单的一个程序,还是不附上代码了,还有问题可以咨询。
;---------------------------------------
;>
有以下几种情况:
1循环查询按键。当按键按第一次时间,进入第一层循环查询语句内部,执行恢复。不跳出该层循环,继续查询按键。当第二次按下时间,进入第二层循环查询语句内部,执行暂停。循环结束。若想反复暂停和恢复,就在外面再加一层while(1)类似的死循环,反复执行其内部的两层循环查询语句。
2用一个标志变量,记住按键的状态。初始化为个值,如“暂停”,按键之后检查标志变量,是“暂停”就执行“恢复”,再让它变为“恢复”说明当前已经执行了恢复。反之亦然。
3掉电暂停。这样需要按键能触发cpu工作。所以,需要按键接到外部中断上面。中断后可以恢复CPU工作。在中断中再判断是否要让cpu掉电与否。
不知道这种方法你能接受不还是用外部中断。此按键触发中断后,关掉所有其他的中断,也即EA=0(最好先用个变量记住EA,方便恢复),然后就一直在中断中等待该按键第二次按下再恢复EA,最后退出中断。
以上就是关于单片机使用按键时,为什么会出现中断停止现象全部的内容,包括:单片机使用按键时,为什么会出现中断停止现象、51单片机中用数码管做秒表时怎么用一个独立按键控制开始和暂停,即第一次按下计时,在按下时暂停、单片机怎么编写程序暂停功能,利用中断能实现吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)