萌新的51之旅——蜂鸣器和矩阵键盘

随着我们学习的深入,我们会接触到更多的开发板上的实用元件,本次我学习和分享的是蜂鸣器和矩阵键盘的简单原理和操作,并且我们可以使用这些元件进一步的做一些更加有趣的开发,以便于满足我们对于单片机的兴趣和好奇心。并且能够支撑着我们不断地学习下去。学习是一个不间断的过程,坚持下去才是胜利的基础。
我们先来学习一下蜂鸣器,其实经过我这一段时间的学习,我们可以很清晰的了解到单片机控制的元件的本质原理,就是我们根据这高低电平的信息,在时间的框架之下,利用单片机快速运行的特点,逐步的完成我们想要进行的控制。
蜂鸣器大致上分为两类,有源蜂鸣器和无源蜂鸣器,其中有源蜂鸣器可以直接通过电流进行控制,而无源蜂鸣器则是需要有一个电流的变化来使其发声,也就是输入一个脉冲,我们主要来介绍无源蜂鸣器的使用操作,其中无源蜂鸣器需要用到一个芯片ULN2003,是一个高耐压,大电流的达林顿陈列,由七个硅NPN达林顿管组成。而且是大电流驱动的陈列,多用于单片机,智能仪表,PLC数字量输出卡等控制电路中,可以直接驱动蜂鸣器,继电器等,负载具有电流放大的作用。说了这么多,从根本上来说,我们之所以接这个芯片,就是为了能使控制电流达到驱动蜂鸣器所需要的功耗,因为我们都知道,单片机的端口输出的电流其实是很小的,一些元件只依靠单片机所提供的电流是无法运行和工作的,而ULN2003可以最大形成50V的大电压,可以完全满足驱动元件的要求。
现在我们要了解关于蜂鸣器运行的控制了,我们先来看一段代码,这段代码过后相信大家就会了解如何控制蜂鸣器了。
#include <reg52.h>
#include<intrins.h> //因为要用到左右移函数,所以加入这个头文件
#define uint unsigned int
#define uchar unsigned char
void delay(uint i);
sbit beep=P2^5;
void main()
{
while(1)
{
beep=~beep;
delay(150);

}
}

void delay(uint i)
{
while (i–);
}
这个程序看起来相对比较简单,我们先来看看程序的内容。
首先我们进行了位定义,将蜂鸣器的控制脚P25定义为Beep。
然后我们就开始了我们的主函数,刚刚说到我们这是一个无源的蜂鸣器,所以我们要对它输入一个电流的脉冲,这样我们才能够使其发声。先设定一个while死循环,在循环里不断的让beep端的电位不断的来回翻转,这样就可以得到一个脉冲,当然,为了控制频率,我们调用delay的延时函数,对它进行延时,之所以进行延时是因为声波的形成也是需要一定频率的震动产生的,通过调整延时的时间,我们就能够得到振动的频率,从而就能够发出不同的声音,这样如果有兴趣,我们还可以把一首歌编写成这样的频率使他唱歌。
萌新的51之旅——蜂鸣器和矩阵键盘
萌新的51之旅——蜂鸣器和矩阵键盘
介绍完简单的蜂鸣器,我们再来介绍矩阵键盘,之所以将二者放在一起介绍,是因为其实二者在动态方面的控制上有着异曲同工之妙。
在正式介绍之前,我们要先对频率有一个正确的理解,蜂鸣器运用到了单片机的时间框架,而我们的矩阵键盘也是要运用到这个框架,其实,在单片机上,矩阵键盘所控制的按键只能传递一个电流是否接通的信息,就像是在一张网络之中,每一个交叉点都是一个按键的所在地,而这些网络上都通着电,只要按下任意一个按键,电线的端口就能够根据相应的电位的变化确定是哪个按键发生了变化,从而我们只要对每个按键的意义进行设定,我们就能够简单的使用按键对单片机传递我们要它执行的操作,从而实现了通过外部按键对于单片机的控制。
如下图,就是矩阵按键的原理,比如我们的4x4的按键,我们不可能直接仅仅通过每条线上的电位直接就判断出来我们究竟是在对哪个按键进行的操作,我们只能采用就好像是数学上的控制变量法,定一移一的进行操作,这也就是在短时间下的对按键进行的动态扫描。每次只控制一行直接扫描出全部的信息。
我们先来看一个程序吧,看完以后相信大家都会有比较深刻的理解了。
这个程序的实践目的就是按住相应的按键,数码管可以显示相应的按键对应的编号,按16进制来说就是从0~F。
萌新的51之旅——蜂鸣器和矩阵键盘
萌新的51之旅——蜂鸣器和矩阵键盘

萌新的51之旅——蜂鸣器和矩阵键盘
萌新的51之旅——蜂鸣器和矩阵键盘
具体的信息在图片中已经基本完善的表示了出来,我们在这里把编程的思路解释一下,我们按照行和列一次对矩阵键盘进行检测,刚开始对列检测,先对列全部赋值为0,也就是输入低电平,当按键按下之后,我们就能够在端口处检测到是哪一列的按键按下了,同理,我们对行也进行这样的操作就能够确定准确的按下的按键了。当然,我们在这个函数中也添加了一个消抖的函数,是因为开发板的震动啊,按下的瞬间啊,都会产生一定的电位的抖动不稳定的效果,我们要针对这一情况进行一个相对准确的判断条件,这样我们就是针对于抖动的部分进行了消抖,从而能够使判断会更加的准确无误。然后我们根据判断所得出的行和列的信息进行确定,来控制数码管的示数以达到一一对应的效果,这个程序就完成了。
从这些来看,我们就基本上掌握了基本的操作,我们还可以按照理论用现有的知识和其他的联系在一起,这样我们就能够更加细致准确的了解和处理问题了。好了我们下期再见!