6863|16

178

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM32和无源蜂鸣器播放声音的问题 [复制链接]

 

引脚通过PWM驱动无源蜂鸣器来发出不同的声音

看网上的例子 就是声音文件对应的 节拍 频率 等参数放在数组里面然后挨个调用,就能播放想要的声音

现在问题是怎么得到一段 音频对应的节拍和频率等参数

在网上下载的MP3文件怎么得到这些数据呢?

此帖出自stm32/stm8论坛

最新回复

如下图所示,是蜂鸣器与STM32连接的电路图,程序中的“PBeep”就是图中的“BEEP”IO口的宏定义,一般在头文件中进行定义: #define PBeep PBout(8)   [attach]860506[/attach]   先上网找个谱子,仔细看看,搞定两个数组,一个音调,一个音长。 查看乐谱,如下:   [attach]860505[/attach]      真到了转换简谱到数组的时候,这时就能发现选择儿歌的好处了,所有的音调都在tone[]数组中,也就是说,在低音7到高音5之间。让我们再看一遍这个数组:       //             低7  1   2   3   4   5   6   7  高1 高2  高3 高4 高5 不发音     uc16 tone[] = {247,262,294,330,349,392,440,494,523,587,659,698,784,1000};//音频数据表   #include "beep.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_GPIOB, ENABLE);     //使能A端口时钟     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz     GPIO_Init(GPIOB, &GPIO_InitStructure);      //初始化GPIOD3,6     GPIO_SetBits(GPIOB,GPIO_Pin_5);     } void Sound(u16 frq) {     u32 time;     if(frq != 1000)     {         time = 500000/((u32)frq);         PBeep = 1;         delay_us(time);         PBeep = 0;         delay_us(time);     }else         delay_us(1000); } void Sound2(u16 time) {     PBeep = 1;     delay_ms(time);     PBeep = 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) {     //              低7  1   2   3   4   5   6   7  高1 高2 高3 高4 高5 不发音     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};         u32 yanshi;     u16 i,e;     yanshi = 10;     for(i=0;i<sizeof(music)/sizeof(music[0]);i++){         for(e=0;e<((u16)time)*tone[music]/yanshi;e++){             Sound((u32)tone[music]);         }         } }   #ifndef __BEEP__H #define __BEEP__H #include "sys.h" #include "stdlib.h"       #include "delay.h" //定义GPIOB的位地址变量宏,位输入宏,输出宏 #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); #endif     详情 回复 发表于 2024-11-10 00:53
点赞 关注
 

回复
举报

6767

帖子

2

TA的资源

版主

沙发
 

网上下的MP3肯定是不能转换成这种数据的,网上有一些音频的数据分享,你可以拿来用,有些开发板也会带音频数据的问文件

此帖出自stm32/stm8论坛

点评

我目前的项目就是检测值和报警值比较,根据差值的大小来发出不同的声音。这些声音都只有MP3文件  详情 回复 发表于 2023-8-12 08:12
 
 

回复

2万

帖子

0

TA的资源

超级版主

板凳
 

小字一组a音,国际标准为440Hz。由此可以得到所有音高。

至于节拍,那就是某音持续时间。

此帖出自stm32/stm8论坛

点评

啥意思啊?  详情 回复 发表于 2023-8-12 08:22
 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

4
 
可以使用malab 对音频文件
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

5
 

可以使用matlab 对音频文件做 fft 分析

此帖出自stm32/stm8论坛
 
 
 

回复

178

帖子

0

TA的资源

一粒金砂(中级)

6
 
wangerxian 发表于 2023-8-11 16:54 网上下的MP3肯定是不能转换成这种数据的,网上有一些音频的数据分享,你可以拿来用,有些开发板也会带音频 ...

我目前的项目就是检测值和报警值比较,根据差值的大小来发出不同的声音。这些声音都只有MP3文件

此帖出自stm32/stm8论坛

点评

不知道有没有那种工具,能写编码发出声音,这样你就比较好测试自己写的编码对应的声音了。直接转换的我感觉是没有的。  详情 回复 发表于 2023-8-14 09:10
 
 
 

回复

178

帖子

0

TA的资源

一粒金砂(中级)

7
 
maychang 发表于 2023-8-11 17:00 小字一组a音,国际标准为440Hz。由此可以得到所有音高。 至于节拍,那就是某音持续时间。

啥意思啊?

此帖出自stm32/stm8论坛
 
 
 

回复

4817

帖子

4

TA的资源

版主

8
 

使用音频分析软件或者使用编程语言和相应的音频处理库(如Python的Librosa库)

此帖出自stm32/stm8论坛
 
 
 

回复

6060

帖子

6

TA的资源

版主

9
 

先对音频进行编辑得到想要的段落,然后通过Python可以转化成C语言数组

此帖出自stm32/stm8论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

6767

帖子

2

TA的资源

版主

10
 
程序会不会 发表于 2023-8-12 08:12 我目前的项目就是检测值和报警值比较,根据差值的大小来发出不同的声音。这些声音都只有MP3文件

不知道有没有那种工具,能写编码发出声音,这样你就比较好测试自己写的编码对应的声音了。直接转换的我感觉是没有的。

此帖出自stm32/stm8论坛
 
 
 

回复

6068

帖子

4

TA的资源

版主

11
 

