当前位置: 首页 > ops >正文

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

材料

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屏显示歌曲名,后续会更新的!

 

http://www.xdnf.cn/news/11001.html

相关文章:

  • 真没想到!时隔3年,被废掉武功的快播,依然是最受欢迎的播放器
  • asp.net发送电子邮件_如何在ASP.NET Core中发送电子邮件
  • NC网络工具的使用
  • 华东政法大学教学管理系统_华东政法大学教学管理信息系统登录入口、成绩查询网上选课查分...
  • 360手机刷机失败变黑砖,救砖教程
  • 常用网络特殊符号大全(含彩色表情符号)
  • android 4.3特殊功能,Android 4.3有什么新功能
  • 一次局域网入侵全过程
  • 2021-06-15——这56个免费资源网站,能让你永久告别资源付费!
  • Mac OS X – BootCamp安装Win7小记
  • URL编码解析
  • 关于小凡模拟器设置完后找不到所要配置文件的问题
  • 计算机基础知识
  • python多线程爬取某网站全部h漫画_Python多线程爬虫爬取网页图片
  • dhtmlxgantt异步读取数据库数据
  • 当Windows安全中心服务无法启动时怎么办?这里提供几个解决方案
  • 超炫Android2.1 谷歌Nexus One界面赏析
  • 前端如何做单元测试? 看这篇就入门了
  • 【云计算学习教程】探讨私有云计算平台的搭建(附带3套解决方案)_私有云云平台解决方案学习路径
  • c:out标签中的escapeXML属性
  • 从那里进入EI检索号查询入口?
  • alfafile中转站免费_中转站全集免费在线观看-手机看中转站HD完整版 - 穷TV_院线大片影视大全...
  • 从报名到领证:软考初级【网络管理员】报名考试全攻略
  • 软件项目管理:使用PERT评价不确定性的方法
  • FinePlus v1.2
  • FPGA 时钟设计 1 —— 时钟资源总结
  • 零基础如何自学编程?用这6种方法就够了!
  • ewebeditor编辑器ASP/ASPX/PHP/JSP版本漏洞利用总结及解决方法
  • 牛人搜集的常用的资源类网站及68个各类资源网站汇总
  • Linux 指令学习之crontab