STM32驱动JQ8900语音模块

news/2024/11/16 20:40:25/

上次写了esp32驱动JQ8900模块,我做设计一般会把外设先在esp32上实现一般,再移植到比较复杂的stm32上去。直接上正常运行的干货代码。

文章目录

  • 一、硬件准备
  • 二、程序编写
    • 1.jq8900.c
    • 2.jq8900.h
    • 3.main.c
  • 三、音频替换
  • 总结


一、硬件准备

STM32F10x系列任意开发板(这里我使用的是f103zet6正点原子开发板)
JQ8900播报模块一个,喇叭一个,12V/5V电源适配器一个,杜邦线若干

二、程序编写

1.jq8900.c

代码如下:

#include "jq8900.h"
#include "delay.h"
#include "stm32f10x.h"///
//函	  OnUart_GPIO(void)
//功	  能:语音模块一线串口IO口
//输入参数: void
//输出参数: void
//说	  明:
//
void OnUart_GPIO(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC->APB2ENR|=1<<3;   //GPIOB//GPIOB.11GPIOB->CRH&=0xFFFF0FFF;     //清零 GPIOB->CRH|=0x00003000;     //推挽输出	50MHZGPIOB->ODR=~(1<<11);        //B.11低	}
void delay1_us(u32 nTimer)
{u32 i=0;for(i=0;i<nTimer;i++){__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();}
}
///
//函	  数:SendData(u8 addr)
//功	  能:语音模块一线串口
//输入参数: addr要发送的0x数
//输出参数: void
//说	  明:
//
void SendData(u8 addr)//发送函数。
{u8 i;/*发送时关掉中断,防止中断影响时序  */SDA = 1; /*开始拉高*/delay1_us ( 1000 );SDA = 0; /*开始引导码*/delay1_us ( 3200 );/*此处延时最少要大于2ms*/for ( i = 0; i < 8; i++ ) /*总共8位数据  */{SDA = 1;if ( addr & 0x01 ) /*3:1表示数据位1,每个位用两个脉冲表示  */{delay1_us ( 600 );SDA = 0;delay1_us ( 200 );}else              /*1:3表示数据位0 ,每个位用两个脉冲表示  */{delay1_us ( 200 );SDA = 0;delay1_us ( 600 );}addr >>= 1;}SDA = 1;//恢复中断
}

这段代码主要是对语音模块的一线串口进行了初始化和发送数据。

在初始化过程中,使用GPIOB.11作为一线串口的数据线,设置为推挽输出模式,并将其拉低。

在发送数据时,先将数据线拉高1ms作为起始信号,然后发送引导码,引导码是一个2ms以上的低电平,表示数据传输开始。接着发送数据,每个数据位用两个脉冲表示,其中数据位1用高电平占600us和低电平占200us的两个脉冲表示,数据位0用高电平占200us和低电平占600us的两个脉冲表示。最后将数据线拉高,表示数据传输结束。

需要注意的是,在发送数据时需要关闭中断,以防止中断影响时序。在发送完数据后需要恢复中断。

2.jq8900.h

代码如下:

#ifndef __JQ8900_H
#define __JQ8900_H#include "sys.h"#define SDA PBout(11)void SendData ( u8 addr );    //发送函数。
void OnUart_GPIO(void);       //GPIO
void delay1_us(u32 nTimer);
void show_number1();
#endif

3.main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "jq8900.h"int main(void){	delay_init();	    //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); OnUart_GPIO();while(1){show_number1();delay_ms(2000);}}

十分简单的一段代码,初始化一线串口后,死循环里调用函数show_number1(),每隔2秒播放一次音频。与esp32调用音频类似,同样是编写了播放音频1的程序。

void show_number1()
{//设置音量为20SendData(0x0a);    //清空数字SendData(0x02);    //音量20SendData(0x00);SendData(0x0c);    //设置音量delay_ms(2000);    //延时//选取曲目1播放SendData(0x0a);//清空数字SendData(0x01);//曲目数字,对应00001.mp3SendData(0x0b);//选曲播放delay_ms(2000);//开始播放//SendData(0x11);//开始播放//delay(2000);
}

这段代码主要是对语音模块进行操作,实现了播放指定曲目和设置音量等功能。

在播放指定曲目时,通过发送曲目对应的数字和选曲播放命令,让语音模块播放指定曲目。在这段代码中,选取曲目1进行播放。

在设置音量时,通过发送音量对应的数字和设置音量命令,让语音模块设置指定的音量。在这段代码中,设置音量为20。

三、音频替换

JQ8900可以通过数据线与电脑连接,类似一个小型U盘,我们可以借助一些文字转语言的软件,生成一些想要的.MP3格式文件,并修改命名为0000x。注意,JQ8900的flash只有4M,故一些大型音频最好别导入,太占空间。

总结

水了一篇文章,不过也完成了对JQ8900模块的进一步应用。


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

相关文章

Linux 下 cs8900a 的移植说明

Linux 下 cs8900a 的移植说明 为 cs8900a 建立编译菜单 1. 拷贝到文件把 cs8900a 的压缩包拷贝到 arm 用户下的 dev_home/localapps/ [armlocalhost localapps]$ tar xzvf cs8900a.tar.gz [armlocalhost localapps]$cd cs8900a [armlocalhost cs8900a]$cp cs8900a.c $KERNEL/l…

LD3320语音识别模块+JQ8900-TF语音模块实现简单的语音交互控制

玩这个真的要感谢头条的强大推荐&#xff0c;清明节回家的大巴车上&#xff0c;无聊的刷着头条&#xff0c;很智能的给我推荐了一款语音识别模块&#xff0c;一直很想自己试着玩一把的我&#xff0c;按奈不住&#xff0c;点开视频看到了介绍&#xff0c;接着我就淘宝一下&#…

八重州8900如何解锁_八重贵族怪胎之路

八重州8900如何解锁 Dealing with computers day in and day out can be a harrowing experience. In difficult times, or even when things are idle, finding some spirituality can help cope with the experience—Techies: I give you the Eightfold Noble Geek Path. 日…

stm32通过 一线串口通信控制JQ8900-16P语音模块

今天玩玩语音模块&#xff0c;用到了所谓的一线串口通信&#xff08;就是用一个IO口发脉冲&#xff09;不说了&#xff0c;上代码 JQ8900-16P语音模块资料自取&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1O3P1Ro4Rc4cVMACuJVdqaA 提取码&#xff1a;1u4p 接线&a…

cs8900的基地址

用原版vivi一直很不爽,于是便有个想法,想整个功能比较完备的出来. 于是开始搜索资料,baidugoogle一番竟然发现早已有高手做出来了.自己正苦于拿不定主意到底用不用中断,正好拿高手的成果参考下,站在巨人的肩膀上,让我们走得更远. 于是便看代码...看代码... 在看tftp实现的时候,…

linux网卡驱动之CS8900A网卡驱动程序

文章目录 CS8900A芯片介绍以太网帧CS8900A寄存器代码分析 CS8900A芯片介绍 CS8900芯片是Cirrus Logic公司生产的一种局域网处理芯片&#xff0c;在嵌入式领域中使用非常常见。它的封装是100-pin TQFP&#xff0c;内部集成了在片RAM、10BASE-T收发滤波器&#xff0c;并且提供8位…

STM32一键连接JQ8400-FLJQ8900语音模块程序分析

最近优化了一个项目 需要使用 语音模块 于是采用了JQ8400 语音模块 具体的数据手册 淘宝卖家提供 主要的是一线数据发送的协议格式 由于前期使用了RT-Thread 给自己挖了一个坑 为什么呢 我所移植的3.1.3版本的源码 没有提供 us级的延时函数 只有…

单片机语音模块JQ8900-16P的几种触发方式与源码配置

我先来讲一下这个模块方便在什么地方&#xff1a; &#xff08;我没有做广告哈&#xff0c;有一说一&#xff09; 1&#xff0c;有SPI-flash&#xff0c;USB的接口直接连电脑显示U盘&#xff0c;替换音频很方便 2&#xff0c;默认情况下有IO口按键触发&#xff0c;很方便播放…