上一次使用了有源蜂鸣器,只能发出固定的”滴滴“声,当然不能满足于此呀。使用无源蜂鸣器,只要输出不同频率的PWM波,即可发出不同的音符。

不同的音符组合起来就是一个曲子了。

改变PWM的音调,可以输出Do re mi fa so la si do这样的7个音符,还可以输出不同音调的Do re mi fa so la si do。

在实例程序里面,我定义了低中高三个音阶。音符的频率则是mbed提供的。已经宏定义好了。

只要改变PWM的输出周期,即可发出不同的音调(频率是周期的倒数)。

为了方便起见,写了一个音阶类(Pitch),虚基类。里面有一个perform函数,参数是音符和持续时间。例如要发出Do这个声音,持续0.5s,只要perform(1,0.5)就好。

还有一个Stop函数,停止响声0.5s则stop(0.5),无参数则直接停止。后面的Low、Mid、High类则是派生类,实现了Pitch的虚函数。

程序里面包括:

1、发出低中高三个声调的Do re mi fa so la si do音。

2、中音版的小星星。

3、低音版的小星星。

#include "mbed.h"

#define NOTE_B0  31

#define NOTE_C1  33

#define NOTE_CS1 35

#define NOTE_D1  37

#define NOTE_DS1 39

#define NOTE_E1  41

#define NOTE_F1  44

#define NOTE_FS1 46

#define NOTE_G1  49

#define NOTE_GS1 52

#define NOTE_A1  55

#define NOTE_AS1 58

#define NOTE_B1  62

#define NOTE_C2  65

#define NOTE_CS2 69

#define NOTE_D2  73

#define NOTE_DS2 78

#define NOTE_E2  82

#define NOTE_F2  87

#define NOTE_FS2 93

#define NOTE_G2  98

#define NOTE_GS2 104

#define NOTE_A2  110

#define NOTE_AS2 117

#define NOTE_B2  123

#define NOTE_C3  131

#define NOTE_CS3 139

#define NOTE_D3  147

#define NOTE_DS3 156

#define NOTE_E3  165

#define NOTE_F3  175

#define NOTE_FS3 185

#define NOTE_G3  196

#define NOTE_GS3 208

#define NOTE_A3  220

#define NOTE_AS3 233

#define NOTE_B3  247

#define NOTE_C4  262

#define NOTE_CS4 277

#define NOTE_D4  294

#define NOTE_DS4 311

#define NOTE_E4  330

#define NOTE_F4  349

#define NOTE_FS4 370

#define NOTE_G4  392

#define NOTE_GS4 415

#define NOTE_A4  440

#define NOTE_AS4 466

#define NOTE_B4  494

#define NOTE_C5  523

#define NOTE_CS5 554

#define NOTE_D5  587

#define NOTE_DS5 622

#define NOTE_E5  659

#define NOTE_F5  698

#define NOTE_FS5 740

#define NOTE_G5  784

#define NOTE_GS5 831

#define NOTE_A5  880

#define NOTE_AS5 932

#define NOTE_B5  988

#define NOTE_C6  1047

#define NOTE_CS6 1109

#define NOTE_D6  1175

#define NOTE_DS6 1245

#define NOTE_E6  1319

#define NOTE_F6  1397

#define NOTE_FS6 1480

#define NOTE_G6  1568

#define NOTE_GS6 1661

#define NOTE_A6  1760

#define NOTE_AS6 1865

#define NOTE_B6  1976

#define NOTE_C7  2093

#define NOTE_CS7 2217

#define NOTE_D7  2349

#define NOTE_DS7 2489

#define NOTE_E7  2637

#define NOTE_F7  2794

#define NOTE_FS7 2960

#define NOTE_G7  3136

#define NOTE_GS7 3322

#define NOTE_A7  3520

#define NOTE_AS7 3729

#define NOTE_B7  3951

#define NOTE_C8  4186

#define NOTE_CS8 4435

#define NOTE_D8  4699

#define NOTE_DS8 4978

//7个音符组成了美妙的音乐

