STM32控制JQ8400语音播报模块

这篇具有很好参考价值的文章主要介绍了STM32控制JQ8400语音播报模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

时间记录:2024/2/7

一、JQ8400引脚介绍

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

二、一线操作

(1)时序图
jq8400语音模块,STM32,stm32,嵌入式硬件,单片机
(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)源文件文章来源地址https://www.toymoban.com/news/detail-847663.html

    #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,建议为4ms
        ONELINE=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{//发送位0
                Delay_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);
    }
    
    

到了这里,关于STM32控制JQ8400语音播报模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32驱动BY9301语音播报模块

    简介:STM32F103C8T6驱动BY9301语音播报模块源码介绍。 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:BY9301 特别提示:驱动内可能使用了某些其他组件,比如delay等,在文末外设模板下载地址内有。 1积分源码下载地址在文末!!! 接口图: 使用举例:  驱动源码: BY9301

    2024年02月09日
    浏览(48)
  • 基于STM32的SYN6288语音播报模块驱动实验(代码开源)_syn6288语音模块

    SYN6288 中文语音合成芯片是北京宇音天下科技有限公司于2010年初推出的一款性/价比更高,效果更自然的一款中高端语音合成芯片。 SYN6288 通过异步串口( UART )通讯方式,接收待合成的文本数据,实现文本到语音(或TTS语音)的转换。 宇音天下于 2002 年最早研制出国内首款

    2024年04月25日
    浏览(75)
  • 基于STM32的SYN6288语音播报模块驱动实验(代码开源)

    前言: 本文为手把手教学  SYN6288 语音播报模块的驱动实验,本教程的  MCU  采用 STM32F103ZET6 。通过  CubeMX  软件配置 UART 串口协议驱 SYN6288 模块进行规定的语音播报。考虑到  SYN6288 模块的集成化与智能化很高,所以该模块的使用是极其便利的。( 文末代码开源! ) 硬件

    2024年02月13日
    浏览(48)
  • STM32系列——手把手教你将SYN6288语音播报模块的标准库程序转为hal库使用

    目录 前言 1. 原理 2. Cubmx配置 3. keil5编写代码 3.1 main.c 3.2 syn6288.c 3.3 syn6288.h 本教程基于 stm32f103c8t6 最小系统板, hal库 开发。 操作简单,讲解直接清楚,旨在让大家少走弯路。 SYN6288就是用到一个串口资源即可,用STM32开发起来不难。 配置串口3为异步通信模式 ,注意波特率

    2024年02月07日
    浏览(87)
  • 【雕爷学编程】Arduino动手做(119)---JQ6500语音模块

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)

    2024年02月10日
    浏览(58)
  • STM32+JR6001语音播报

      文章目录 前言 一、JR6001怎么用? 二、使用步骤 1.合成语音 2.STM32代码 总结   最近在做一个利用STM32最小系统实现语音播报的小项目,加入到智能家居远程控制系统中,用来提示上位机对应操作的播报,于是就选择了JR6001作为语音播报模块,接下来就是学习过程。 提示:

    2024年02月06日
    浏览(176)
  • 基于STM32 + SYN6288语音播报

    完整代码下载 https://download.csdn.net/download/zhouml_msn/85592868 1:5V供电 ,功耗约120mA (带图中小喇叭); 2:最少接3根线:5V,  GND,  RXD,TXD-可不接,BY-可不接 3:两种音源输出接口,排针、标准3.5mm接口,接小喇叭和普通音箱都无压力。 4:每次最多可转换200字节文本; 1:串口配置波

    2024年02月13日
    浏览(41)
  • STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072

    STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072 Proteus 仿真小实验: STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072 功能: 硬件组成:STM32F103C6单片机 +0.960LED显示屏+DHT11温度湿度+电位器模拟SGP30二氧化碳传感器+蜂鸣器LED+串口模拟语音播报+电机模拟电风扇换气+多

    2024年02月16日
    浏览(47)
  • 【单片机毕业设计】基于STM32单片机蓝牙app遥控语音控制老年轮椅车GSM位置定位报警系统--物联网 单片机 嵌入式

            这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉小洪学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,小洪学长分享优质毕业

    2024年01月22日
    浏览(104)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包