0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:嵌入式大本营 作者:小小飞飞哥 2023-05-26 16:04 次阅读

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

实验平台为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左右),这样就可以比较简单的利用了。

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

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

    关注

    141

    文章

    3493

    浏览量

    119078
  • 报警器
    +关注

    关注

    12

    文章

    899

    浏览量

    107969
  • 蜂鸣器
    +关注

    关注

    12

    文章

    850

    浏览量

    45300
  • 有源蜂鸣器
    +关注

    关注

    0

    文章

    22

    浏览量

    11436
收藏 人收藏

    评论

    相关推荐

    利用蜂鸣器和单片机演奏简单的音乐电路设计

    利用蜂鸣器和单片机演奏简单的音乐,包含源程序代码。
    发表于 04-03 12:59 1.1w次阅读
    <b class='flag-5'>利用</b><b class='flag-5'>蜂鸣器</b>和单片机<b class='flag-5'>演奏</b><b class='flag-5'>简单</b>的音乐电路设计

    FPGA Verilog HDL 设计实例系列连载--------乐曲演奏

    四分音符。3、乐曲演奏电路的原理框图                  图1.3乐曲演奏电路的原理框图   其中,乐谱产生电路用来控制音乐的音调和音长。控制音调通过设置计数器的预置数来实现,预置
    发表于 03-12 14:16

    结合闹钟与电子音乐演奏的综合项目适合初学者的项目。

    分析、整体与模块的仿真分析三个步骤,使硬件实现了闹钟的显示以及整点报时等功能,其中整点报时采用整体复位、按键选择演奏方式、循环演奏以及数码管显示乐谱的功能。系统能自动从头开始循环播放,也可随时起停、按键
    发表于 12-14 21:38

    各位,问一个问题,用蜂鸣器演奏流行音乐曲子,做成产品卖的话,算侵权吗?

    各位,问一个问题,用蜂鸣器演奏流行音乐曲子,做成产品卖的话,算侵权吗?
    发表于 01-22 11:09

    按键控制无源蜂鸣器发出不同声音来演奏音乐

    cortex-A8用不同按键控制无源蜂鸣器发出不同声音来演奏音乐的程序
    发表于 06-05 21:36

    如何去实现一种基于51单片机的音乐盒设计

    一.硬件方案本设计以51单片机原理和控制理论设计音乐演奏控制器的硬件电路,并利用C语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动蜂鸣器发出不同音调的音乐,再利用
    发表于 11-19 06:07

    通过单片机演奏音乐

    在学完单片机后的扩展实验里有蜂鸣器的音乐实验,简单来说就是一段频率编码,如果熟悉音乐的可以自己写谱给单片机编程由于对音乐一窍不通,这里把学习的代码附上
    发表于 11-30 07:08

    怎样去设计一个基于STC89C52单片机的智能音乐盒

    键盘模块等。本实验主使用蜂鸣器,采用pwm技术使蜂鸣器发出不同音调的声音,再根据乐谱编译出不同的音乐。3.软件设计通过给定时器不同的初值,使时间不同,演奏不同的音符。在此code中编译
    发表于 12-08 06:47

    利用定时器定时翻转蜂鸣器的beep引脚,产生方波使蜂鸣器发生

    利用定时器定时翻转蜂鸣器的beep引脚,产生方波使蜂鸣器发生,所以根据定时器不同的定时产生不同的方波,就可以改变蜂鸣器的音调(与改变led灯亮度类似)。void time0() int
    发表于 01-07 07:59

    如何利用Arduino与蜂鸣器实现音乐的演奏

    如何利用Arduino与蜂鸣器实现音乐的演奏呢?其程序代码该怎样去实现呢?
    发表于 02-14 07:22

    MCU控制蜂鸣器演奏音乐小程序

    程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》 ,拨码开关设置:将BUZZER位拨至ON,其余位拨至OFF,测试说明:聆听蜂鸣器“唱出”的乐曲 ,既然是演奏乐曲对于一个音符应该包括两个
    的头像 发表于 04-20 09:17 6666次阅读

    蜂鸣器音乐程序与最简单蜂鸣器电路图之FPGA学习课程

    是否按下,或者有些功能是否正常等,当然如果足够浪漫,也可以让蜂鸣器演奏音乐。 简单蜂鸣器电路图 本设计使用的是无源蜂鸣器,也可称为声响器,原
    发表于 08-07 10:35 1.9w次阅读
    <b class='flag-5'>蜂鸣器</b>音乐程序与最<b class='flag-5'>简单</b><b class='flag-5'>蜂鸣器</b>电路图之FPGA学习课程

    如何使用单片机进行蜂鸣器演奏音乐的程序资料免费下载

    本文档的主要内容详细介绍的是如何使用单片机进行蜂鸣器演奏音乐的程序资料免费下载。
    发表于 05-05 08:00 6次下载
    如何使用单片机进行<b class='flag-5'>蜂鸣器</b><b class='flag-5'>演奏</b>音乐的程序资料免费下载

    利用51单片机演奏《猪猪侠》

    利用51单片机演奏《猪猪侠》
    发表于 11-23 16:20 16次下载
    <b class='flag-5'>利用</b>51单片机<b class='flag-5'>演奏</b>《猪猪侠》

    Arduino演奏the truth that you leave

    Arduino演奏the truth that you leave利用Arduino及配套的蜂鸣器等,可以实现音乐的演奏。由于本人水平所限,该视频仅仅截取了原曲的一部分,而且音调有偏差
    发表于 12-14 19:03 1次下载
    Arduino<b class='flag-5'>演奏</b>the truth that you leave