//低   Do re mi fa so la si do
int melody[] = { NOTE_C4, NOTE_D4,NOTE_E4, NOTE_F4, NOTE_G4,NOTE_A4,NOTE_B4,NOTE_C5}; //中 Do re mi fa so la si do
int melody2[] = { NOTE_C5, NOTE_D5,NOTE_E5, NOTE_F5, NOTE_G5,NOTE_A5,NOTE_B5,NOTE_C6}; //高
int melody3[] = { NOTE_C6, NOTE_D6,NOTE_E6, NOTE_F6, NOTE_G6,NOTE_A6,NOTE_B6,NOTE_C7}; //PWM输出口
PwmOut m(PB_13); //音调类
class Pitch{ public: virtual void perfrom(int,double)=; void stop(double time = ){ if(time==)
m = ;
else{ m = ;
wait(time); }//end else }//end stop }; class Low:public Pitch{ public:
void perfrom(int index,double time){ m.period_us(/melody[index-]); m.write(0.5); wait(time); } }; class Mid:public Pitch{ public:
void perfrom(int index,double time){ m.period_us(/melody2[index-]); m.write(0.5); wait(time); } }; class Hig:public Pitch{ public:
void perfrom(int index ,double time){ m.period_us(/melody3[index-]); m.write(0.5); wait(time); } }; int main() {
/*试音
for (int thisNote = 0; thisNote < 8; thisNote++) { m.period_us(1000000/melody[thisNote]); m.write(0.5); wait(0.5); } for (int thisNote = 0; thisNote < 8; thisNote++) { m.period_us(1000000/melody2[thisNote]); m.write(0.5); wait(0.5); } for (int thisNote = 0; thisNote < 8; thisNote++) { m.period_us(1000000/melody3[thisNote]); m.write(0.5); wait(0.5); } m = 1;
*/ /*中音版
Mid mid; //11 55 66 5
mid.perfrom(1,0.5);
mid.perfrom(1,0.5);
mid.perfrom(5,0.5);
mid.perfrom(5,0.5);
mid.perfrom(6,0.5);
mid.perfrom(6,0.5);
mid.perfrom(5,0.8);
mid.stop(0.2); //44 33 22 1
mid.perfrom(4,0.5);
mid.perfrom(4,0.5);
mid.perfrom(3,0.5);
mid.perfrom(3,0.5);
mid.perfrom(2,0.5);
mid.perfrom(2,0.5);
mid.perfrom(1,0.5);
mid.stop(0.2); //55 44 33 2
mid.perfrom(5,0.5);
mid.perfrom(5,0.5);
mid.perfrom(4,0.5);
mid.perfrom(4,0.5);
mid.perfrom(3,0.5);
mid.perfrom(3,0.5);
mid.perfrom(2,0.5);
mid.stop(0.2); //55 44 33 2
mid.perfrom(5,0.5);
mid.perfrom(5,0.5);
mid.perfrom(4,0.5);
mid.perfrom(4,0.5);
mid.perfrom(3,0.5);
mid.perfrom(3,0.5);
mid.perfrom(2,0.5);
mid.stop(0.2); //11 55 66 5
mid.perfrom(1,0.5);
mid.perfrom(1,0.5);
mid.perfrom(5,0.5);
mid.perfrom(5,0.5);
mid.perfrom(6,0.5);
mid.perfrom(6,0.5);
mid.perfrom(5,0.5);
mid.stop(0.2); //44 33 22 1
mid.perfrom(4,0.5);
mid.perfrom(4,0.5);
mid.perfrom(3,0.5);
mid.perfrom(3,0.5);
mid.perfrom(2,0.5);
mid.perfrom(2,0.5);
mid.perfrom(1,0.5); mid.stop();
*/ //低音版 Low low; //11 55 66 5
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.8);
low.stop(0.2); //44 33 22 1
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.stop(0.2); //55 44 33 2
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.stop(0.2); //55 44 33 2
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.stop(0.2); //11 55 66 5
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.stop(0.2); //44 33 22 1
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5);
low.perfrom(,0.5); low.stop(); }

蜂鸣器比较刺耳其实,听久了还是很难受。

在代码里面是不能调节音量的,要调低音量,加个电阻就好。最大的音量是无电阻+高电压。

没法录音,所以还是上图。

效果可以上秒拍听一下:http://video.weibo.com/show?fid=1034:aee9c2288407e28eca7eb89d5ecc8a1d

