1.延时函数
在51单片机中,Delay延时函数是一个非常实用且常用的函数,可以用来防止按键抖动,也可以完成多种需要等待时间进行的操作。
由于不同单片机的系统频率与指令集各不相同,我们可以使用STC-ISP自动生成对应的延时函数,下面是由STC-ISP生成的一个系统频率为11.0592MHz,指令集为STC-Y1的1000μs延时函数。
1 | void Delay1000us() //@11.0592MHz |
其中,_nop_();
语句包含在头文件intrins.h中,需要#include <intrins.h>。
基于此,稍加改进后,就可以得到指定延迟xms的延时函数了。
1 | void Delay(int xms) //@11.0592MHz |
2.按键消抖
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
延时函数与按键消抖/1-1.png)
通常而言,持续按住按键20ms即可稳定接通,因此在我们判断一个按键是否被按下(包含复原的过程)时需要先延时20ms,然后再用用while循环判断是否处于按下状态,如果仍处于按下状态则阻塞,直到用户将按钮松开。
示例代码如下,用于判断P3_0是否被按下一次:
1 | if(P3_0==0){ |
需要注意的是,在C语言中,sfr与sbit只是“别名”,不是变量定义,因此无法作为参数传入函数中,也就无法构建所谓的“消抖函数”,下面是错误的代码示例:
1 | void RemoveJitter(sbit key) |