stm32怎么用无源stm32蜂鸣器器播放音乐

上一次使用了有源蜂鸣器,只能发出固定的&滴滴&声,当然不能满足于此呀。使用无源蜂鸣器,只要输出不同频率的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
#define NOTE_C1
#define NOTE_CS1 35
#define NOTE_D1
#define NOTE_DS1 39
#define NOTE_E1
#define NOTE_F1
#define NOTE_FS1 46
#define NOTE_G1
#define NOTE_GS1 52
#define NOTE_A1
#define NOTE_AS1 58
#define NOTE_B1
#define NOTE_C2
#define NOTE_CS2 69
#define NOTE_D2
#define NOTE_DS2 78
#define NOTE_E2
#define NOTE_F2
#define NOTE_FS2 93
#define NOTE_G2
#define NOTE_GS2 104
#define NOTE_A2
#define NOTE_AS2 117
#define NOTE_B2
#define NOTE_C3
#define NOTE_CS3 139
#define NOTE_D3
#define NOTE_DS3 156
#define NOTE_E3
#define NOTE_F3
#define NOTE_FS3 185
#define NOTE_G3
#define NOTE_GS3 208
#define NOTE_A3
#define NOTE_AS3 233
#define NOTE_B3
#define NOTE_C4
#define NOTE_CS4 277
#define NOTE_D4
#define NOTE_DS4 311
#define NOTE_E4
#define NOTE_F4
#define NOTE_FS4 370
#define NOTE_G4
#define NOTE_GS4 415
#define NOTE_A4
#define NOTE_AS4 466
#define NOTE_B4
#define NOTE_C5
#define NOTE_CS5 554
#define NOTE_D5
#define NOTE_DS5 622
#define NOTE_E5
#define NOTE_F5
#define NOTE_FS5 740
#define NOTE_G5
#define NOTE_GS5 831
#define NOTE_A5
#define NOTE_AS5 932
#define NOTE_B5
#define NOTE_C6
#define NOTE_CS6 1109
#define NOTE_D6
#define NOTE_DS6 1245
#define NOTE_E6
#define NOTE_F6
#define NOTE_FS6 1480
#define NOTE_G6
#define NOTE_GS6 1661
#define NOTE_A6
#define NOTE_AS6 1865
#define NOTE_B6
#define NOTE_C7
#define NOTE_CS7 2217
#define NOTE_D7
#define NOTE_DS7 2489
#define NOTE_E7
#define NOTE_F7
#define NOTE_FS7 2960
#define NOTE_G7
#define NOTE_GS7 3322
#define NOTE_A7
#define NOTE_AS7 3729
#define NOTE_B7
#define NOTE_C8
#define NOTE_CS8 4435
#define NOTE_D8
#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{
virtual void perfrom(int,double)=0;
void stop(double time = 0){
if(time==0)
wait(time);
}//end else
}//end stop
class Low:public Pitch{
void perfrom(int index,double time){
m.period_us(1000000/melody[index-1]);
m.write(0.5);
wait(time);
class Mid:public Pitch{
void perfrom(int index,double time){
m.period_us(1000000/melody2[index-1]);
m.write(0.5);
wait(time);
class Hig:public Pitch{
void perfrom(int index ,double time){
m.period_us(1000000/melody3[index-1]);
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);
//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();
//11 55 66 5
low.perfrom(1,0.5);
low.perfrom(1,0.5);
low.perfrom(5,0.5);
low.perfrom(5,0.5);
low.perfrom(6,0.5);
low.perfrom(6,0.5);
low.perfrom(5,0.8);
low.stop(0.2);
//44 33 22 1
low.perfrom(4,0.5);
low.perfrom(4,0.5);
low.perfrom(3,0.5);
low.perfrom(3,0.5);
low.perfrom(2,0.5);
low.perfrom(2,0.5);
low.perfrom(1,0.5);
low.stop(0.2);
//55 44 33 2
low.perfrom(5,0.5);
low.perfrom(5,0.5);
low.perfrom(4,0.5);
low.perfrom(4,0.5);
low.perfrom(3,0.5);
low.perfrom(3,0.5);
low.perfrom(2,0.5);
low.stop(0.2);
//55 44 33 2
low.perfrom(5,0.5);
low.perfrom(5,0.5);
low.perfrom(4,0.5);
low.perfrom(4,0.5);
low.perfrom(3,0.5);
low.perfrom(3,0.5);
low.perfrom(2,0.5);
low.stop(0.2);
//11 55 66 5
low.perfrom(1,0.5);
low.perfrom(1,0.5);
low.perfrom(5,0.5);
low.perfrom(5,0.5);
low.perfrom(6,0.5);
low.perfrom(6,0.5);
low.perfrom(5,0.5);
low.stop(0.2);
//44 33 22 1
low.perfrom(4,0.5);
low.perfrom(4,0.5);
low.perfrom(3,0.5);
low.perfrom(3,0.5);
low.perfrom(2,0.5);
low.perfrom(2,0.5);
low.perfrom(1,0.5);
low.stop();
蜂鸣器比较刺耳其实,听久了还是很难受。
在代码里面是不能调节音量的,要调低音量,加个电阻就好。最大的音量是无电阻+高电压。
没法录音,所以还是上图。
&效果可以上秒拍听一下:http://video.weibo.com/show?fid=1034:aee9ceca7eb89d5ecc8a1d
阅读(...) 评论()积极动手,实现一切可能!
使用STM32F103控制蜂鸣器发声播放音乐
近期,由于某些需要,要搭建一个机器人移动平台,需要用到STM32嵌入式系统,所有开始了某些方面的研究。这里准备有蜂鸣器来做一个下位机与上位机连接状态的指示。
参考网站:
以下部分内容来自上述网站。
一、有源蜂鸣器与无源蜂鸣器的区别
首先大家要了解有源和无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。这就是通过驱动原理来分别的方法。
然后我们再来看看外观上区别吧(如下图)
从图a、b外观上看,两种蜂鸣器好像一样,但仔细看,两者的高度略有区别,有源蜂鸣器a,高度为9mm,而无源蜂鸣器b的高度为8mm。如将两种蜂鸣器的引脚郡朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。
万用表测电阻区别
用万用表电阻档Rxl档测试:用黑表笔接蜂鸣器 “+”引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。同时有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。
无源蜂鸣器的优点是:
2、声音频率可控,可以做出“多来米发索拉西”的效果
3、在一些特例中,可以和LED复用一个控制口
有源蜂鸣器的优点是:程序控制方便。
因为无源蜂鸣器便宜,所以大部分人手里拿到的都是无源蜂鸣器,我这里使用的是也是无源蜂鸣器。
二、编程思路
这里思路很简单,就是做一个可变时间的延时开控制发声,关于延时可以使用定时器来做,但是这里为了简便,就是用了一个简单的延时来完成。
延时时间的长短可以改变声音的频率,这是本程序的关键。
但是这里有一个问题,如果要播放频率变化特别快的音乐,比如下面的《红尘情歌》,必须控制输出电流大小,直接连接单片机IO口是不行的,加一个100K欧姆的电阻可以听出来,但是声音特别小,不适合做提示。所以,定义了一个简单的提示音数组melody,来完成功能。
三、相关代码
这里代码还是非常简单的,这里贴出beep.c文化和beep.h两个文件的代码,main.c文件可以调用相关函数,非常简单,就不贴出了。
后期如果有改进的话,会继续更新相关代码。
beep.c文件
#include "beep.h"
int melody[] = {50, 50, 50, 50, 200, 200, 200, 400, 400, 500, 500, 500};
void BEEP_Init(void)
GPIO_InitTypeDef
GPIO_InitS
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
void Sound(u16 frq)
if(frq != 1000)
time = 500000/((u32)frq);
PBeep = 1;
delay_us(time);
PBeep = 0;
delay_us(time);
delay_us(1000);
void Sound2(u16 time)
PBeep = 1;
delay_ms(time);
PBeep = 0;
delay_ms(time);
void play_successful(void)
for(id = 0 ;id & 12 ;id++)
Sound2(melody[id]);
void play_failed(void)
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};
yanshi = 10;
for(i=0;i&sizeof(music)/sizeof(music[0]);i++){
for(e=0;e&((u16)time[i])*tone[music[i]]/e++){
Sound((u32)tone[music[i]]);
beep.h文件
#ifndef __BEEP__H
#define __BEEP__H
#include "sys.h"
#include "stdlib.h"
#include "delay.h"
#define PBeep PBout(5)
void BEEP_Init(void);
void Sound(u16 frq);
void Sound2(u16 time);
void play_music(void);
void play_successful(void);
void play_failed(void);
没有更多推荐了,基于STM32的PWM音乐播放器应用设计_马志强_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于STM32的PWM音乐播放器应用设计_马志强
&&STM32 PWM应用
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢查看: 914|回复: 18
stm32F103驱动无源蜂鸣器不响,这是为什么?
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
& && &本人在使用stm32驱动无源蜂鸣器时发现蜂鸣器不工作,一直找不到原因。希望大佬们解答一下。
& && &现在说明下配置与电路。
& && &file:///C:\Users\伟铸\Documents\Tencent Files\\Image\C2C\6X%HS9Q{2SW%M{J8U$@@3GL.pngfile:///C:\Users\伟铸\Documents\Tencent Files\\Image\C2C\6X%HS9Q{2SW%M{J8U$@@3GL.png
1.png (8.64 KB, 下载次数: 0)
main函数代码,只是产生一个方波。
16:22 上传
& && &这是main函数的内容,主要是初始化和产生一个方波信号来驱动蜂鸣器。
2.png (10.47 KB, 下载次数: 0)
蜂鸣器驱动引脚PA4的配置
16:23 上传
& && &这是蜂鸣器初始化内容,是对蜂鸣器驱动引脚的配置。配置为推挽输出。其余所使用的的代码文件sys.h与delay.h都是原子SYSTEM的代码。
& && &电路配置为:
3.png (2.36 KB, 下载次数: 0)
16:29 上传
& &&&这里的P14为PA4引脚,外接上拉电阻,VCC为5V。
4.png (2.97 KB, 下载次数: 0)
16:29 上传
& &&&J8连接到PA4引脚。
实验现象疑惑:烧录了程序后蜂鸣器不响,这是为什么呢?还有就是我给开发板上电的时候蜂鸣器会小声的叫一下。电源每次上电都会。但是上程序又不响。对了,这个开发板是我以前51用的,现在把51芯片换下来用32的核心板。我觉得应该可以用的。
& && &查了本网站的贴,之前有人发过这个,好像没人回帖或者解决。希望有人能替我解惑,谢谢。
STM32的IO输出高电平是3.3V的,因Q2接了5V,PA4无论高低电平都是常开。应该是这个问题。Q2e极改接3.3V就可以了。
主题帖子精华
高级会员, 积分 639, 距离下一级还需 361 积分
在线时间143 小时
STM32的IO输出高电平是3.3V的,因Q2接了5V,PA4无论高低电平都是常开。应该是这个问题。Q2e极改接3.3V就可以了。
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
怎么没有人解答啊。。。帮顶一下也好啊,别让贴沉了。
主题帖子精华
高级会员, 积分 639, 距离下一级还需 361 积分
在线时间143 小时
STM32的IO输出高电平是3.3V的,因Q2接了5V,PA4无论高低电平都是常开。应该是这个问题。Q2e极改接3.3V就可 ...
还有你这个方波的频率可能驱动不了蜂鸣器。2.5Hz,改成delay_us(200)或许可以。
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
STM32的IO输出高电平是3.3V的,因Q2接了5V,PA4无论高低电平都是常开。应该是这个问题。Q2e极改接3.3V就可 ...
是这样吗?我电路方面不太懂,我仿真试试。谢谢你。
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
STM32的IO输出高电平是3.3V的,因Q2接了5V,PA4无论高低电平都是常开。应该是这个问题。Q2e极改接3.3V就可 ...
我找不到合适的仿真软件,请问有合适的推荐一下吗?
主题帖子精华
高级会员, 积分 639, 距离下一级还需 361 积分
在线时间143 小时
我找不到合适的仿真软件,请问有合适的推荐一下吗?
硬件仿真可以用ST-link,还好用。找原子哥他们买。我是跟板子配套一起买的。
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
硬件仿真可以用ST-link,还好用。找原子哥他们买。我是跟板子配套一起买的。
呃呃,我说的是电路仿真软件,我已经有调试器了。
主题帖子精华
高级会员, 积分 639, 距离下一级还需 361 积分
在线时间143 小时
呃呃,我说的是电路仿真软件,我已经有调试器了。
proteus,注意下载版本,旧版不支持STM32的。
主题帖子精华
中级会员, 积分 289, 距离下一级还需 211 积分
在线时间79 小时
首先从电路上看,这个驱动方式是低电平驱动,也就是单片机输出低电平使得Q2(得到-5V偏压)工作,输出高电平使得Q2(得到0V偏压)截止。然而PA4输出的3.3V相对于VCC的5V来说是-1.7V,故实际单片机PA4输出高电平时,Q2(得到-1.7V偏压)很可能无法截止,所以导致蜂鸣器一直有电流流过也就无法发声了。
主题帖子精华
中级会员, 积分 320, 距离下一级还需 180 积分
在线时间210 小时
无源蜂鸣器一般用27K频率驱动
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
proteus,注意下载版本,旧版不支持STM32的。
嗯嗯,好的,proteus好像只有8.6以上版本才支持是stm32的芯片。
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
无源蜂鸣器一般用27K频率驱动
好的,谢谢。
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
首先从电路上看,这个驱动方式是低电平驱动,也就是单片机输出低电平使得Q2(得到-5V偏压)工作,输出高电 ...
谢谢你的回答。
主题帖子精华
金牌会员, 积分 2395, 距离下一级还需 605 积分
在线时间316 小时
如果PA4有上拉电阻到VCC 5V 那管脚配置为OD输出模式,就可以控制了。
让我们的思维驾驭在电的速度之上!
主题帖子精华
中级会员, 积分 289, 距离下一级还需 211 积分
在线时间79 小时
如果PA4有上拉电阻到VCC 5V 那管脚配置为OD输出模式,就可以控制了。
也是不行的,STM32的PA4不是FT,内部有钳位二极管,拉不到5V
主题帖子精华
金牌会员, 积分 2395, 距离下一级还需 605 积分
在线时间316 小时
也是不行的,STM32的PA4不是FT,内部有钳位二极管,拉不到5V
那没有FT,只能换到FT管脚才能这样弄!
让我们的思维驾驭在电的速度之上!
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
那没有FT,只能换到FT管脚才能这样弄!
原来是这样,又懂得了一点。
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间4 小时
那没有FT,只能换到FT管脚才能这样弄!
原来是这样,又懂得了一点。
Powered bystm32关于如何用蜂鸣器播放音乐(什么歌都行)_stm32吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:30,238贴子:
stm32关于如何用蜂鸣器播放音乐(什么歌都行)收藏
stm32关于如何用蜂鸣器播放音乐(什么歌都行)初学者一枚
在此谢谢大家
求求各位大神啊
stm32是ARM单片机市场领导品牌.stm32中国官方网站提供stm32简介与选型,官方文档与视频下载及培训和活动报名.
用喇叭做,不是用蜂鸣器
DA+LM380+扬声器可以播放wav格式的音乐
登录百度帐号

我要回帖

更多关于 stm32蜂鸣器播放音乐 的文章

 

随机推荐