首页 > 其他分享 >stm32 无源蜂鸣器实验 播放音乐 猪八戒背媳妇

stm32 无源蜂鸣器实验 播放音乐 猪八戒背媳妇

时间:2025-01-16 14:59:48浏览次数:3  
标签:蜂鸣器 song 0.25 note3 0.5 stm32 无源 播放 音符

前言

在8051及stm32各类教辅资料中,均有无源蜂鸣器相关的实验。可以通过单片机控制无源蜂鸣器发出指定频率和时长的声音,从而实现播放音乐的功能。
在以往的此类案例中,乐谱的谱写非常不方便,除了案例提供的乐谱数据外,学者要将一个其它的简谱转换成单片机可以播放的数据,基本不可能实现。另外在以往的案例中,音乐的播放也比较单调粗糙。
今天要分享的内容,是通过stm32f103x单片机控制无源蜂鸣器播放音乐《猪八戒背媳妇》片段,以此向大家展示如何可以自由的将简谱转换成单片机可以播放的程序数据。

效果展示

说教是比较枯燥的,我们先看下成品效果:

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="ntiyNrXz-1736610843256" src="https://live.csdn.net/v/embed/442992"></iframe>

stm32f103 控制无源蜂鸣器播放音乐《猪八戒背媳妇》

Keil 工程

以上展示效果的完整的keil工程,见附件。

主程序展示

stm32程序中,我们以main.c中定义实现我们需要的功能,下面是上述视频效果的main.c程序

#include "stm32f10x.h"  // Device header
#include "tone.h"		//提供音乐播放接口
#include "music.h"		//提供简谱数据接口,可以方便的将简谱转换为程序数据
#include "delay.h"		//提供延时功能
#include "dyyOLED.h"	//提供oled显示功能

MusicalNotation_t song;

// 歌曲简谱
Note123_e song_notes[] = {	note1,		note6_l,	note3,		note5,
							note3,		note6_l,	note1,
							note6_l,	note1,		note6_l,	note1,		note3,
							note3,		note2,		note3,		note1,		note6_l,
							note3,		note5,		note6,		note6,
							note6,		note3,		note5,
							note3,		note5,		note3,		note5,		note6,	note6,
							note6,		note3,		note5,
							note5,		note6_l,	note5,		note6_l,
							note4,		note2,		note3,		note1,
							note2,		note2,
							note2,		note1,		note2,		note3,		note5,
							note6,		note3_h,
							note3,		note3_h,
							note3,		note3_h,	note3,		note3_h,
							note4,		note2,		note3,		note1,
							note2,		note2,
							note2,		note1,		note2,		note3,		note5,
							note6};

float song_beats[] = {		0.25,		1.0,		0.75,		0.25,
							0.5,		0.5,		1.0,
							0.25,		0.25,		0.25,		0.25,		1.0,
							0.25,		0.25,		0.25,		0.25,		1.0,
							0.75,		0.25,		0.5,		0.5,
							0.5,		0.5,		1.0,
							0.25,		0.25,		0.25,		0.25,		0.5,	0.5,
							0.5,		0.5,		1.0,
							0.5,		0.5,		0.5,		0.5,
							0.5,		0.25,		0.25,		1.0,
							1.0,		1.0,
							0.5,		0.25,		0.25,		0.5,		0.5,
							1.0,		1.0,
							1.0,		1.0,
							0.5,		0.5,		0.5,		0.5,
							0.5,		0.25,		0.25,		1.0,
							1.0,		1.0,
							0.5,		0.25,		0.25,		0.5,		0.5,
							2.0};


int main(void){
	delay_init();	//初始化延时函数
	toneInit(TIM2, TIM_Channel_1);	//配置定时器和输出端口,并以此端口驱动无源蜂鸣器发声
	oledInit();		//初始化 oled 功能

	char song_name[] = "zhuBaJie";
	float song_beatSpd_bpm = 88;	//以 4分音符 为准的拍速,如果乐曲是以 8分音符为基准定义的拍速,则需要 / 2 换算成以 4分音符 为准的拍速

	song.name = song_name;	//曲名
	song.beatSpd_bpm = song_beatSpd_bpm;	//以 4分音符为准的 拍速
	song.notationBase = note_c1;	//调式,note_c1 即为 C 调, note_d1 即为 D 调, 以此类推, note_g1 即为 G 调
	song.notes = song_notes;	//简谱的音符序列
	song.beats = song_beats;	//简谱每一个音符的拍数:如果单独一个音符,则为1, 如果有一个下划线,则为0.5;如果有两个下划线,则为 0.25; 如果后面有跟n个短横线,则 +n
	song.notesCount = sizeof(song_notes) / sizeof(song_notes[0]);	//计算音符数量
	song.beatsCount = sizeof(song_beats) / sizeof(song_beats[0]);	//计算节拍数量

	oledShowString(1, 1, "Music playing...");	//在 oled 屏上显示一行消息(第1行)
	while (1)
	{
		oledClearLane(2);	//清空 oled 屏第2行
		oledShowString(2,1,song.name);	//在 oled 屏第2行显示乐曲名称
		song.playIdx = 0;	//复位播放位置
		while (!playOver(&song)){	//如果没有播放完,则一直循环
			toneSing(getNoteFre(&song));	//获取简谱播放位置的音符对应的声音频率,并播放该频率的声音
			delay_ms(getNoteBeat(&song) * 60000.0f / song.beatSpd_bpm);		//获取简谱播放位置的音符时长,并延时时长的时间
			
			toneQuiet();	//停止音符的播放
			song.playIdx++;	//后移播放位置
			delay_ms(5);	//延时5ms
		}

		delay_ms(1000);	//1s 后,循环播放下一首音乐
	}
}

