JQ8400语音模块-stm32f103c8t6(内含全代码)-亲测有效

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

一.模块介绍
1.常见的JQ8400-FL语音模块有两种,一种是带3W功放,有4M的存储空间,可通过USB拷贝声音文件,通过单片机串口控制;另外一种是附有SD卡槽,用SD卡存储文件的文件(MP3格式)进行语音播报,也是通过单片机串口控制
2.我用的是二线串口通信,一线的没试过
3.程序完整代码以及其他资料均已打包放在了我的个人资源里面,需要的可以自行下载(需要5积分)

二.主要引脚说明

JQ8400语音模块-stm32f103c8t6(内含全代码)-亲测有效
1 ONE LINE 一线串口脚
2 BUSY 忙信号脚,播放时为高,其它为低
3 RX 芯片串口接收脚,接MCU的TX脚**(我用的是串口3)**
4 TX 芯片的串口发送脚,接MCU的RX脚**(我用的是串口3)**
5 GND 芯片数字地
6 DC-5V 芯片供电脚,3.3-5.0V
9 SPK- 接喇叭
10 SPK+

三.注意事项

1.必须接喇叭才可以播放音乐,没有喇叭在上位机控制或者将程序下载进单片机,模块不会有任何反应!
2.第一次使用该模块,建议建议使用配套的“串口调试工具”,该软件可以对模块的所用功能进行调试,并可以获取相应功能指令
3.上位机串口的 TX 和 RX 需要交叉后与模块相连,即上位机串口的 TX 对模块的 RX,上位机串口的 RX 对模块的 TX。在本项目中,我使用的是串口3,其中串口1的配置也在z_uart.c有所体现,直接使用即可
4.模块通过 USB 线连接电脑后,是 U 盘模式,此时不接受任何控制指令。请改用其他电源供电即可;如果购买的是SD卡的模块,需要用户自己往SD卡提前下载歌曲,之后通过上位机播放即可
5.模块的程序基本没什么大的变化,如果发现程序下载进去无法使用,大概率是配置的问题,请仔细检查自己的相关初始化配置(如串口的波特率是否是9600,是否已经正确打开,io的配置是否正确等等)

四.全代码

(注:因为这是一个完整的项目,因此包含头文件较多,用户可根据自己需求,删除部分头文件和其中代码)
——
——————————(以下是全部相关程序)——————————————

main.c

#include "stm32f10x.h"
#include "jq8400.h"
#include "z_timer.h"
#include "z_beep.h"
#include "z_loop.h"
#include "z_setup.h"
#include "z_led.h"
#include "z_uart.h"
#include "stdio.h"
#include "main.h"
#include "led.h"


u8 i=0;
u8 uart_receive_buf[UART_RECEIVE_BUF_SIZE]={0}, uart_receive_buf_index, uart_get_ok;

int main(void)
{		
	LED_Init();	   //初始化LED信号灯
	setup_uart3();	//初始化串口3
	delay_init();	//延时函数初始化

	while(1)
	{
		LED=0;//亮灯
		playMusic(1);
		delay_ms(100);	 //延时100ms,让程序做出缓冲
		playMusic(5);
		delay_ms(1000);	 //延时1000ms
		LED=1;
		delay_ms(1000);	 //延时1000ms
		break;
	}

	while (1)
	{

	}
}

main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include "z_setup.h"
#include "z_loop.h"

/*******全局变量宏定义*******/
#define UART_RECEIVE_BUF_SIZE  100

/*******全局变量外部声明*******/
extern u8 i;
extern u8 uart_receive_buf[UART_RECEIVE_BUF_SIZE], uart_receive_buf_index, uart_get_ok;

#endif 

jq8400.c

#include "jq8400.h"   
#include "z_uart.h"  
 /*
  * @noBug  播放音乐
  */
