STM32控制JQ8400语音播报模块

news/2024/12/23 4:38:30/

时间记录:2024/2/7

一、JQ8400引脚介绍

标示说明
ONE LINE一线操作引脚
BUSY忙信号引脚,正在播放语音时输出高电平
RX串口两线操作接收引脚
TX串口两线操作发送引脚
GND电源地引脚
DC-5V电源引脚,3.3-5V
DAC-RDAC输出右声道引脚
DAC-LDAC输出左声道引脚
SPK-喇叭-引脚
SPK+喇叭+引脚

二、一线操作

(1)时序图
1线时序图
(2)时序分析
2.2.1 总线拉低2ms以上产生引导码
2.2.2 发送数据“1”,高电平大于1200us,低电平大于400us,高低电平时间比例3:1
2.2.3 发送数据“0”,高电平大于400us,低电平大于1200us,高低电平时间比例1:3
2.2.4 发送一字节指令和数据时低位先发
(3)控制指令

指令(HEX)功能说明
00数字0数字0-9可以用于需要数字的功能,比如选曲、设置音量、设置EQ、设置循环模式、设置通道、设置插播曲目先发数字后发功能指令。
01数字0
02数字2
03数字3
04数字4
05数字5
06数字6
07数字7
08数字8
09数字9
0A清零数字清除发送的数字
0B选曲确认配合数字实现
0C设置音量0-30
0D设置EQ
0E设置循环模式
0F设置通道
10设置插播曲目
11播放单字节控制指令,仅需发送一个控制指令即可。
12暂停
13停止
14上一曲
15下一曲
16上一目录
17下一目录
18选择SD卡
19选择U盘
1A选择FLASH
1B系统睡眠
(4)注意点
  • 音频文件命名需要为5位数字,该5位数字即为曲目号,例如00001.mp3
  • 音频文件需要放置在根目录下
  • 引导码延时要大于2ms,建议使用4ms
  • 高低电平时间比例在2-5都可以识别到
  • 发送两个字节,中间空闲状态建议维持10ms以上
  • 三、二线串口操作

    (1)串口波特率9600,音频文件命名无要求,复制的顺序即播放的曲目号
    (2)常用的几个命令介绍,其余命令可通过查看操作手册设置

  • 设置音量:AA 13 01 音量0-30 SM校验和
  • 播放指定曲目:AA 07 02 曲目高 曲目低 SM校验和
  • 停止播放:AA 04 00 AE
  • 设置循环模式:AA 18 01 循环模式 SM校验和
  • 四、示例代码

    (1)头文件

    #ifndef __JQ8400_H__
    #define __JQ8400_H__
    #include "stm32f10x.h"
    #include "delay.h"
    #include "sys.h"#define ONELINERCC      RCC_APB2Periph_GPIOB
    #define ONELINEGPIO     GPIOB
    #define ONELINEPIN      GPIO_Pin_5
    #define ONELINE         PBout(5)void vJq8400Init(u8 mode);//初始化,0:ONELINE操作,1串口操作
    void vOnelineVolume(int vol);//设置音量
    void vOnelinePlay(int cnt,u8 loop);//播放音频,最大999
    void vOnelinePause(u8 mode);//暂停/继续
    void vOnelineStop(void);//停止
    void vUartVolume(u8 vol);//设置音量
    void vUartPlay(int cnt,u8 loop);//播放音频,最大999
    void vUartStop(void);//停止#endif

    (2)源文件

    #include "jq8400.h"void vJq8400Init(u8 mode)
    {if(mode==0){//ONELINE操作//初始化时钟配置端口RCC_APB2PeriphClockCmd(ONELINERCC,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = ONELINEPIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(ONELINEGPIO,&GPIO_InitStruct);Delay_Init();}else if(mode==1){//串口操作RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//发送数据端口,复用推挽输出GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate = 9600;//波特率USART_InitStruct.USART_Mode = USART_Mode_Tx;//模式,发模式USART_InitStruct.USART_WordLength = USART_WordLength_8b;//数据位长度,8位USART_InitStruct.USART_Parity = USART_Parity_No;//校验位USART_InitStruct.USART_StopBits = USART_StopBits_1;//一位停止位USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_Init(USART1,&USART_InitStruct);USART_Cmd(USART1,ENABLE);}
    }static void vJq8400SendByte(u8 dataOrCmd)
    {ONELINE=1;Delay_Ms(5);//两个字节发送之间的延时//发送引导码,大于2ms,建议为4msONELINE=0;Delay_Ms(4);for(u8 i=0;i<8;i++){//发送数据ONELINE=1;if(dataOrCmd&0x01){//最低位为1,发送位1,高低电平时间3:1表示发送1,脉冲比例基数2-5都可以识别Delay_Us(1200);ONELINE=0;Delay_Us(400);}else{//发送位0Delay_Us(400);ONELINE=0;Delay_Us(1200);}dataOrCmd >>= 1;}ONELINE=1;Delay_Ms(5);//恢复空闲状态
    }static void vUartSendByte(u8 data)
    {while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//0表示数据还未转移到移位寄存器,1表示数据已经移动到移位寄存器可以发送数据USART_SendData(USART1,data);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//1表示发送完成
    }void vOnelineVolume(int vol)
    {vJq8400SendByte(0x0A);//清除数字vJq8400SendByte(vol/10);//设置音量vJq8400SendByte(vol%10);vJq8400SendByte(0x0C);//设置音量
    }void vOnelinePlay(int cnt,u8 loop)
    {vJq8400SendByte(0x0A);//清除数字vJq8400SendByte(cnt/100);//设置数字vJq8400SendByte(cnt/10%10);vJq8400SendByte(cnt%10);vJq8400SendByte(0x0B);//确认选曲vJq8400SendByte(0x0A);//清除数字vJq8400SendByte(loop);//设置数字vJq8400SendByte(0x0E);//设置循环模式,0:倒序循环播放音频文件,1:循环播放当前曲目,2:播放1次,3:循环随机播放音频文件vJq8400SendByte(0x11);//播放选曲
    }void vOnelinePause(u8 mode)
    {if(mode==0)vJq8400SendByte(0x12);else if(mode==1)vJq8400SendByte(0x11);
    }void vOnelineStop(void)
    {vJq8400SendByte(0x13);
    }void vUartVolume(u8 vol)
    {vUartSendByte(0xAA);vUartSendByte(0x13);vUartSendByte(0x01);vUartSendByte(vol);vUartSendByte((0xAA+0x13+0x01+vol));//SM校验和
    }void vUartPlay(int cnt,u8 loop)
    {//设置循环模式vUartSendByte(0xAA);vUartSendByte(0x18);vUartSendByte(0x01);if(loop==0){vUartSendByte(0x02);vUartSendByte(0xC5);}else if(loop==1){vUartSendByte(0x01);vUartSendByte(0xC4);}//播放曲目vUartSendByte(0xAA);vUartSendByte(0x07);vUartSendByte(0x02);vUartSendByte(cnt/255);vUartSendByte(cnt%255);vUartSendByte((0xAA+0x07+0x02+cnt));//SM校验和
    }void vUartStop(void)
    {vUartSendByte(0xAA);vUartSendByte(0x04);vUartSendByte(0x00);vUartSendByte(0xAE);
    }

http://www.ppmy.cn/news/1350365.html

相关文章

安装node-sass时遇到了编译错误如何解决

问题描述 npm ERR! code 1 npm ERR! path D:\ALearnBlog\shiyi-blog\blog-web\node_modules\node-sass npm ERR! command failed npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node scripts/build.js npm ERR! Building: E:\Program_Files\nodejs\node.exe D:\ALea…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

【后端高频面试题--Linux篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--Linux篇 Windows和Linux的区别&#xff1f;Unix和Linux有什么区别&#xff1f…

设计模式理解:单例模式+工厂模式+建设者模式+原型模式

迪米特法则&#xff1a;Law of Demeter, LoD, 最少知识原则LKP 如果两个软件实体无须直接通信&#xff0c;那么就不应当发生直接的相互调用&#xff0c;可以通过第三方转发该调用。其目的是降低类之间的耦合度&#xff0c;提高模块的相对独立性。 所以&#xff0c;在运用迪米特…

网络安全的今年:量子、生成人工智能以及 LLM 和密码

尽管世界总是难以预测&#xff0c;但网络安全的几个强劲趋势表明未来几个月的发展充满希望和令人担忧。有一点是肯定的&#xff1a;2024 年将是非常重要且有趣的一年。 近年来&#xff0c;人工智能&#xff08;AI&#xff09;以令人难以置信的速度发展&#xff0c;其在网络安全…

Java-并发高频面试题-2

接着之前的Java-并发高频面试题 7. synchronized的实现原理是怎么样的&#xff1f; 首先我们要知道synchronized它是解决线程安全问题的一种方式&#xff0c;而具体是怎么解决的呢&#xff1f;主要是通过加锁的方式来解决 在底层实现上来看 是通过 monitorenter、monitorexit…

校园团餐SAAS系统源码

## 项目介绍 校园团餐SAAS系统&#xff0c;是全新推出的一款轻量级、高性能、前后端分离的团餐系统&#xff0c;支持微信小程序 。 技术特点 > * 前后端完全分离 (互不依赖 开发效率高) > * 采用PHP8 (强类型严格模式) > * ThinkPHP8.0&#xff08;轻量级PHP开发框…

Git分支规范和迭代流程

Git分支 feature分支&#xff1a;功能分支 dev分支&#xff1a;开发分支 test分支&#xff1a;测试分支 master分支&#xff1a;生产环境分支 hotfix分支&#xff1a;bug修复分支。从master拉取&#xff0c;修复并测试完成merge回master和dev。 某些团队可能还会有 reale…