使用STM32控制无源蜂鸣器发声播放音乐

【注:学习STM32总结做的笔记,大神勿喷。有不足之处还望不吝赐教。
-----本篇大部分转载而来,有侵权请联系作者,谢谢。】
原博客地址:
https://blog.csdn.net/fanxp66/article/details/80264700
https://blog.csdn.net/SNEZ_H/article/details/71172010

一、无源蜂鸣器和有源蜂鸣器
有源蜂鸣器内含振荡源,只要一通电就发声,但发生频率固定,音色单一;无源蜂鸣器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出一定频率的信号才能发声。
人耳能听到的频率范围在20Hz–20kHz之间,通过STM32的GPIO引脚快速切换高低电平输出就能实现无源蜂鸣器的发声,切换的频率不同,发出的音调就不一样。

二、音乐播放的实现
一段音乐就是不同频率的声音按一定的时间节拍转换发出。所以音乐包含音调和节拍信息。

程序中首先准备音频数据表:

// 低Si Do Re Mi Fa So La Si ¸高Do¸高Re¸高Mi¸高Fa¸高So 无
uc16 tone[] ={247,262,294,330,349,392,440,294,523, 587, 659, 698, 784, 1000};
u8 music[]={ 5,5,6,8,7,6,5,6,13,13,……};//音调
u8 time[] = { 2,4,2,2,2,2,2,8,4, 4, ……}; //节拍时间
依次从音调数组中取music[i],然后根据music[i]的值在tone数组中得到该音的发声频率(tone[music[i]]),调用sound函数控制蜂鸣器发声,声音的发声时间有time数组控制。

如果我们能够控制好频率和节拍,那就有可能演奏出动听的音乐。因此,我们首先需要搞清楚各音调的频率,具体见下表(分别为低音、中音和高音):

我们知道了音调的频率后,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。

从简谱看,该音乐是C调的,这里的各音符对应的频率对应的是上表中C调的部分。另外,该音乐为四分之三拍,每个对应为1拍。(我们知道,音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,)几个特殊音符说明如下:
第一,普通音符。如第一个音符5,对应频率393,占1拍。
第二,带下划线音符,表示0.5拍;两个下划线是四分之一拍(0.25)。
第三,有的音符后带一个点,表示多加0.5拍,即1+0.5。
第四,有的音符后带一个“—”,表示多加1拍,即1+1。
第五,有的两个连续的音符上面带弧线,表示连音,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,其实不做处理,影响也不大。

** 注:因为我不会看乐谱,编的并不怎么样,所以。。。如果要改成别的歌曲,改时间和音调就可以了。**

源码地带:
beep.c