void playMusic(int i)
{
	switch(i)
	{
		//在任何时候发此命令都会从头开始播放当前曲目
		case 1:	 
		uart3_send_byte(0xAA);
		uart3_send_byte(0x02);
		uart3_send_byte(0x00);
		uart3_send_byte(0xAC);
			break;
		
		//暂停
		case 2:	 
		uart3_send_byte(0xAA);
		uart3_send_byte(0x03);
		uart3_send_byte(0x00);
		uart3_send_byte(0xAD);
			break;
		
		//下一曲
		case 3:	 
		uart3_send_byte(0xAA);
		uart3_send_byte(0x06);
		uart3_send_byte(0x00);
		uart3_send_byte(0xB0);
			break;
		
		//上一曲
		case 4:	 
		uart3_send_byte(0xAA);
		uart3_send_byte(0x05);
		uart3_send_byte(0x00);
		uart3_send_byte(0xAF);
			break;
		
		//音量调整到30
		case 5:	 
		uart3_send_byte(0xAA);
		uart3_send_byte(0x13);
		uart3_send_byte(0x01);
		uart3_send_byte(0x1E);
		uart3_send_byte(0xDC);
			break;
		default:
		uart3_send_str((u8 *)"the order does not exist!\r\n");
			break;
	}
}

jq8400.h

#ifndef __JQ8400_H
#define	__JQ8400_H

#include "stm32f10x.h"
#define USART_REC_LEN  			200  	//定义最大接收字节数 200
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
	  	
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART_RX_STA;         		//接收状态标记	
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
void playMusic(int i);
#endif /* __JQ8400_H */

z_uart.c

#include "z_uart.h"

/***********************************************
	函数名称:	uart1_init() 
	功能介绍:	初始化串口1
	函数参数:	baud 波特率
	返回值:		无
 ***********************************************/
void uart1_init(u32 baud) {
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	USART_ClockInitTypeDef USART_ClockInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
	USART_DeInit(USART1);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	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);

	USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
	USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
	USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
	USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
	USART_ClockInit(USART1, &USART_ClockInitStructure); 

	USART_InitStructure.USART_BaudRate = baud;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_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 ); 

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure); 

	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

	USART_Cmd(USART1, ENABLE);
	uart1_open();
}

/***********************************************
	函数名称:	uart3_init() 
	功能介绍:	初始化串口3
	函数参数:	baud 波特率
	返回值:		无
 ***********************************************/
void uart3_init(u32 baud) {
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	USART_ClockInitTypeDef USART_ClockInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
	USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
	USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
	USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
	USART_ClockInit(USART3, &USART_ClockInitStructure);

	USART_InitStructure.USART_BaudRate = baud;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_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(USART3, &USART_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

	USART_Cmd(USART3, ENABLE);
	uart3_open();
}

/***********************************************
	函数名称:	uart1_send_byte() 
	功能介绍:	串口1发送字节
	函数参数:	dat 发送的字节
	返回值:		无
 ***********************************************/
void uart1_send_byte(u8 dat) {
	USART_SendData(USART1, dat);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
	return;
}

/***********************************************
	函数名称:	uart3_send_byte() 
	功能介绍:	串口3发送字节
	函数参数:	dat 发送的字节
	返回值:		无
 ***********************************************/
void uart3_send_byte(u8 dat) {
	USART_SendData(USART3, dat);
	while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); 
	return;
}

/***********************************************
	函数名称:	uart1_send_str() 
	功能介绍:	串口1发送字符串
	函数参数:	*s 发送的字符串
	返回值:		无
 ***********************************************/
void uart1_send_str(u8 *s) {
	uart1_close();
	while (*s) {
		uart1_send_byte(*s++);
	}
	uart1_open();
}

/***********************************************
	函数名称:	uart3_send_str() 
	功能介绍:	串口3发送字符串
	函数参数:	*s 发送的字符串
	返回值:		无
 ***********************************************/
void uart3_send_str(u8 *s) {
	uart3_close();
	while (*s) {
		uart3_send_byte(*s++);
	}
	uart3_open();
}

