JQ6500语音模块详解(STM32)

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

三、程序设计

main文件

usart.h文件

usart.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        JQ6500是一种支持串口驱动的语音模块,提供串口的MP3芯片,集成了MP3WMV的硬解码。同时软件支持TF卡驱动,支持电脑直接更新SPI Flash的内容,支持FAT16、FAT32文件系统。通过简单的串口指令即可完成播放指定的音乐,以及如何播放音乐等功能,使用方便,稳定可靠。

以下是JQ6500语音模块的参数:

型号

JQ6500

工作电压

3.3~5V

额定电流

20mA

UART接口

标准串口,TTL电平,波特率可设

工作温度

-40~80

湿度

5%~95%

哔哩哔哩视频链接:

JQ6500语音模块(STM32)

(资料分享见文末) 

二、传感器原理

1.原理图

2.引脚描述

三、程序设计

1.使用STM32F103C8T6使用JQ6500语音模块连接扬声器,通过按键控制播放几段音频。

KEY

PA0

JQ6500_TX

PA10

JQ6500_RX

PA9

OLED_SCL

PB11

OLED_SDA

PB10

main文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "key.h"

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	JQ6500语音模块实验                     
 * 版本			: V1.0
 * 日期			: 2025.2.7
 * MCU			:	STM32F103C8T6
 * 接口			:	参看usart.h						
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

int key = 0;
int key_state = 0;
int key_num = 0;

int main(void)
{ 
	
  SystemInit();//配置系统时钟为72M	
	delay_init(72);
	LED_Init();
	LED_On();
	USART1_Config();//串口初始化
	Key_Init();
	OLED_Init();
	printf("Start \n");
	delay_ms(1000);
	
	OLED_Clear();
	//显示“语音序号:”
	OLED_ShowChinese(0,0,0,16,1);
	OLED_ShowChinese(16,0,1,16,1);
	OLED_ShowChinese(32,0,2,16,1);
	OLED_ShowChinese(48,0,3,16,1);
	OLED_ShowChar(64,0,':',16,1);

  while (1)
  {
		key = Key_GetData();

		if(key)
		{
			key_state = 1;
			key_num++;
			if(key_num>3)key_num=1;
		}
		else
			key_state = 0;
		
		if(key_state)
		{
			switch(key_num)
			{
				case 1:
					music_play(1);
					LED_Toggle();
					OLED_ShowNum(56,30,1,1,16,1);		//1
				break;
					
				case 2:
					music_play(2);
					LED_Toggle();
					OLED_ShowNum(56,30,2,1,16,1);		//2
				break;
				
				case 3:
					music_play(3);
					LED_Toggle();
					OLED_ShowNum(56,30,3,1,16,1);		//3
				break;
				
				default:
					break;
			}	
		}
  }
}


usart.h文件

#ifndef __USART1_H
#define	__USART1_H

#include "stm32f10x.h"
#include <stdio.h>

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	JQ6500语音模块实验                     
 * 版本			: V1.0
 * 日期			: 2025.2.7
 * MCU			:	STM32F103C8T6
 * 接口			:	参串口1						
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

void USART1_Config(void);
int fputc(int ch, FILE *f);
void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...);
void UART1SendByte(unsigned char SendData);
void music_play(unsigned char dat);

#endif /* __USART1_H */

usart.c文件

#include "usart.h"
#include <stdarg.h>

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	JQ6500语音模块实验                     
 * 版本			: V1.0
 * 日期			: 2025.2.7
 * MCU			:	STM32F103C8T6
 * 接口			:	参串口1						
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

void USART1_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	/* 使能 USART1 时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); 

	/* USART1 使用IO端口配置 */    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);    
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA
	  
	/* USART1 工作模式配置 */
	USART_InitStructure.USART_BaudRate = 9600;	//波特率设置:9600
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//数据位数设置:8位
	USART_InitStructure.USART_StopBits = USART_StopBits_1; 	//停止位设置:1位
	USART_InitStructure.USART_Parity = USART_Parity_No ;  //是否奇偶校验:无
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制模式设置:没有使能
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接收与发送都使能
	USART_Init(USART1, &USART_InitStructure);  //初始化USART1
	USART_Cmd(USART1, ENABLE);// USART1使能
}


 /* 描述  :重定向c库函数printf到USART1*/ 
int fputc(int ch, FILE *f)
{
/* 将Printf内容发往串口 */
  USART_SendData(USART1, (unsigned char) ch);
  while (!(USART1->SR & USART_FLAG_TXE));
 
  return (ch);
}

 /*发送一个字节数据*/
void UART1SendByte(unsigned char SendData)
{	   
		USART_SendData(USART1,SendData);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	    
} 

void music_play(unsigned char dat)
{
	unsigned char  music_code[6] = {0X7E,0X04,0X03,0X00,0X01,0XEF};	
	int i;
	music_code[4] = dat;
	for(i=0;i<6;i++)
	{
		UART1SendByte(music_code[i]);
	}
}

四、实验效果 

五、资料获取

项目分享

### STM32JQ6500语音播报模块集成方法 #### 一、硬件连接说明 为了使STM32能够成功驱动JQ6500语音播报模块工作,两者之间需建立可靠的物理连接。具体来说,通过UART接口完成二者间的通讯交互,其中TXD和RXD分别对应于发送端与接收端的数据传输线路[^1]。 #### 二、初始化配置过程 在程序启动初期阶段,应对串口参数实施必要的设定动作,比如波特率设置为9600bps,并确认数据帧格式无误(一般情况下默认即可)。此外还需注意的是,在向JQ6500下发任何命令前,应先执行一次握手测试以验证链路畅通状况良好。 ```c // 初始化USART1 void USART_Config(void){ GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // 配置PA9作为USART1_TX, PA10作为USART1_RX GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); USART_InitStruct.USART_BaudRate = 9600; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1,&USART_InitStruct); USART_Cmd(USART1,ENABLE); } ``` #### 三、基本功能实现方式 当上述准备工作完成后,则可着手编写实际业务逻辑代码来操控该语音播报设备了。下面给出一段简单的例子用来触发特定编号的声音文件播放: ```c #include "stm32f1xx_hal.h" #define CMD_PLAY_FILE "\xA7\xF0" /* 播放指定序号的MP3/WAV */ #define FILE_ID "\x00\x01" /* 文件ID */ HAL_StatusTypeDef Play_Sound(uint8_t *file_id){ uint8_t cmd[] = {CMD_PLAY_FILE[0], CMD_PLAY_FILE[1]}; HAL_UART_Transmit(&huart1,cmd,sizeof(cmd),100); HAL_Delay(10); HAL_UART_Transmit(&huart1,file_id,strlen((char*)file_id),100); return HAL_OK; } int main(){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1){ Play_Sound(FILE_ID); HAL_Delay(5000); } } ``` 此段代码展示了如何构建并发出一条完整的控制指令给到JQ6500,从而使其按照预设规则选取对应的音频资源予以回放。值得注意的是这里采用了十六进制表示法定义了一些常量字符串,这有助于提高编码效率同时也便于后续维护调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值