【STM32】——JQ8900-16P

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;	
		}
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值