STM32使用无源蜂鸣器演奏歌曲的更多相关文章

  1. 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)

    l  STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l  STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l  编程使用STM32 HAL库 l  IIC OLED界面编程,动画实 ...

  2. 详解树莓派Model B+控制蜂鸣器演奏乐曲

    步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...

  3. verilog实验1:基于FPGA蜂鸣器演奏乐曲并数码管显示

    一.实验任务 利用FPGA进行代码开发,使蜂鸣器演奏出乐曲<生日快乐>,将音调显示在数码管.原理为蜂鸣器为交流源蜂鸣器,在引脚上加一定频率的方波就可以发声,而且发声的频率由所加方波决定.这 ...

  4. STM32开发指南-蜂鸣器实验

    另一种I/O作为输出的应用,利用一个I/O来控制板载的有源蜂鸣器,实现蜂鸣器控制. PS:有源蜂鸣器自带了震荡电路,一通电就会发声:无源蜂鸣器则没有自带震荡电路,必须外部提供2~5Khz左右的方波驱动 ...

  5. Arduino入门笔记(4):用蜂鸣器演奏音乐并配有LED闪烁

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 https://item.taoba ...

  6. 嵌入式02 STM32 实验05 蜂鸣器

    蜂鸣器:是一种一体化结构的电子讯响器.主要分为分压式蜂鸣器和电磁式蜂鸣器两种类型. 一.有源/无源蜂鸣器(不是指是否带电源,而是有没有自带震荡电路) 1.有源蜂鸣器:有源蜂鸣器自带震荡电路,一通电就会 ...

  7. Arduino与无源蜂鸣器

    1.Arduino无源蜂鸣器传感器模块 我们可以使用Arduino进行很多互动作品,其中最常用的是声光显示器.之前的所有实验都与LED有关.但是,这个实验中的电路可以产生声音.通常,实验是通过蜂鸣器或 ...

  8. Linux编程实现蜂鸣器演奏康定情歌

    Linux编程实现蜂鸣器演奏康定情歌 摘自:https://blog.csdn.net/jiazhen/article/details/3490979   2008年12月10日 15:40:00 j ...

  9. Raspberry Pi开发之旅-控制蜂鸣器演奏乐曲

    一.无源蜂鸣器和有源蜂鸣器 步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这次尝试用GPIO的PWM接口驱动无源蜂鸣器弹奏一曲<一闪一闪亮晶晶>. 无源蜂鸣器: 无源内部没有震荡源, ...

随机推荐

  1. iOS自动化探索(五)自动化测试框架pytest - Assert断言的使用

    使用assert语句进行断言 pytest允许使用标准的python assert语法,用来校验expectation and value是否一致 代码演示: def func(): def test ...

  2. opencv:访问像素

    a.使用指针 #include <opencv.hpp> using namespace cv; using namespace std; int main() { //指针访问每个像素并 ...

  3. MongoCola使用教程 2 - MongoDB的Replset 初始化和配置

    前言 首先再次感谢博客园的各位朋友.正是你们的关注才让我有信心将这个工具开发下去. 这周同样也有热心网友对于MongoCola存在的问题给予了反馈. 这次工具更新到了版本1.20,强化的地方是增加了R ...

  4. LeetCode OJ:Pascal's TriangleII(帕斯卡三角II)

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  5. FlashDevelop安装配置

    1.下载 FlashDevelop,flash sdk,flash sdk debug,.net framework,java sdk(32位,不管机器是多少位,否则不能单步调试的) 2.  安装Fl ...

  6. Tinker爬坑之路

    目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...

  7. iOS开发之最近开发遇到的问题总结

    1.Cannot create __weak reference in file using manual reference counting 解决办法: 点击工程-------->Build ...

  8. MySQL 的中文乱码问题终结

    中文正确 1:保存sql脚本文件 utf8 !!!!! ANSI<-->GBK 2:打开mysql窗口 SET NAMES UTF8; 每次新打开窗口执行指令 3:SOURCE d:/1. ...

  9. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

  10. phpstorm2017.3.6的激活、样式设置和汉化

    一:安装phpstorm2017.3.6,并激活.设置样式.(1)先在phstorm官网里www.jetbrains.com下载phpstorm2017.3.6,按照步骤安装即可.下面开始激活!(2) ...