0、前言
JQ8900-16P有多种控制模式两线串口模式、一线串口控制、按键模式,本文使用的是一线串口模式
例程文件下载:
链接: https://pan.baidu.com/s/1FtC5y7ywvrTvumgM618Kvw 提取码: k26u
1、硬件连接
芯片型号:STM32F103C8T6
JQ8900:本文一线串口用到的引脚 ,VPP作为一线串口,我接在了STM32的PA10引脚(本程序用到了软件触发,因此引脚可任意选取); BUSY空闲不接;VCC、GND分别接电源正负极;SPK-、SPK+直接和喇叭相连接。
2、原理说明
JQ8900的控制原理是通过串口发送信息进行控制,发送信息包含清空数据和控制播放。
清空上一次接收的数字:0x0a。
单字节控制指令,只需要发送一个控制指令即可:0x11~0x1c
歌曲选择帧,用高位和低位配合发送,JQ8900最多能播放19首歌曲。(但是0~9和10~19有所不同)。
例如: 选曲目号3播放
步骤如下: 清空数字->曲目号->“选曲播放”控制指令。
发送代码 0x0A->0x03->0x0b
使用单片机发送函数如下:
SendData(0x0a);
SendData(0x03);
SendData(0x0b);
例如:选曲目号12播放
步骤如下: 清空数字->曲目号->“选曲播放”控制指令。
发送代码 0x0A->0x01->0x02->0x0b
使用单片机发送函数如下:
SendData(0x0a);
SendData(0x01);
SendData(0x02);
SendData(0x0b);
例如:选曲目号15播放
步骤如下: 清空数字->曲目号->“选曲播放”控制指令。
发送代码 0x0A->0x01->0x05->0x0b
使用单片机发送函数如下:
SendData(0x0a);
SendData(0x01);
SendData(0x050);
SendData(0x0b);
四、代码编写
1、JQ9800.c
#include "JQ8900.h"
#include "DELAY.H"
#include "stm32f10x.h"
/**
* @brief GPIO初始化
* @param 无
* @retvel 无
*/
void JQ8900_Init(void)
{
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD ;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10; //此处采用软件触发,引脚可任意选取
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz ;
GPIO_Init (GPIOA,&GPIO_InitStructure);
}
/**
* @brief 发送字节函数
* @param 字节数据
* @retvel 无
*/
void SendData(uint8_t Data)
{
uint8_t m;
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_SET);//PA10置高电平
Delay_us(1000);
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_RESET);//PA10置低电平
Delay_us (4000); //最好给4ms的延时
for( m=0 ; m<8 ; m++)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_SET);
if(Data&0x01)
{
Delay_us(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_RESET);
Delay_us(210);
}
else
{
Delay_us (210);
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_RESET);
Delay_us(500);
}
Data>>=1;
}
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_SET);
}
/**
* @brief 选曲播放函数
* @param 曲目号Num_L(0x__),Num_H(0x__)
* @retvel 无
*/
void Play_Spe_Song(uint8_t Num_L,uint8_t Num_H,uint32_t xms)
{
SendData(0x0A);
if(Num_H==0)
{
SendData(Num_L);
Delay_ms (xms); //延时,根据音频时长进行调整
}
else
{
SendData(Num_L);
SendData(Num_H);
Delay_ms (xms); //延时,根据音频时长进行调整
}
SendData(0x0B);
}
2、JQ8900.h
#ifndef __JQ8900_H__
#define __JQ8900_H__
#include "stm32f10x.h"
void JQ8900_Init(void);
void SendData(uint8_t Data);
void Play_Spe_Song(uint8_t Num_L,uint8_t Num_H,uint32_t xms);
#endif
3、main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.H"
#include "JQ8900.H"
int main(void)
{
JQ8900_Init();
while(1)
{
uint8_t m=0x00;
int i;
for(i=0;i<9;i++)
{
Play_Spe_Song(m,0x00,1000);
m+=1;
}
}
}