一.模块介绍
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)
{
}
}
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文章来源:https://www.toymoban.com/news/detail-425999.html
#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模板网!