PCM编码吧。

此帖出自stm32/stm8论坛
 
 
 

回复

6841

帖子

11

TA的资源

版主

12
 

希望楼主能学会,再发一个帖子,我也来学习学习!

此帖出自stm32/stm8论坛
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(中级)

13
 

还是看简谱吧, do re mi,然后映射到不同频率,都是标准的 中间C好像是440Hz

此帖出自stm32/stm8论坛
 
 
 

回复

4771

帖子

12

TA的资源

版主

14
 
建议看下MIDI 此文还行https://blog.csdn.net/qq_35180537/article/details/136940633,如果你想用软件看看频谱 adobe 的找找都可以看,小的推荐goldenwave
此帖出自stm32/stm8论坛
 
 
 

回复

7442

帖子

2

TA的资源

五彩晶圆(高级)

15
 

这种数据网上很多的,chatgpt也可以直接给你。

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

16
 
最重要的就是实践,你必须要有一个可以给你展示的硬件平台,没有这个,
此帖出自stm32/stm8论坛
 
 
 

回复

396

帖子

4

TA的资源

版主

17
 

如下图所示,是蜂鸣器与STM32连接的电路图,程序中的“PBeep”就是图中的“BEEP”IO口的宏定义,一般在头文件中进行定义:
#define PBeep PBout(8)

 

 

先上网找个谱子,仔细看看,搞定两个数组,一个音调,一个音长。
查看乐谱,如下:

 


    
真到了转换简谱到数组的时候,这时就能发现选择儿歌的好处了,所有的音调都在tone[]数组中,也就是说,在低音7到高音5之间。让我们再看一遍这个数组:

 

    //             低7  1   2   3   4   5   6   7  高1 高2  高3 高4 高5 不发音
    uc16 tone[] = {247,262,294,330,349,392,440,494,523,587,659,698,784,1000};//音频数据表

 

#include "beep.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_GPIOB, ENABLE);     //使能A端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;     
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);      //初始化GPIOD3,6
    GPIO_SetBits(GPIOB,GPIO_Pin_5);    
}

void Sound(u16 frq)
{
    u32 time;
    if(frq != 1000)
    {
        time = 500000/((u32)frq);
        PBeep = 1;
        delay_us(time);
        PBeep = 0;
        delay_us(time);
    }else
        delay_us(1000);
}
void Sound2(u16 time)
{
    PBeep = 1;
    delay_ms(time);
    PBeep = 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)
{
    //              低7  1   2   3   4   5   6   7  高1 高2 高3 高4 高5 不发音
    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};    
    u32 yanshi;
    u16 i,e;
    yanshi = 10;
    for(i=0;i<sizeof(music)/sizeof(music[0]);i++){
        for(e=0;e<((u16)time)*tone[music]/yanshi;e++){
            Sound((u32)tone[music]);
        }    
    }
}

 

#ifndef __BEEP__H
#define __BEEP__H

#include "sys.h"
#include "stdlib.h"      
#include "delay.h"

//定义GPIOB的位地址变量宏,位输入宏,输出宏
#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);

#endif

 

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
摩托罗拉GSM基站安装调测考试试题(CERTIFICATION TEST OF MOTOROLA GSM BTS ICI

考试大纲1. 考试目的认证HORIZEN MACRO1800和900基站安装调测资格,测试评估基站工程师理论和实践水平。2. 考试分为笔试和现场考 ...

芯片封装概述

芯片封装 一、DIP双列直插式封装  DIP(DualIn-line Package)是指采用双列直插形式封装的集成电路芯片,绝大多数中小规模 ...

FPGA设计者的5项基本功

记得《佟林传》里,佟林练的基本功是“绕大树、解皮绳”,然后才练成了什么“鬼影随行、柳叶绵丝掌”。 在 ...

LPC1343学习笔记(连载中)--6月21日新增第十二篇

有幸拿到了EEWORLD论坛的LPC1343评估板,实在是一件意外而激励人心的事情。为感谢EEWORLD和NXP,特将学习过程与大家共同分享。也 ...

Wi-Fi 滤波器设计干货奉送(建议收藏)

本帖最后由 alan000345 于 2020-6-20 09:12 编辑 老式的 FM 收音机,从一个频道拨到另一个频道时会听到中间噼里啪啦的噪声。 ...

CC2640 纽扣电池供电设计技巧

CC2640 是具有宽电压输入范围(1.8-3.8V)的低功耗蓝牙芯片,通过内部 DCDC 或 LDO 降压 后再供给内部数字内核和电路。因为其宽 ...

解决高速串行连接面临的挑战

521600

系留、空中/水下无人机的电源解决方案你了解吗?Vicor工程师告诉你!

系留、空中/水下无人机 这类无人机由地面电源通过系线供电并控制。500V 到 800V 的高压系线传输支持更长、更细的线缆,有助于 ...

单车改装系列:改装按键

以前喇叭的按钮在太阳能板上,按下时不太方便,因此就想修改一下,把按键移动到龙头扶手上。考虑到龙头位置小,也不易固定,最后 ...

共读颁奖:《智能驾驶之激光雷达算法详解》

首先感谢网友参与 《智能驾驶之激光雷达算法详解》,以下是审核结果。 (1)获得积分奖励的网友,今日发送完毕,注意查收 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表