音符的表示

在以

标签:蜂鸣器,song,0.25,note3,0.5,stm32,无源,播放,音符
From: https://blog.csdn.net/weixin_42148809/article/details/145083585

相关文章

  • STM32简介
    1、STM32是基于ARM-Cortex-M内核开发的32位微控制器。STM32分为高性能系列,主流系列,低功耗系列、无线系列:视频采用STM32F1系列高性能系列:STM32F2,F4,F7,H7(3224内核跑分,双核微控制器=550MHz的Cortex-M7+240MHz的Cortex-M4)2、ARM内核型号:经典ARM处理器:ARM7、ARM9、ARM11Corte......
  • 基于STM32的AI物联网计算实现指南
    基于STM32的AI物联网计算实现指南版权所有©深圳市为也科技有限公司摘要随着人工智能(AI)和物联网(IoT)的快速发展,智能设备在各行各业中的应用日益广泛。STM32系列微控制器凭借其高性能、低功耗和丰富的外设接口,成为实现AI物联网计算的理想选择。本文将全面介绍如何利用S......
  • 基于STM32控制VS1053B芯片的音频处理开发指南
    基于STM32控制VS1053B芯片的音频处理开发指南版权所有©深圳市为也科技有限公司摘要VS1053B是由VLSISolution推出的一款功能强大的音频编解码芯片,广泛应用于音频播放器、语音记录设备和其他嵌入式音频应用中。结合STM32微控制器,开发者可以实现高质量的音频处理功能......
  • STM32F1基于HAL库的学习记录实用使用教程分享(四、OLED IIC)
    往期内容STM32F1基于HAL库的学习记录实用使用教程分享(一、GPIO_Output)STM32F1基于HAL库的学习记录实用使用教程分享(二、GPIO_Input按键)STM32F1基于HAL库的学习记录实用使用教程分享(三、外部中断按键)文章目录往期内容前言一、IIC1.概念2.IIC作用3.IIC的特点II......
  • STM32 SPI总线结构
    一:SPI总线是什么SPI英文名为SerialPeripheralInterface翻译成中文为串行外设接口,适用于高速、双向数据传输场景。二:SPI总线的结构SPI总线可以与大量的从机相连接。SPI主机最少有4个引脚,分别为MOSI,MISO,SCK,NSS1.MOSI:为MasterOutputSlaveInput的缩写,中文解释为主机输出......
  • 江科大STM32入门——读写备份寄存器(BKP)&实时时钟(RTC)笔记整理
    wx:嵌入式工程师成长日记https://mp.weixin.qq.com/s/hDk7QaXP8yfYIj1gUhtMrw?token=1051786482&lang=zh_CNhttps://mp.weixin.qq.com/s/hDk7QaXP8yfYIj1gUhtMrw?token=1051786482&lang=zh_CNRTC是一个独立的定时器,BKP并不能完全掉电不丢失,其可以完成一些主电源掉电时,保存少......
  • STM32H743 嵌入式开发笔记(一):开发板元器件选型
    2025开年,心血来潮想要开发STM32H743单片机。上网搜寻了半天没找到自己喜欢的开发板,于是乎,我做了一个大胆的决定:作为一名硬件工程师,为何不做一块儿属于自己的开发板?废话不多说,直接开干!1. 电源部分1.1 供电接口供电接口当然采用USBType-C(MicroUSB早该被扔进历史的......
  • 物联网毕设 -- 智能窗帘(STM32+APP+语音识别+MQTT)
    目录 前言一连线图1.原理图2.PCB效果3.实物效果4APP效果5功能概括(1)硬件端(2)APP端(3)云平台使用(阿里云)(需要可以找我获取)(4)演示视频二底层代码使用方式1.使用说明2.下载程序三APP使用方式1下载APP四程序架构及修改(通用) 前言智能窗帘系统通过STM32......
  • STM32H723 ADC 差分与单端转换
    1、配置ADC2、配置DMA 3、DMA转换数据到数组/*USERCODEBEGINHeader_StartTaskModbus*/#defineADC_BUFFER_SIZE8//根据规则通道数调整uint32_tadc_buffer[ADC_BUFFER_SIZE];//ADC采样结果缓冲区/***@briefFunctionimplementingthemyTaskModbusthrea......
  • STM32单片机芯片与内部75 USB虚拟串口 标准库 HAL库 配置实现
    目录一、标准库工程1、USB初始化2、USB中断配置3、中断服务函数与回调接收4、USB连接5、时钟配置6、数据发送二、HAL库工程1、USB初始化2、中断服务函数与回调接收4、USB连接5、时钟配置6、数据发送一、标准库工程1、USB初始化    由官方进行适配。v......