STM32控制JQ8400语音播报模块

时间记录: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.rhkb.cn/news/257617.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫——ajax和selenuim总结

为什么要写这个博客呢&#xff0c;这个代码前面其实都有&#xff0c;就是结束了。明天搞个qq登录&#xff0c;这个就结束了。 当然也会更新小说爬取&#xff0c;和百度翻译&#xff0c;百度小姐姐的爬取&#xff0c;的对比爬取。总结嘛&#xff01;&#xff01;&#xff01;加…

【运维测试】测试理论+工具总结笔记第1篇:测试理论的主要内容(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论测试理论测试工具相关知识。Python测试理论的主要内容&#xff0c;掌握软件测试的基本流程&#xff0c;知道软件测试的V和W模型的优缺点&#xff0c;掌握测试用例设计的要素&#xff0c;掌握等价类划分法、边界值法、因…

可视化工具:将多种数据格式转化为交互式图形展示的利器

引言 在数据驱动的时代&#xff0c;数据的分析和理解对于决策过程至关重要。然而&#xff0c;不同的数据格式和结构使得数据的解读变得复杂和困难。为了解决这个问题&#xff0c;一种强大的可视化工具应运而生。这个工具具有将多种数据格式&#xff08;包括JSON、YAML、XML、C…

专业140+总分420+东北大学841通信专业基础考研经验东大电子信息与通信工程,真题,大纲,参考书。

今年考研顺利上岸&#xff0c;被东北大学通信工程录取&#xff0c;其中专业课841通信专业基础140&#xff0c;数二140&#xff0c;总分420&#xff0c;整体每门课都还是比较均衡&#xff0c;刚开始考研前也和大家一样&#xff0c;焦虑&#xff0c;紧张&#xff0c;面对考研怕失…

关于npmlink的问题

深入浅出关于Npm linl的问题 关键词&#xff1a; vue3报错 Uncaught TypeError: Cannot read properties of null (reading ‘isCE‘) at renderSlot npm link 无法实现热更新 我的开发环境是 “vue”: “^3.2.13” 今天在使用 rollup搭建组件库的时候我发现我的组件库不能…

模拟电子技术——基本放大电路

文章目录 前言一、三极管输入输出特性三极管放大作用三极管电流放大关系三极管的特性曲线 二、基本放大电路-电路结构与工作原理基本放大电路的构成基本放大电路放大原理三种基本放大电路比较 三、基本放大电路静态工作点什么是静态工作点&#xff1f;静态工作点的作用估算法分…

MySQL-----函数篇

目录 ▶ 字符串函数 ▶ 数值函数 ▶ 日期函数 ▶ 流程函数 ▶ 简介 函数是指一段可以直接被另一段程序调用的程序或代码。 ▶ 字符串函数 函数描述实例ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。 返回 CustomerName 字段第一个字母的 ASCII 码&#xff1a; S…

FastJson、Jackson使用AOP切面进行日志打印异常

FastJson、Jackson使用AOP切面进行日志打印异常 一、概述 1、问题详情 使用FastJson、Jackson进行日志打印时分别包如下错误&#xff1a; 源码&#xff1a; //fastjon log.info("\nRequest Info :{} \n"&#xff0c; JSON.toJSONString(requestInfo)); //jackson …

无人机概述及系统组成,无人机系统的构成

无人机的定义 无人驾驶航空器&#xff0c;是一架由遥控站管理&#xff08;包括远程操纵或自主飞行&#xff09;的航空器&#xff0c;也称遥控驾驶航空器&#xff0c;以下简称无人机。 无人机系统的定义 无人机系统&#xff0c;也称无人驾驶航空器系统&#xff0c;是指一架无人…

【MySQL/Redis】如何实现缓存一致

目录 不实用的方案 1. 先写 MySQL , 再写 Redis 2. 先写 Redis &#xff0c; 再写MySQL 3. 先删 Redis&#xff0c;再写 MySQL 实用的方案 1. 先删 Redis&#xff0c;再写 MySQL, 再删 Redis 2. 先写 MySQL , 再删 Redis 3. 先写MySQL&#xff0c;通过BinLog&#xff0…

anomalib1.0学习纪实

回顾&#xff1a;细分、纵深、高端、上游、积累、极致。 回顾&#xff1a;产品化&#xff0c;资本化&#xff0c;规模化&#xff0c;大干快上&#xff0c;小农思维必死无疑。 春节在深圳新地中央&#xff0c;学习anomalib1.0。 一、安装&#xff1a; 1、常规安装 采用的是…

【MySQL】外键约束的删除和更新总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-7niJLSFaPo0wso60 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

CentOS7.9+Kubernetes1.29.2+Docker25.0.3高可用集群二进制部署

CentOS7.9Kubernetes1.29.2Docker25.0.3高可用集群二进制部署 Kubernetes高可用集群&#xff08;Kubernetes1.29.2Docker25.0.3&#xff09;二进制部署二进制软件部署flannel v0.22.3网络&#xff0c;使用的etcd是版本3&#xff0c;与之前使用版本2不同。查看官方文档进行了解…

小白学习Halcon100例:如何利用动态阈值分割图像进行PCB印刷缺陷检测?

文章目录 *读入图片*关闭所有窗口*获取图片尺寸*根据图片尺寸打开一个窗口*在窗口中显示图片* 缺陷检测开始 ...*1.开运算 使用选定的遮罩执行灰度值开运算。*2.闭运算 使用选定的遮罩执行灰度值关闭运算*3.动态阈值分割 使用局部阈值分割图像显示结果*显示原图*设置颜色为红色…

一文搞懂“什么是双亲委派”

文章目录 双亲委派介绍类加载器介绍类加载流程验证自定义类加载器为什么要设计这种机制 提前声明&#xff1a;以下介绍都是基于jdk9之前版本的双亲委派机制&#xff0c;jdk9及之后版本双亲委派会有变化&#xff0c;不在本篇介绍。 双亲委派介绍 双亲委派机制&#xff08;Pare…

前端秘法进阶篇之事件循环

目录 一.浏览器的进程模型 1.进程 2.线程 二.浏览器的进程和线程 1. 浏览器进程 2. 网络进程 3. 渲染进程 三.渲染主线程 四.异步 五.优先级 1. 延时队列&#xff1a; 2.交互队列&#xff1a; 3.微队列&#xff1a; 六.JS 的事件循环 附加:JS 中的计时器能做到精…

MATLAB实现LSTM时间序列预测

LSTM模型可以在一定程度上学习和预测非平稳的时间序列&#xff0c;其具有强大的记忆和非线性建模能力&#xff0c;可以捕捉到时间序列中的复杂模式和趋势[4]。在这种情况下&#xff0c;LSTM模型可能会自动学习到时间序列的非平稳性&#xff0c;并在预测中进行适当的调整。其作为…

微信小程序介绍、账号申请、开发者工具目录结构详解及小程序配置

目录 一、微信小程序介绍 1.什么是小程序&#xff1f; 2.小程序可以干什么&#xff1f; 3.微信小程序特点 二、账号申请 1.账号注册 2.测试号申请 三、安装开发工具 四、开发小程序 五、目录结构 JSON 配置 小程序配置 app.json 工具配置 project.config.json 页…

云备份项目:在云端保护您的数据【二、开发】

☘️过度的信息对一个过着充实生活的人来说&#xff0c;是一种不必要的负担☘️ 文章目录 前言工具类实现文件实用工具类代码实现 Json实用工具类代码实现 服务端单例配置类系统配置信息单例配置类 数据管理类数据信息数据管理 热点管理类业务处理类 客户端数据管理类文件备份类…

高级FPGA开发之基础协议PCIe(二)

高级FPGA开发之基础协议之PCIe&#xff08;二&#xff09; 一、TLP报文类型 在PCIe总线中&#xff0c;存储器读写、I/O读写和配置读写请求TLP主要由以下几类报文组成&#xff1a; 1.1 存储器读请求TLP和读完成TLP 当PCIe主设备&#xff08;RC或者EP&#xff09;访问目标设备…