基于STM32语音控制的MP3播放器

本文详细介绍了如何使用STM32F103C8T6单片机配合LD3320语音模块和MiniMP3播放器实现音频控制,包括串口配置、按键操作、指令发送和接线图示。作者提供了代码示例和注意事项,以帮助读者搭建基于STM32的语音控制MP3播放器。
摘要由CSDN通过智能技术生成

材料

STM32F103C8T6最小系统板、LD3320语音模块、Mini MP3 播放器模块、喇叭、读卡器、SD卡、面包板、按键、杜邦线、跳线若干

接线图说明

0878434d14454129a9fcf5dcc5380684.jpeg

这里我也是网上找的图片虽然是Arduino的但是不影响STM32一样接的,底下也有直观的原理图

 

d09d4ea83419484c84a7e37b3fee4c27.jpeg

剩下的其实就简单了,下载歌曲然后按格式取名

一线串口 MP3 文件命名规则:
文件名须为 5 位数字,该五位数既是该文件的曲目号。选曲播放指令(0xb)靠此
数字来识别。 如下图所示。

dbd8b3ff31f548d3b9ad2bff03a8d12e.jpeg
如使用其它形式的命名,则无法使用选曲播放指令播放该文件,文件需要放在根
目录下,即打开盘符即可。

命令格式说明

35ea069539254216a9ff3bc5c0491a21.jpeg

例 1:设置音量为 20 
步骤如下: 清空数字->音量 20->“设置音量”控制指令。
发送代码 0x0A->0x02->0x00->0x0C 
使用单片机发送函数如下:
SendData(0x0a); 
SendData(0x02); 
SendData(0x00); 
SendData(0x0c); 
使用多字节控制指令前,最好先发送”清空数字”指令,再发送新的数字。


例 2:选曲目号 2 播放
步骤如下: 清空数字->曲目号->“选曲播放”控制指令。
发送代码 0x0A->0x02->0x0b 
使用单片机发送函数如下:
SendData(0x0a); 
SendData(0x02); 
SendData(0x0b); 

选曲目号 15 播放
SendData(0x0a); 
SendData(0x01); 
SendData(0x05); 
SendData(0x0b); 

例 3:开始播放
步骤如下: “开始播放”控制指令。
发送代码 0x11 。只需发送一个 0x11 即可。
使用单片机发送函数如下:
SendData(0x11); 

上面这些商家的手册上都有不过防止大家不想看那么繁琐我就整理了一下,如果有遗漏请大家看商家的资料

代码

第一步就是 串口配置

我这里配置了串口1

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1, ENABLE);
}

串口发送函数

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

第二步按键配置

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	
	return KeyNum;
}

最后主函数其实就是按照命令格式来我这里就做了个上一首和下一首

int main(void)
{
	
	OLED_Init();
	Key_Init();
	Serial_Init();	

while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			Serial_SendByte(0x14);
		}
		if (KeyNum == 2)
		{
			Serial_SendByte(0x15);
		}
	}
}

到这里基本就结束了

LD3320

接下去补充一下LD3320模块的内容,LD3320的内容商家给的资料就较为完善了,我这边就简单介绍一下使用

修改指令

LD3320可以带一级口令也可以不带,但这边为了一准确性个人建议是要一级指令的

下图就是具体修改指令的地方了

4ecad4e587d4445f9f7989c01fd975fc.png

 

根据个人需求指令修改完毕之后,就可以去修改发送的数据了

b4375ffbba7048468e555781e97946b6.png

就是当接收到关灯开灯之后发送的数据

这里画重点:这里的数据发送之后我也不知道什么原因它好像会有点不一样,所以我的建议是代码改完之后,用串口调试助手读一下发出来的数据,然后根据具体数据去写是STM32串口接收的判断代码,也可以避免大家后期有问题繁琐的调试。

接线图

这边是网上找的其他大佬的接线图大家参考一下

d2f42455d8a943e7a0b8e17fcdc63787.jpeg

串口的TX和RX对应不要接错就可以

我调试的效果

LD3320

 

LD3320模块和MP3模块都调试完毕了

 

总结

最后只要把两个模块和单片机连接(通过一个串口就行,不理解可以看一看上面大佬的接线图),然后根据个人需求更改一下代码,一个基于STM32语音控制的MP3播放器就完成啦!

写的不太好,大家见谅。下一步是连上OLED屏显示歌曲名,后续会更新的!

 

  • 23
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于stm32mp3音乐播放器是一款集成了音乐播放、存储和控制等多项功能的智能音频播放设备。其核心芯片采用了stm32系列的微控制器, 具有性能高、容易开发、系统稳定等优点,所以被许多厂家用作智能音频设备的核心。同时,基于stm32mp3音乐播放器还可以通过声音合成,来实现多种语言的语音播报。 基于stm32mp3音乐播放器的设计和制造,需要经过繁杂的工艺过程和技术考验,同时它还要支持多种音频文件格式(如mp3、wma、wav、flac等),并具备良好的音质和稳定的音频输出。其主要功能包括:音乐播放、音质调节、音频格式转换等,还能够通过存储卡、U盘等外部设备进行输入、输出音频数据,实现音频数据的存储和传输。 基于stm32mp3音乐播放器具有广泛的应用领域,可以用于家庭、娱乐场所、学校等多种场合。例如:家居使用,可以将其作为智能家居的一个重要组成部分,让用户可以通过手机或其他移动设备操纵播放器,实现远程控制;娱乐场所使用,可以为用户提供高品质的音乐娱乐体验,让用户可以尽情享受精彩的音乐;教育培训使用,可以做到课件与音频同步播放、录音、停止等功能,方便教师及学生使用等。 总之,基于stm32mp3音乐播放器在音频播放领域发挥着重要作用,它不仅适用于个人消费市场,更可以真正的改变人们生活的方式和感受方式,是一款具有广泛前景的智能音频设备。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值