十一、JQ8400语音播报模块

1.管脚说明

引脚 标示 说明
1 ONE LINE 一线串口脚
2 BUSY 忙信号脚,播放时为高,其他为低
3 RX 芯片串口接收脚,接MCU的TX
4 TX 芯片串口发送脚,接MCU的RX
5 GND 芯片数字地
6 DC-5V 芯片供电脚,3.3-5V
7 DAC-R DAC音频输出右声道
8 DAC-L DAC音频输出左声道
9 SPK- 接喇叭
10 SPK+

2.一线串口通信协议

SDA为数据发送端口,发送语音地址,先发送低位。

3.一线数据指令

指令(HEX) 功能 说明
00 数字0

数字0-9可以用于需要数字的功能,

比如选曲、设置音量、设置EQ、

设置循环模式、设置通道、设置插播曲目

先发数字后发功能指令。

01 数字1
02 数字2
03 数字3
04 数字4
05 数字5
06 数字6
07 数字7
08 数字8
09 数字9
0A 清零数字 清除发送的数字
0B 选曲确认

0C 设置音量0-30
0D 设置EQ
0E 设置循环模式
0F 设置通道
10 设置插播曲目
11 播放

单字节控制指令,

仅需发送一个控制指令即可。

12 暂停
13 停止
14 上一曲
15 下一曲
16 上一目录
17 下一目录
18 选择SD卡
19 选择U盘
1A 选择FLASH
1B 系统睡眠

4.一线串口MP3文件命名规则

  (1)文件名需为5位数字,该五位数即为文件的曲目号。

  (2)文件需放在根目录下。

5.一线串口说明和注意事项

  (1)引导码延时要求大于2MS,建议使用4MS延时

  (2)脉冲比例基数在2-5都可以识别

  (3)两个字节之间延时建议在10MS以上

6.代码实现

 1 void jq8400SendOneByteData(u8 dataOrCmd)
 2 {
 3     SDA=1;
 4     Delay_Ms(10);//两个字节发送之间的延时,建议大于10ms
 5     
 6     //发送引导码,大于2ms,建议为4ms
 7     SDA=0;
 8     Delay_Ms(4);
 9     
10     for(int i=0;i<8;i++){//发送数据
11         SDA=1;
12         if(dataOrCmd&0x01){//最低位为1,发送位1,高低电平时间3:1表示发送1,脉冲比例基数2-5都可以识别
13             Delay_Us(1200);
14             SDA=0;
15             Delay_Us(400);
16         }else{//发送位0
17             Delay_Us(400);
18             SDA=0;
19             Delay_Us(1200);
20         }
21         dataOrCmd >>= 1;
22     }
23 }
1     jq8400Init();
2     jq8400SendOneByteData(0x0A);//先发送数字,再发送指令,清除数字指令
3     jq8400SendOneByteData(0x01);//发送数字1
4     //jq8400SendOneByteData(0x00);//发送数字0,结合组成数字10
5     jq8400SendOneByteData(0x0B);//确定选曲指令
6     
7     jq8400SendOneByteData(0x11);//播放指令,单指令

 7.二线串口操作

7.1 使用说明:串口波特率9600

7.2 常用几个功能协议

(1)设置音量:AA 13 01 音量 SM校验和

(2)选择曲目并播放:AA 07 02 曲目高 曲目低 SM校验和

(3)停止播放:AA 04 00 AE

(4)设置循环模式:AA 18 01 循环模式 SM校验和

8.事例代码

 1 #ifndef __JQ8400_H__
 2 #define __JQ8400_H__
 3 #include "stm32f10x.h"
 4 
 5 static char SETVOLUME[5]={0xAA,0x13,0x01,0x14,0xD2};//设置音量
 6 static char PLAY[6]={0xAA,0x07,0x02,0x00,0x01,0xB4};//选择曲目并播放
 7 static char STOP[4]={0xAA,0x04,0x00,0xAE};//停止播放
 8 static char LOOP[5]={0xAA,0x18,0x01,0x02,0xC5};//设置循环模式
 9 
10 typedef enum{
11     FALSE=0,
12     TRUE,
13 }bool;
14 
15 //初始化串口
16 void JQ8400_Init(void);
17 //设置音量
18 void JQ8400_SetVolume(int volume);
19 //播放指定音乐
20 void JQ8400_Play(int index,bool loop);
21 //停止播放
22 void JQ8400_Stop(void);
23 
24 #endif
 1 #include "jq8400.h"
 2 
 3 void JQ8400_Init(void)
 4 {
 5     //1.使能时钟,初始化端口
 6     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
 7     
 8     GPIO_InitTypeDef GPIO_InitStruct;
 9     
10     GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
11     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//发送数据端口,复用推挽输出
12     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
13     GPIO_Init(GPIOA,&GPIO_InitStruct);
14     
15     GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
16     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收数据端口,浮空输入
17     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
18     GPIO_Init(GPIOA,&GPIO_InitStruct);
19     
20     //2.使能时钟,配置串口参数
21     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
22     
23     USART_InitTypeDef USART_InitStruct;
24     
25     USART_InitStruct.USART_BaudRate = 9600;//波特率
26     USART_InitStruct.USART_Mode = USART_Mode_Tx;//模式,发模式
27     USART_InitStruct.USART_WordLength = USART_WordLength_8b;//数据位长度,8位
28     USART_InitStruct.USART_Parity = USART_Parity_No;//校验位
29     USART_InitStruct.USART_StopBits = USART_StopBits_1;//一位停止位
30     USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
31     USART_Init(USART1,&USART_InitStruct);
32     
33     //3.使能串口
34     USART_Cmd(USART1,ENABLE);
35 }
36 
37 //发送字符串函数
38 static void Send_Data(u8* data,u16 data_len)
39 {
40     for(int i=0;i<data_len;i++){
41         while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//0表示数据还未转移到移位寄存器,1表示数据已经移动到移位寄存器可以发送数据
42         USART_SendData(USART1,data[i]);
43         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//1表示发送完成
44     }
45 }
46 
47 void JQ8400_SetVolume(int volume)
48 {
49     SETVOLUME[3]=volume;
50     SETVOLUME[4]=SETVOLUME[0]+SETVOLUME[1]+SETVOLUME[2]+SETVOLUME[3];
51     Send_Data((u8*)SETVOLUME,5);
52 }
53 
54 void JQ8400_Play(int index,bool loop)
55 {
56     if(loop == TRUE){
57         LOOP[3]=0x01;
58         LOOP[4]=0xC4;
59         Send_Data((u8*)LOOP,5);
60     }else{
61         LOOP[3]=0x02;
62         LOOP[4]=0xC5;
63         Send_Data((u8*)LOOP,5);
64     }
65     
66     PLAY[3]=(index & 0xFF00) >> 8;
67     PLAY[4]=(index & 0x00FF);
68     PLAY[5]=PLAY[0]+PLAY[1]+PLAY[2]+PLAY[3]+PLAY[4];
69     Send_Data((u8*)PLAY,6);
70 }
71 
72 void JQ8400_Stop(void)
73 {
74     Send_Data((u8*)STOP,4);
75 }

 

posted @ 2023-07-10 19:46  稚终KINO  阅读(1847)  评论(0)    收藏  举报