单片机定时器在按键消抖和键音输出中的应用

2019-04-26 05:03徐连喜
电子技术与软件工程 2019年4期
关键词:实时控制数码管子程序

文/徐连喜

键盘输入和键音输出是单片机系统中人机对话的常见部分。一般情况下,按键按下时易产生抖动干扰,进而使系统误动作,程序员处理此问题时通常会在检测到有键被按下时,加入一个延时,延时过后再检测同一按键是否仍处于被按状态?若是,就判定此键确实被按下,接着就开始执行此键的功能;若不是,就判定为干扰,并忽略延时前的检测结果。通常情况下,两次检测之间所加入的延时需要约100mS才能达到比较理想的消抖效果,而CPU是依用户程序从头到尾扫描执行程序代码,如果在长达100mS的时间里,CPU仅仅完成一次延时的功能,那么此时段内其它任务都将被搁置,这对于那些实时控制要求较高的场所(例如数码管动态扫描显示)是绝对不允许的。基于实时控制所遇到的另外一个问题就是键音输出问题,当CPU判定某个键被按下时,通过某个IO端口输出键音,用户就会有更加贴切的人机对话体验,要让人清晰地听到清脆的键音,声音的频率一般控制在1KHz左右,而且时间不能太短,约100mS较适宜,依照前述的用户程序的运行规则,此时若用常规的IO端口取反、延时、再取反来输出键音,显然不能满足用户程序的实时控制要求。为此,本文详述了新的思路,巧妙地利用2个定时器分别去控制按键消抖和键音输出,经实物验证,CPU不仅能轻松处理按键消抖和键音输出,同时还能完成数码管的动态扫描及各个IO端口的实时控制,取得了理想的控制效果。

1 单片机应用系统硬件框图

如图1所示。

2 键盘输入硬件电路

如图2所示。

键盘硬件电路,采用4X4矩阵键盘,用8个I/O口就能得到16个键值,可实现0~9共十个数字键输入和A~F共六个功能键输入。

3 键音输出硬件电路

图1:单片机应用系统硬件框图

图2:键盘输入硬件电路

图3:键音输出硬件电路

如图3所示。

键音的发声器件BZ1采用线圈蜂鸣器,这样可使得发声器件的体积小,声音清脆。驱动器件由限流电阻、续流二极管、开关驱动管等部分组成。 R6、R18与Q2组成简单的开关驱动电路,为CPU有力推动BZ1提供动力,R18是快速关断电阻,可使CPU由低电平转高电平时快速关断Q2,避免了Q2因关断不及时而产生意想不到的杂音。D3作为续流二极管,避免在Q2关断瞬间由BZ1线圈产生的负高压损伤Q2,电阻R7既可以调节音量大小,也可以起到限流作用(当Q2导通时)。

4 矩阵键盘扫描及其消抖和键音的软件设计

如图4、5、6所示。

键盘功能由“矩阵键盘扫描子程序”和“按键消抖(T0中断)子程序”和“键音(T1中断)子程序”完成。按键消抖对系统可靠运行至关重要,如果仅仅用普通的延时消抖,延时时间短了起不到消抖作用,延时时间长了又会影响CPU的实时控制功能,特别是当应用系统配有数码管动态扫描显示时,消抖延时时间长了就会使周期内的数码管动态显示时间缩短而变暗,严重影响数码管显示效果,为此,系统采用T0中断方式延时消抖,消抖“开中断”命令是被巧妙地安插在按键消抖子程序里,一旦有键被按,键扫描程序必定调用按键消抖子程序,于是开T0中断,进入T0中断后立即关闭键扫描100mS,这100mS期间CPU只扫描数码管及其它IO端口而不扫描键盘,从而保证了消抖期间数码管亮度不受影响。消抖延时结束后恢复键盘扫描。同消抖延时一样,也是缘于键音对数码管显示及对其它IO端口实时控制的影响,为此,系统采用T1中断方式处理键音,键音中断的“开中断”命令是被巧妙地安插在按键消抖子程序里,一旦有键被按,键扫描程序必定调用按键消抖子程序,从而开启键音中断,键音频率由T1的初值决定,键音时长则由中断次数决定。键音中断子程序完成“BZ1通电与断电切换”和“切换401次(102mS)后关闭中断”,以及“关闭中断期间CPU驱动脚锁高电平”功能。

图4:矩阵键盘扫描子程序

图5:按键消抖(T0中断)子程序

图6:键音(T1中断)子程序

5 结论

古老的8051单片机有T0和T1两个定时器,若主程序有键盘输入但不需用到T0和T1,则也可以用此办法来解决消抖和键音问题;若主程序有时钟或秒脉冲计时需求,也可以由外部扩展时钟IC(例如DS1302或DS3231),利用时钟IC的秒脉冲触发CPU的外部中断来引入秒脉冲计时。

加强型的STC系列单片机一般都有3个及以上数量的定时器,随便拿其中的两个定时器来处理消抖和键音问题,其余的定时器留给主程序使用。

总之,只要主程序有键盘输入和键音输出需求,只要能腾出两个定时器,利用本文的方案就能完美解决消抖和键音问题,进而安心地处理数码管动态扫描显示及其它IO端口的实时控制。

猜你喜欢
实时控制数码管子程序
Arduino编程
MC9S08FL16单片机数码管静态显示分析
单片机控制的四位数码管动态显示编程
基于Qt的数码管数字编码系统的设计与实现
探讨ERP系统环境下企业会计的实时控制
空间机器人的计算力矩实时控制方法
子程序在数控车加工槽中的应用探索
简化编程与子程序嵌套的应用