#include "beep.h"
#include "delay.h"int melody[] = {50, 50, 50, 50, 200, 200, 200, 400, 400, 500, 500, 500};void BEEP_Init(void)
{ GPIO_InitTypeDef  GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_11);// GPIO_SetBits(GPIOA,GPIO_Pin_11);
}void Sound(u16 frq)
{u32 time;if(frq != 1000){time = 500000/((u32)frq);BEEP = 1;delay_us(time);BEEP = 0;delay_us(time);}elsedelay_us(1000);
}
void Sound2(u16 time)
{BEEP = 1;delay_ms(time);BEEP = 0;delay_ms(time);
}void play_successful(void)
{int id=0;for(id = 0 ;id < 12 ;id++){Sound2(melody[id]);}
}
void play_failed(void)
{int id=0;for(id = 11 ;id >=0 ;id--){Sound2(melody[id]);}
}
void play_music(void)
{
//红海情歌
//    uc16 tone[] = {247,262,294,330,349,392,440,294,523,587,659,698,784,1000};
//    u8 music[]={5,5,6,8,7,6,5,6,13,13,5,5,6,8,7,6,5,3,13,13,2,2,3,5,3,5,6,3,2,1,6,6,5,6,5,3,6,5,13,13,
//                  5,5,6,8,7,6,5,6,13,13,5,5,6,8,7,6,5,3,13,13,2,2,3,5,3,5,6,3,2,1,6,6,5,6,5,3,6,1,
//              13,8,9,10,10,9,8,10,9,8,6,13,6,8,9,9,8,6,9,8,6,5,13,2,3,5,5,3,5,5,6,8,7,6,6,10,9,9,8,6,5,6,8  };
//    u8 time[] = {2,4,2,2,2,2,2,8,4, 4,2,4,2,2,2,2,2,8,4, 4, 2,4,2,4,2,2,4,2,2,8,2,4,2,2,2,2,2,8,4 ,4,
//                2,4,2,2,2,2,2,8,4, 4,2,4,2,2,2,2,2,8,4,4,2,4,2,4,2,2,4,2,2,8,2,4,2,2,2,2,2,8,
//                4,2,2,2,4,2,2,2,2,2,8,4,2,2,2,4,2,2,2,2,2,8,4,2,2,2,4,2,2,5,2,6,2,4,2,2,2,4,2,4,2,2,12  };/*************************************************************************************************************************///生日快乐    // 0   1   2   3   4   5   6   7  低1  低2 低3 低4 低5 低6低7uc16 tone[] ={250,262,294,330,350,393,441,495,525,589,661,700,786,882,990}; //音调        u8 music[]={5,5,6,5,8,7,5,5,6,5,9,8,5,5,12,10,8,7,6,11,11,10,8,9,8,5,5,8,5,5,12,10,8,7,6,11,11,10,8,9,8    //乐谱音调};     u8 time[] = {1,2,2,2,2,4,1,2,2,2,2,4,1,2,2,2,1,4,4,1,2,2,2,2,4,1,2,4,1,2,2,2,1,4, 4,1,2,2,2,2,4,4        //节拍时间}; u32 yanshi;u16 i,e;yanshi = 10;for(i=0;i<sizeof(music)/sizeof(music[0]);i++){for(e=0;e<((u16)time[i])*tone[music[i]]/yanshi;e++){Sound((u32)tone[music[i]]);}    }
}

beep.h

#ifndef __BEEP_H
#define __BEEP_H
#include "sys.h"#define BEEP PAout(11)  void BEEP_Init(void);
void Sound(u16 frq);
void Sound2(u16 time);
void play_music(void);
void play_successful(void);
void play_failed(void);#endif

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include "led.h"
#include "beep.h" int main(void){    delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     KEY_Init(); LED_Init(); BEEP_Init(); while(1){                play_music();        }
}

文件源码下载链接:https://download.csdn.net/download/qq_28056277/10853285

https://download.csdn.net/download/qq_28056277/11429148
(考虑到积分越下载越贵的问题,就再上传了一次)
转载总结文章,若有侵权,请联系作者删除,谢谢。

