STM32驱动JQ8900语音模块教程

上次写了esp32驱动JQ8900模块,我做设计一般会把外设先在esp32上实现一般,再移植到比较复杂的stm32上去。直接上正常运行的干货代码。

文章目录

  • 一、硬件准备
  • 二、程序编写
  • 1.jq8900.c
  • 2.jq8900.h
  • 3.main.c
  • 三、音频替换
  • 总结

  • 一、硬件准备

    STM32F10x系列任意开发板(这里我使用的是f103zet6正点原子开发板)
    JQ8900播报模块一个,喇叭一个,12V/5V电源适配器一个,杜邦线若干

    二、程序编写

    1.jq8900.c

    代码如下:

    #include "jq8900.h"
    #include "delay.h"
    #include "stm32f10x.h"
     
    ///
    //函	  OnUart_GPIO(void)
    //功	  能:语音模块一线串口IO口
    //输入参数: void
    //输出参数: void
    //说	  明:
    //
    void OnUart_GPIO(void)
    {
    	GPIO_InitTypeDef  GPIO_InitStructure;
     
    		RCC->APB2ENR|=1<<3;   //GPIOB
    		
    		//GPIOB.11
    		GPIOB->CRH&=0xFFFF0FFF;     //清零 
    		GPIOB->CRH|=0x00003000;     //推挽输出	50MHZ
    		GPIOB->ODR=~(1<<11);        //B.11低	
     
    	
    }
    void delay1_us(u32 nTimer)
    {
    	u32 i=0;
    	for(i=0;i<nTimer;i++){
    		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    	}
    }
    ///
    //函	  数:SendData(u8 addr)
    //功	  能:语音模块一线串口
    //输入参数: addr要发送的0x数
    //输出参数: void
    //说	  明:
    //
    void SendData(u8 addr)//发送函数。
    {
        u8 i;
     
         /*发送时关掉中断,防止中断影响时序  */
        SDA = 1; /*开始拉高*/
        delay1_us ( 1000 );
        SDA = 0; /*开始引导码*/
        delay1_us ( 3200 );/*此处延时最少要大于2ms*/
        for ( i = 0; i < 8; i++ ) /*总共8位数据  */
        {
            SDA = 1;
            if ( addr & 0x01 ) /*3:1表示数据位1,每个位用两个脉冲表示  */
            {
                delay1_us ( 600 );
                SDA = 0;
                delay1_us ( 200 );
            }
            else              /*1:3表示数据位0 ,每个位用两个脉冲表示  */
            {
                delay1_us ( 200 );
                SDA = 0;
                delay1_us ( 600 );
            }
            addr >>= 1;
        }
        SDA = 1;
        
    		//恢复中断
    }
    

    这段代码主要是对语音模块的一线串口进行了初始化和发送数据。

    在初始化过程中,使用GPIOB.11作为一线串口的数据线,设置为推挽输出模式,并将其拉低。

    在发送数据时,先将数据线拉高1ms作为起始信号,然后发送引导码,引导码是一个2ms以上的低电平,表示数据传输开始。接着发送数据,每个数据位用两个脉冲表示,其中数据位1用高电平占600us和低电平占200us的两个脉冲表示,数据位0用高电平占200us和低电平占600us的两个脉冲表示。最后将数据线拉高,表示数据传输结束。

    需要注意的是,在发送数据时需要关闭中断,以防止中断影响时序。在发送完数据后需要恢复中断。

    2.jq8900.h

    代码如下:

    #ifndef __JQ8900_H
    #define __JQ8900_H
     
    #include "sys.h"
     
    #define SDA PBout(11)
     
    void SendData ( u8 addr );    //发送函数。
    void OnUart_GPIO(void);       //GPIO
    void delay1_us(u32 nTimer);
    void show_number1();
    #endif
    

    3.main.c

    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    #include "jq8900.h"
    
     int main(void)
     {	
    	delay_init();	    //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
    	OnUart_GPIO();
    	while(1)
    	{
        show_number1();
        delay_ms(2000);
    	}
     }
    

    十分简单的一段代码,初始化一线串口后,死循环里调用函数show_number1(),每隔2秒播放一次音频。与esp32调用音频类似,同样是编写了播放音频1的程序。

    void show_number1()
    {
        //设置音量为20
        SendData(0x0a);    //清空数字
        SendData(0x02);    //音量20
        SendData(0x00);
        SendData(0x0c);    //设置音量
        delay_ms(2000);    //延时
        
        //选取曲目1播放
        SendData(0x0a);//清空数字
        SendData(0x01);//曲目数字,对应00001.mp3
        SendData(0x0b);//选曲播放
        delay_ms(2000);
        
        //开始播放
        //SendData(0x11);//开始播放
        //delay(2000);
    }
    

    这段代码主要是对语音模块进行操作,实现了播放指定曲目和设置音量等功能。

    在播放指定曲目时,通过发送曲目对应的数字和选曲播放命令,让语音模块播放指定曲目。在这段代码中,选取曲目1进行播放。

    在设置音量时,通过发送音量对应的数字和设置音量命令,让语音模块设置指定的音量。在这段代码中,设置音量为20。

    三、音频替换

    JQ8900可以通过数据线与电脑连接,类似一个小型U盘,我们可以借助一些文字转语言的软件,生成一些想要的.MP3格式文件,并修改命名为0000x。注意,JQ8900的flash只有4M,故一些大型音频最好别导入,太占空间。

    总结

    水了一篇文章,不过也完成了对JQ8900模块的进一步应用。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32驱动JQ8900语音模块教程

    发表评论