利用蜂鸣器演奏简单的乐谱

描述

那么,今天分享的是利用蜂鸣器来演奏一些简单的乐谱。

实验平台为stm32,当然51也完全可以做,其核心思想是相似的。

首先是对蜂鸣器的介绍。蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。

蜂鸣器包括有源蜂鸣器和无源蜂鸣器,有源蜂鸣器只要通上电就可以发声,而无源蜂鸣器需要有一定频率的脉冲才能发声。

有源蜂鸣器

有源蜂鸣器

上图为无源蜂鸣器电路,下图为有源蜂鸣器电路。因为单片机的输出电流很小,不能直接驱动蜂鸣器,所以用了三极管来放大电流。在上边的电路中,当输入高电平时,三极管导通,电流可以由3.3V电源流向蜂鸣器,当输入低电平时,三极管截止,蜂鸣器与GND相连。通过单片机管脚输出一段脉冲,即可让蜂鸣器发声。在下边的电路中,只要输入为低电平,三极管导通,蜂鸣器就可以发声。

那么,蜂鸣器发出的声音大小、音调高低和什么有关呢?声音大小和输入脉冲的占空比有关,占空比越大,声音越大,而音调的高低和脉冲频率有关,频率越高,音调也就越高,通常让输出频率为1.5~5kHZ。

接下来讲解具体如何实现让蜂鸣器演奏乐谱。

首先得对音乐简谱有一定了解。本人对音乐简谱也并不算很了解,如果要深入了解,请自行百度搜索。下面是我的一些粗略见解。

有源蜂鸣器

一首曲子包含音调和节拍。音调也就是平常我们说的音调,比如1,2,3,4,5,6,7。音调越来越高,音调还包括低音、中音、高音。而节拍就是一个调子唱多久,有的音拖的长一些,有的音就比较短。这两个要素是今天编程的核心。

首先说音调,前面讲到,音调的高低是和脉冲的频率有关系的,这个关系已经有人将它做成了表格,下面截取一部分:

有源蜂鸣器

频率与周期成倒数,在一个脉冲里面,让一半为高电平,一半为低电平,而脉冲周期可以通过延时函数来确定,于是,编写频率发生函数。

while(1)
    {
            beep=!beep;
            led1=0;
            delay_us(music[k]);
    }

其中在delay_us()这个函数里的输入参数就可以根据乐谱然后查表得到,就是上面的半周期。 由于这个参数是随着乐谱变化的,因此,我们可以把乐谱转化之后的数据放到一个数组里面,持续地调用数组里的数据。

这样,音调就解决了。 接下来解决节拍的问题。 其实要解决节拍的问题,无非就是要考虑music[k]多久刷新一次。 我们可以想象一下,如果music[k]是每隔固定的一段时间跳到下一个,那么造成的后果就是两个音调之间的时间是一样的,这样听起来肯定是非常怪的。 假设music[k]刷新的特别快,beep刚好发生一次翻转,music[k]就发生了改变,这样也是不行的,因为如果刷新这么快的话,它连一个完整的脉冲周期都没有走完。 因此,music[k]应该要刷新慢一些,并且是随着乐谱改变的。 刷新的慢,听起来就会比较舒缓而已。

所以,我们可以采用定时器中断来实现。 每次发生中断,就让数组里的数据跳到下一个,实现数据的刷新,同时,改变定时器装载值,让每次发生中断所需的时间不一样,这个时间就是由乐谱的节拍决定的。

实现函数

void TIM4_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM4,TIM_IT_Update))
    {

        if(k

这样也就完美解决了节拍的问题。 解决了这两个问题,理论上我们可以把任何一首简谱转化为频率(周期)和节拍(间隔时间)这两个量,然后用数组保存好,这样就可以通过蜂鸣器演奏出来了,当然,这需要花费很多的时间和精力,而且对于很多人来说,并不是很容易看懂简谱。

于是,有了一款软件可以比较方便的获取这些数据,软件截图如下

有源蜂鸣器

曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important)

音高由三位数字组成:

个位是表示 1~7 这七个音符

十位是表示音符所在的音区:1-低音,2-中音,3-高音;

百位表示这个音符是否要升半音: 0-不升,1-升半音。

音长最多由三位数字组成:

个位表示音符的时值,其对应关系是:

|数值(n): |0 |1 |2 |3 | 4 | 5 | 6

|几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n

十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音

百位是符点位: 0-无符点,1-有符点

调用演奏子程序的格式

Play(乐曲名,调号,升降八度,演奏速度);

|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;

|调号(0-11) :是指乐曲升多少个半音演奏;

|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;

|演奏速度(1-12000):值越大速度越快;

这款软件提取的信息比较丰富,如果要求不高的话,只要能够大概使用一下就好。比如它生成的音高,如果我们只是用来延时的话,那么只要把它扩大或者缩小一定倍数,使它落在频率(周期)区间(前面讲到是1.5~5kHZ,换算成半周期就是100us~500us左右),这样就可以比较简单的利用了。

总结:用蜂鸣器演奏乐曲,主要是要把握住两个核心。 一个是音调 ,这个通过改变脉冲频率来实现,其实就是通过精确延时来改变脉冲周期。 另一个是节拍 ,节拍可以简单理解为两个音调之间的时间间隔,要控制不同的节拍,其实就是隔多长的时间去刷新前面的音调,那么可以通过定时器中断来实现,定时的时间就是节拍长度,一旦发生中断,就刷新前面的音调,同时,给定时器装载一个新的值。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分