从单片机基础到程序框架(全集 2019pdf版).pdf - 第405页

{ Su8Lock= 0; //关闭声音后 ,及时解锁, 为下一次触发 做准备 BeepClose( ); //关闭声音, 此处封装成函 数,为了今后 代码的移植性 。 } } } }

100%1 / 836
}
void PeripheralInitial(void)
{
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=BEEP_TIME; //“应用层”只需赋值,一上电,蜂鸣器发出 1000ms 长度的声音
vGu8BeepTimerFlag=1;
}
//蜂鸣器发声
void BeepOpen(void)
{
P3_4=0; //0 代表发声
}
//蜂鸣器关闭
void BeepClose(void)
{
P3_4=1; //1 代表关闭
}
//蜂鸣器的驱动函数,放在定时中断函数里每定 1ms 扫描一次。
void VoiceScan(void)
{
//Su8Lock 的作用是避免 BeepOpen()被重复扫描影响效率,发声时只执行一次此函数即可
//同时,也巧妙借用 else 结构,实现逻辑顺序分解成“先发声,下一次再开始定时”的两个步骤
static unsigned char Su8Lock=0;
if(1==vGu8BeepTimerFlag&&vGu16BeepTimerCnt>0)
{
if(0==Su8Lock)
{
Su8Lock=1; //进入触发声音后就自锁起
BeepOpen(); //发声,此处封装成函数,为了今后代码的移植性。
}
else //巧妙借用 else 结构,实现先发声,下一次中断再开始计时的逻辑顺序。比如,
{ //如果赋值 1,就能确保有 1ms 的计时发声。
vGu16BeepTimerCnt--; //定时器自减,控制蜂鸣器发声的时间长
if(0==vGu16BeepTimerCnt)
{
Su8Lock=0; //关闭声音后,及时解锁,为下一次触发做准备
BeepClose(); //关闭声音,此处封装成函数,为了今后代码的移植性
}
}
}
}
第九十二节: 独立按键的四大要素(自锁,消抖,非阻塞,清零式滤波)
【92.1 独立按键的硬件电路简介。
上图 92.1.1 独立按键电路
按键有两种驱动方式,一种是独立按键,一种是矩阵按键。1 个独立按键要占 1 IO 口,IO 不能
共用。而矩阵按键的 IO 口是分时片选复用的,用少量的 IO 口就可以驱动翻倍级别的按键数量。比如,用 8
IO 口只能驱动 8 个独立按键,但是却可以驱动 16 个矩阵按键(4x4)因此,按键少的时候就用独立按键,
按键多的时候就用矩阵按键。这两种按键的驱动本质是一样的,都是靠识别输入信号的下降沿(或上升沿)
来识别按键的触发。
独立按键的硬件原理基础,如上图,P2.2 IO 口,在按键 K1 没有被按下的时候,P2.2 口因为单
机内部自带上拉电阻把电平拉高,此 P2.2 是高电平的输入状态。当按 K1 按下的时候,按 K1
右像一根导线连接到电源的负极(GND)直接把原来 P2.2 口的电平拉低,此时 P2.2 口变成了低电平的输入
状态。编写按键驱动程序,就是要识别这个电平从高到低的过程,这个过程也叫下降沿。多说一句,51 单片
机的 P1,P2,P3 口是内部自带上拉电阻的,而 P0 口是内部没有上拉电阻的,需要外接上拉电阻。除此之外
很多单片机内部其实都没有上拉电阻的,因此,建议大家在做独立按键电路的时候,养成一个习惯,凡是按
键输入状态都外接上拉电阻。
识别按键的下降沿触发有四大要素:自锁,消抖,非阻塞,清零式滤波。
“自锁”按键一旦进入到低电平,就要“自锁”起来,避免不断触发按键,只有当按键被松开变成高
电平的时候,才及时“解锁”为下一次触发做准备。
“消抖”按键是一个机械触点器件,在接触的瞬间必然存在微观上的机械抖动,反馈到电平的瞬间就
是“高,低,高,低...”这种不稳定的电平状态是一种干扰,但是,按键一旦按下去稳定了之后,这种状
态就消失,电平就一直保持稳定的低电平。消抖的本质就是滤波,要把这种接触的瞬间抖动过滤掉,避免按
键的“一按多触发”
“非阻塞,在处理消抖的时候,必须用到延时,如果此时用阻塞的 delay 时就会影响其它任务的运
行效率,因此,用非阻塞的定时延时更加有优越性。
“清零式滤波”在消抖的时候,有两种境界,第一种境界是判断两次电平的状态,中间插入固定
时间”延时,这种方法前后一共判断了两次,第一次是识别到低电平就进入延时的状态第二次是延时后再
确认一次是否继续是低电平的状态,这种方法的不足是,固定的时间”全凭经验值,但是不同的按键它
的抖动时间长度是不同的,除此之外,前后才判断了两次在软件的抗干扰能力上也弱了很多,“密码等级”
不够高。第二种境界就是“清零式滤波”“清零式滤波”非常巧妙,抗扰能力超强,它能自动过滤不同按键
的“抖动时间,然后再进入一个“稳定时间”的“N 次识别判断”,更加巧妙的是,在“抖动时间”和“稳
定时间”两者时间内,只要发现一次是高电平的干扰就马上自动清零计时器重新开始计时。“稳定时间”
一般取 20ms 30ms 之间,“抖动时间”是隐藏的,在代码上并没有直接描写出来但是却无形地融入了
代码之中,只有慢慢体会才能发现它的存在。
具体的代码如下,实现的功能是按一次 K1 或者 K2 按键,就触发一次蜂鸣器鸣叫。