用51单片机实现中断,为什么在中断函数中要加延迟,不加连接P3^2和地就不停止,而是产生了延迟的效果??

用51单片机实现中断,为什么在中断函数中要加延迟,不加连接P3^2和地就不停止,而是产生了延迟的效果??,第1张

单片机里有个有趣的现象不知道你注意了没有,当你按下一个键的时候,led屏上什么都没有了。

当你持续按住一个键,整个单片机就像断电了一样(或者叫短路了)

所以,按键一般都需要延迟(还有一个作用是防止按键抖动)

还有,代码里没有指定TMOD的值,这个习惯不好

通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。

但不知,你这提问是想帮你写程序昵,还是帮你分析中断程序的写法。

2级,希望你能认真看了并采纳,毕竟这问题挺复杂,说起来麻烦。

原文并没有说的完全对,这么做也是没有大错的。

它两次判别P1-1的状态,中间Delay(10),不过是防抖而已,就是说,第一次检测到按键按下,并且过了一段时间发现还是按下状态,那么就认为是按键动作,而不是干扰造成的。

一般来说这个时间是100ms左右到150ms左右,所以要有这么一段时间被delay做不了事情。但是这种干扰不多,所以大部分时间是跳过的。需要按键触发的程序,100ms左右不做事情也不是什么大事。

但真要求严格了,比如说每50ms必须有些事儿要处理,不能有这种干扰,那么就放在中断里,什么中断?原文没讲清楚,应该是时间中断,比如每隔100ms一次。中断里写

if(P1_0 == 0)

{

if(i == 0)

i = 1

else{ 你的代码}

}

else

{

i = 0

}

这样就行了。从初始化到判别,到误判清零都有了,i应该是个全局变量,中断可以访问的,或者是个const的也可以

但是这么做也并不很好,所以更高效的是做一个自己的时间系统,即

中断每1ms一次,有个变量做时间,假设叫做MyTimer,那么中断里

MyTimer ++就可以

然后你判别的程序就写成,

if(p1_1 == 0)

{

if(pressed == 0)

LastTime = MyTimer

else

if(MyTimer - LastTimer >100)

{

your code

}

}

else{

pressed = 0

}

当然你的代码里要处理状态复位,清零,停止判别P1_1等具体事情,而MyTimer-LastTimer也要处理时间反卷等具体细节了。

你问题里的原文不用看了,有诸多问题。而我写的这个是多年经验总结实践而来。虽然写的简单,原理是相当正确的。你可以参考

时间触发嵌入式系统设计模式 一书,里面针对这种问题讲的非常深入。作者是Pont Michael J.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11853719.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存