/***********************************************
	函数名称:		void USART1_IRQHandler(void)
	功能介绍:		串口1中断函数
	函数参数:		无
	返回值:		无
 ***********************************************/
void USART1_IRQHandler(void) {
	static u8 sbuf_bak;

	if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET) {
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
		sbuf_bak = USART_ReceiveData(USART1);

		/*******返回接收到的指令*******/
		uart1_send_byte(sbuf_bak);
		/*******若正在执行命令,则不存储命令*******/
		if(uart_get_ok) return;
		/*******检测命令起始*******/
		if(sbuf_bak == '$') {
			uart_receive_buf_index = 0;
		}
		/*******检测命令结尾*******/
		else if(sbuf_bak == '!'){
			uart_receive_buf[uart_receive_buf_index] = sbuf_bak;
			uart1_send_str((u8 *)"\r\n");
			uart_get_ok = 1;
			return;
		}
		uart_receive_buf[uart_receive_buf_index++] = sbuf_bak;
		/*******检测命令长度*******/		
		if(uart_receive_buf_index >= UART_RECEIVE_BUF_SIZE) {
			uart_receive_buf_index = 0;
		}
	}
	return;
}

/***********************************************
	函数名称:	void USART3_IRQHandler(void) 
	功能介绍:	串口3中断函数
	函数参数:	无
	返回值:		无
 ***********************************************/
void USART3_IRQHandler(void) {
	static u8 sbuf_bak;
	if(USART_GetFlagStatus(USART3,USART_IT_RXNE)==SET) {
		USART_ClearITPendingBit(USART3, USART_IT_RXNE);
		sbuf_bak = USART_ReceiveData(USART3);
		/*******返回接收到的指令*******/
		uart1_send_byte(sbuf_bak);				
		/*******若正在执行命令,则不存储命令*******/
		if(uart_get_ok) return;
		/*******检测命令起始*******/
		if(sbuf_bak == '$') {
			uart_receive_buf_index = 0;
		}
		/*******检测命令结尾*******/
		else if(sbuf_bak == '!'){
			uart_receive_buf[uart_receive_buf_index] = sbuf_bak;
			uart1_send_str((u8 *)"\r\n");
			uart_get_ok = 1;
			return;
		} 
		uart_receive_buf[uart_receive_buf_index++] = sbuf_bak;
		/*******检测命令长度*******/		
		if(uart_receive_buf_index >= UART_RECEIVE_BUF_SIZE) {
			uart_receive_buf_index = 0;
		}
	}
	return;
}

z_uart.h

#ifndef __UART_H__
#define __UART_H__

#include <string.h>
#include "stm32f10x.h"
#include "main.h"

/*******串口快捷指令表*******/
#define uart1_open()  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)
#define uart3_open()  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE)
#define uart1_close() USART_ITConfig(USART1, USART_IT_RXNE, DISABLE)
#define uart3_close() USART_ITConfig(USART3, USART_IT_RXNE, DISABLE)

/*******串口相关函数声明*******/
void uart1_init(u32 baud);
void uart1_send_byte(u8 dat);
void uart1_send_str(u8 *s);

void uart3_init(u32 baud);
void uart3_send_byte(u8 dat);
void uart3_send_str(u8 *s);

#endif

五.其他说明

答主能力有限,文章中可能有书写错误或者读者不太明白的地方,还请大家多多包涵。如有不明白的地方,欢迎留言或者私聊讨论,最后程序源码已上传我的个人主页,需要完整程序的读者,可自行下载!文章来源地址https://www.toymoban.com/news/detail-425999.html

