当前位置:   article > 正文

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

jq8400

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

二.主要引脚说明

请添加图片描述
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)
	{

	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

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 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

五.其他说明

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/706853
推荐阅读
相关标签
  

闽ICP备14008679号