STM32 使用STM32F103控制无源蜂鸣器发声播放音乐相关推荐

  1. stm32无源蜂鸣器定时器_使用STM32控制无源蜂鸣器发声播放音乐

    [实例简介] 利用GPIO控制无源蜂鸣器发声,播放音乐.使用SysTick延时,使用位带操作寻址IO口引脚. [实例截图] [核心代码] pMusic ├── CMSIS │   ├── core_c ...

  2. arduino无源蜂鸣器歌曲编码_Arduino加无源蜂鸣器,播放音乐《葫芦娃》

    Arduino加无源蜂鸣器,播放音乐<葫芦娃> #define NOTE_D0 -1 #define NOTE_D1 294 #define NOTE_D2 330 #define NOT ...

  3. 无源蜂鸣器与播放音乐(总结)

    原作者链接:http://blog.sina.com.cn/s/blog_bf63e2650102wibs.html 如若侵犯原作者,请及时联系本人,本人立刻删除 单片机产生音乐的原理:        ...

  4. Arduino ESP32通过PWM控制无源蜂鸣器

    Arduino ESP32通过PWM控制无源蜂鸣器 相关篇<ESP32在Arduino开发环境中的PWM的使用方法> ESP32通过PWM控制无源蜂鸣器发出声音. 有源和无源蜂鸣器知识科普 ...

  5. stm32无源蜂鸣器定时器_stm32实现无源蜂鸣器发声

    蜂鸣器是一种发声设备,被广泛用于计算机.打印机.复印机.报警器.电子玩具等.蜂鸣器分为有源蜂鸣器和无源蜂鸣器.那么什么是有源,什么是无源呢?这里的"源"指的是,振荡电路.也就是说, ...

  6. STM32单片机开发之让蜂鸣器发声

    本篇文章依旧是按照之前的stm32f10x系列单片机进行开发,但博主会教大家如何去看电路原理图以及如何去看开发手册,并且本系列文章不使用stm32提供的库函数,完全从0开始编写,这样能带大家更好的认识 ...

  7. 实验九:按键控制无源蜂鸣器演奏《生日快乐》

    OK,今天周末,感觉想写一个blog 同时,我觉得只是一个简单的小实验,好像效果并不好,就做得稍微复杂了一些 功能: 按键按下:蜂鸣器开始演奏<生日快乐> 按键再按下:蜂鸣器停止 再按下又 ...

  8. c语言树莓派音乐播放器,使用web端来控制我的树莓派播放音乐

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? web端控制树莓派播放音乐,PHP+NodeJS+mpg123,粗糙版.实现后还可以做个app什么的. 代码 git 用 ...

  9. Arduino按键控制MP3模块随机播放音乐(YX5300 MP3音乐模块)

    设计者:STCode (公众号同名) 1)功能描述 这个设计主要是通过按键来控制播放音乐,主要涉及到的内容有按键和YX5300 MP3音乐模块的使用,通过按压按键来达到随机播放音乐曲目的目的. 2)使 ...

最新文章

  1. C#中方法参数的四种类型
  2. Struts 2中#、%和$符号的相应用途
  3. html 屏蔽蓝色电话,html – 在Chrome扩展程序中停用文字字段蓝色突出显示?
  4. 内核隐藏进程(源码)
  5. 13、Spring Boot 2.x 多数据源配置
  6. mysql in优化_MySQL的一次优化记录 (IN子查询和索引优化)
  7. html奇淫技巧 2 教你如何进行图文环绕布局 原创
  8. eleTree树形插件引入
  9. Web前端开发所用的调试工具
  10. 细说BLUETOOTH 5 【4X 远距离】
  11. SQL基础知识总结二
  12. 系统引导过程总体介绍
  13. Atitit.spring体系结构大总结 1. Spel表达式解析 1 2. Srping mvc 1 3. Ioc 4 3.1. ApplicationContext在BeanFactory的基础
  14. 【学习笔记】堆的定义及其建立、排序等基本操作的实现
  15. 004--MySql数据库的淘宝商城数据库设计
  16. Hdu--5064(DP)
  17. 绘制业务流程图—入门篇
  18. 地震应急综合解决方案
  19. ARC093 F - Dark Horse
  20. iOS-APP-运行时防Crash工具XXShield练就

热门文章

  1. ESP32和ESP8266使用W5100和W5500以太网模块
  2. w5100网络扩展板故障排查记录
  3. 解决CentOS被wbew挖矿程序入侵的方法
  4. 厚物科技《如何实现PXIe/PXI机箱的散热设计》
  5. 声纹识别与声源定位(二)
  6. 开弓没有回头箭——我的程序员之路
  7. MacOS Homebrew使用文档
  8. 六年级计算机课学什么意思,六年级信息技术上册《第一单元第2课与计算机交朋友》教案及教学反思...
  9. Snipaste专业截屏贴图 标注取色工具 一个比QQ截图好用一万倍的截图神器!
  10. PS学习记录111111--如何在PS中创建一个干净的网页布局