到了这里,关于JQ8400语音模块-stm32f103c8t6(内含全代码)-亲测有效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)

    一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三、小车3.0——避障小车(超声波+舵机云台) 四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传) 五、双轮自平衡小车(HAL库版

    2023年04月09日
    浏览(54)
  • Openmv+STM32F103C8T6视觉巡线小车

    机器视觉巡线处理是参考openmv官方代码 Openmv官网源代码:book. openmv.cc/project/follow-lines.html 根据官网视频及教程将源码注入openmv中。 小车巡的是黑线,所以颜色阈值要更改。 在文件示例中打开helloworld.py。 打开工具/机器视觉/阈值编辑器/缓冲区。 将我们需要寻迹的黑线调至全

    2023年04月09日
    浏览(59)
  • STM32CubeMX配置--STM32F103C8T6最小系统板

    首先是新建工程选择左上角的 File 然后点击 NewProject ,或者直接使用快捷键 Ctrl+N 新建工程 然后选择开发板型号,在 Commercial Part Number 处输入 STM32F103C8T6 然后在下方会有选择 直接双击型号 就会进入配置界面 PINoutConfiguration (1)RCC修改 首先点击左上角的 System Core 然后点击

    2024年02月04日
    浏览(65)
  • STM32F103C8T6+LD3320语音识别模块智能灯控

    由于代码需求量过大,不方便一一回复,请大家关注微信公众号“微电子基地”(头像与CSDN头像一致),点击智能灯控即可获取项目代码及功能介绍,注:仅供参考学习。  LD3320 是一颗基于非特定人语音识别(SI-ASR:Speaker-Independent Automatic SpeechRecognition)技术的语音识别/声

    2023年04月09日
    浏览(45)
  • SG90舵机的使用--STM32F103C8T6

    SG90带有一个3P的接头 根据颜色分为 黄线(信号线) 红线(电源线) 棕色 (地线) 舵机的 工作电压 在 4.8V-6V ,接在STM32系统板上驱动不了,所以需要接电源模块单独的5V供电,我使用的是如图所示的电源模块 注: 如果STM32系统板供电和舵机供电不为同一模块,则需要共地,

    2024年02月03日
    浏览(47)
  • [附源码] STM32F103C8T6+外接MCP4725 外部DAC

            STM32F103C8T6最小系统板是大家很常用的一款单片机,它内部有多个ADC模数转换通道,但并 没有DAC数模转换功能 ,当需要进行数字量转换为模拟量时就需要借助外部DAC。             MCP4725是具有非易失性存储器的单通道12位缓冲电压输出DAC。用户可将配置寄存器

    2024年02月04日
    浏览(50)
  • MQ2烟雾传感器 - STM32F103C8T6-HAL库

    ADC.c 文件 ADC.h文件 main函数中的调用

    2024年04月26日
    浏览(43)
  • 【沧海拾昧】STM32F103C8T6/C6T6的ISP烧录

    #C0105 沧海茫茫千钟粟,且拾吾昧一微尘 ——《沧海拾昧集》@CuPhoenix 【阅前敬告】 沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系 【如有问题必是本集记录有谬,切勿深究】   对于某种STM32F103C8T6/C6T6最小系统板,没有配置J-LINK/ST-LINK烧录口,此时可以

    2024年02月03日
    浏览(73)
  • STM32F103C8T6---定时器1&定时器8输出PWM信号注意事项

    博主今天在驱动定时器1的通道1输出PWM信号的时候,遇到了好多问题,在这里指出,警醒自己的同时希望能给各位带来帮助 首先,第一个错误, 第一:PA8引脚默认模式就是定时器1的通道一,我们在代码里面,直接 将PA8的输出模式改为复用推挽输出,不要去重定向它,也不要

    2024年02月16日
    浏览(47)
  • STM32单片机PWM控制实现电机调速度(小车运动,STM32F103C8T6&TB6612&TT电机)

    作者:公子易平 时间:2023/6/6 前段时间做一个智能小车的相关项目时,发现很少有人能够将STM32的PWM控制讲清楚,故而书此文,希望对后来的学习者有所帮助。 STM32F103C8T6最小系统板 直流TT电机 电机驱动芯片(TB6612) 杜邦线若干 接线情况: TB6612引脚说明: STM32主控芯片与TB6612接

    2024年02月15日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包