矩阵式键盘的按键判别方法通常选用“行扫描法”,即逐行或者逐列扫描查询,在这里主要对按键进行逐行扫描[4]。
(1) 确定是否有按键按下。先将按键所在的行线电平置为0,然后检测所有列线连接单片机的I/O口的电平的状态。如果所有的列线均为高电平,则说明没有按键按下,如果其中某一列为低电平,则说明有键按下,且该按键所在的位置处于低电平列线与所有行线交叉的两个按键中的某一个。
(2) 确定具体哪个按键被按下。用行扫描法依次将某行线置为低电平,其他行线置为高电平,然后检测该行所在的各列线的电平状态。如果其中某列线电平为低电平,那么该列线与置低电平的行线交叉的按键就是要找的被按下的按键。
2.4.3 矩阵键盘实现的基本功能
(1) 按键去抖动。按键在按下和松开的过程中都会有短时的抖动。抖动的时间通常与按键的质量有关,一般为5ms~10ms。去抖动可以通过软件延时10ms左右,然后再进行逐行扫描。
(2) 防串键。串键是指同一时间有多个按键按下或者在前一个按键还没有松开又有新的按键按下。为了解决这个问题,常用的办法是N键锁定,只对一个按键进行处理。当有一个或一个以上按键按下时,把检测的最先按下的按键作为有效按键,其间有任何按键按下或者松开均不对其产生影响,在有效按键未松开前,系统只执行一次该按键的功能程序。
(3) 识别被按键。采用行扫描法。 按键位于不同的行线和列线的交叉点上,按键所在行线作为输出端,按键所在列线作为信号输入端,通过读输入端的电平状态就可以确定是否有按键按下。
(4) 获取键码。在内存区中建立一个键盘编码表,对键的行号和列号进行查表译码,确定键值[4]。
2.5 时钟模块设计
时钟信号作为单片机各种操作时间基准,通常有两种方式:内部振荡方式和外部振荡方式。由于内部振荡方式得到的信号比较稳定,所以选择内部振荡。
AT89C51 单片机内部的振荡器由高增益反相放大器构成,输入端为XTAL1 , 输出端为XTAL2 , 在两端跨接石英晶体和电容C1、C2,就可以构成我们需要的稳定的自激振荡器了。振荡脉冲的频率范围为f OSC = 0~24 MHz,在本次设计中采用的是12MHz的晶振,所以振荡信号频率为12MHz,从XTAL2 端输入到片内的时钟发生器上[5]。通常C1 和C2 取30 pF 左右,对频率起到稳定和微调作用,电路如图7所示。
图7 时钟电路
2.6 复位模块设计
复位操作使单片机系统各部件处于确定的初始状态, 并从初始状态开始工作。常见的的有上电复位和按键复位,本系统采用上电复位。AT89C51单片机的复位信号从RST引脚输入,进入到片内的施密特触发器,复位信号高电平有效,有效时间持续24个振荡周期即两个机器周期。其工作原理是在加电瞬间电容通过充电来实现复位操作。电容常取C = 30μF, 电阻R = 1000Ω。如图8所示。
图8 上电复位
2.7 发声模块设计
蜂鸣器作为声音的输出设备,常见的有:有源蜂鸣器和无源蜂鸣器。有源蜂鸣器的内部有振荡电路,加电源后就可以发出声音,缺点是只能发出单一的音调。而电子琴需要发出不同的音调,无源蜂鸣器可以满足。本设计采用无源电磁式蜂鸣器。
无源蜂鸣器的理想信号是方波,交流信号在其内部产生磁通,交变的磁通通过与磁环恒定磁通的叠加,使钼片按照给定的方波信号频率振动并促使共振腔发声[6]。
音频驱动电路通常选用晶体管放大电路,本次设计中选用S8550晶体管,它是一种PNP型硅三极管。当S8550处在放大状态即发射结正偏,集电结反偏,三个电极IE(发射极电流)、IB(基极电流)、IC(集电极电流)在电流上满足: 51单片机八音阶电子琴设计+流程图+程序代码(4):http://www.youerw.com/zidonghua/lunwen_566.html