打印
[MM32软件]

【MM32 eMiniBoard测评报告】+驱动JQ8400语音模块

[复制链接]
1930|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
    JQ8400是一个语音模块,可以用多种方式来播放事先录制好的wav和mp3文件,其具备一线串口ONE LINE的引脚,单片机可以通过这个引脚发送指令,控制语音模块的工作。一线串口的指令格式如下图:



    由于语音模块使用的是5V电源,但评测板上却没有5V电源的输出引脚(开始未曾想起arduino接口),只好在评测板上查看,结果在电源芯片旁找到一个5V电源焊盘(下图红色箭头所示):



    于是在此焊上了一根排针:



    在调试引脚时序的延时,开始使用的是例程提供的delay_ms函数,测试发现会对系统正常延时产生较大的干扰,最后还是另写了一个延时小函数才测试通过。
    最后通过逻辑分析仪来调整一线串口的时序,将时序调整到协议的要求。高电平的持续时间要求是1200ms,我调整到约1300ms:




    低电平的持续时间是400ms,我调整到432ms,满足了协议要求:



    下图为测试过程:


    测试结束时忽然想起评测板上提供了arduino接口,这个接口标准上应该会有5V电源,于是又将评测板上的杜邦线取下,检查发现其中的VCC就是5V电源接口:



    然后在arduino电源接口上焊上排针,重新将LCD显示屏、DS1307日历模块以及JQ8400语音模块重新连接好:



    下面是JQ8400语音模块添加的代码:

#include "jq8400.h"


extern uint16_t son_buf[10];

/***************************************************
*程 序 名:delayms()
*作    用:毫秒延时程序
*输入参数:延时时间(毫秒)
*返回参数:无
*备    注:
***************************************************/
void delayms(uint16_t xms)  
{
    uint16_t x,y;
    for(x=xms;x>0;x--)   
    for(y=4;y>0;y--);
}


/***************************************************
*程 序 名:JQ8400_Config()
*作    用:配置引脚
*输入参数:无
*返回参数:无
*备    注:使用PD3作数据通讯
***************************************************/
void JQ8400_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
   
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
   
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/***************************************************
*程 序 名:JQ8400Send(uint8_t dat)
*作    用:发送数据到JQ8400(单总线)
*输入参数:dat (要发送的数据)
*返回参数:无
*备    注:低位先,高低电平1:3=0,高低电平3:1=1
***************************************************/
void JQ8400Send(uint8_t dat)
{
    uint8_t i;

    Dat_H();
    delayms(1000);     //拉高1毫秒
        Dat_L();         //发出引导信号
        delayms(2000);     //拉低2毫秒
//测试情况
//可用   1500:500,1200:400,900:300,750:250
//不可用 300:100,
//不稳定 600:200
//
//
        for ( i=0; i<8; i++ )
    {
        Dat_H();          //拉高,准备延时>2ms

        if( dat & 0x01 )  //高电平,延时3:1表示数据位1
        {
            delayms(1200);  //750(>1.2ms)
            Dat_L();
            delayms(400);  //250(>0.4ms)
        }
        else              //低电平,延时1:3表示数据位0
        {
            delayms(400);
            Dat_L();
            delayms(1200);
        }
        dat >>= 1;
    }

        Dat_H();
        delayms(20);          //间隔>10毫秒

}


/***************************************************
*程 序 名:JQ_Vol(uint8_t vol)
*作    用:设置音量大小(0~30)
*输入参数:vol (1~3)
*返回参数:无
*备    注:
***************************************************/
void JQ_Vol(uint8_t vol)
{
        uint8_t n;
       
        JQ8400Send(0x0a);
    n = vol / 10;
        JQ8400Send(n);              //十位
        n = vol % 10;
    JQ8400Send(n);              //个位
        JQ8400Send(0x0c);
}


/***************************************************
*程 序 名:JQ_Stop()
*作    用:停止放音
*输入参数:无
*返回参数:无
*备    注:
***************************************************/
void JQ_Stop(void)
{
    JQ8400Send(0x13);
}


/***************************************************
*程 序 名:JQ_Next()
*作    用:下一曲
*输入参数:无
*返回参数:无
*备    注:
***************************************************/
void JQ_Next(void)
{
    JQ8400Send(0x15);
}


/***************************************************
*程 序 名:JQ_All(uint16_t nb)
*作    用:播放指定语音
*输入参数:文件名(序号)
*返回参数:无
*备    注:文件名应为全数字字符
***************************************************/
void JQ_All(uint16_t nb)
{
    uint8_t n,b;          //当前位数字,b=1 有效数字开始
       
        JQ8400Send(0x0a);     //清零数字
        n = nb / 10000;       //万位
        if(n>0){
        JQ8400Send(n);
            b = 1;
        }
        n = nb % 10000 / 1000;//千位
        if(n > 0 | b > 0){
            JQ8400Send(n);
                b = 1;
        }
        n = nb % 1000 / 100;  //百位
        if(n > 0 | b > 0){
            JQ8400Send(n);
                b = 1;
        }
        n = nb % 100 / 10;    //十位
        if(n > 0 | b > 0){
            JQ8400Send(n);
        }
        n = nb % 10;          //个位
    JQ8400Send(n);
       
        JQ8400Send(0x0b);     //选曲确认
        JQ8400Send(0x11);     //开始播放
}



JQ8400_07.jpg (373.25 KB )

JQ8400_07.jpg

使用特权

评论回复
沙发
Betty996| | 2021-1-10 12:45 | 只看该作者
感谢楼主分享,这个语音芯片我还是很感兴趣的,搜了一下,原来可以串口操作,还可以一线操作,很棒

使用特权

评论回复
板凳
wahahaheihei| | 2021-1-11 22:19 | 只看该作者
楼主DIY的板子真棒

使用特权

评论回复
地板
hu9jj|  楼主 | 2021-1-12 09:28 | 只看该作者
Betty996 发表于 2021-1-10 12:45
感谢楼主分享,这个语音芯片我还是很感兴趣的,搜了一下,原来可以串口操作,还可以一线操作,很棒 ...

是的,主要是可以播放自己录制的声音文件,方便用于各种家电或控制装置中。

使用特权

评论回复
5
hu9jj|  楼主 | 2021-1-12 09:31 | 只看该作者

这只是初期用洞洞板制作的扩展板,现在都用自己设计的PCB板,比买洞洞板更方便。

使用特权

评论回复
6
chenqianqian| | 2021-1-15 07:54 | 只看该作者
不错,学习了。

使用特权

评论回复
7
lidi911| | 2021-1-15 12:40 | 只看该作者
这个语音模块是在某宝上买的?

使用特权

评论回复
8
hu9jj|  楼主 | 2021-1-15 14:05 | 只看该作者
lidi911 发表于 2021-1-15 12:40
这个语音模块是在某宝上买的?

是的,现在网购真方便。

使用特权

评论回复
9
嵌入小菜菜| | 2021-1-15 17:08 | 只看该作者
用的是什么软件测试的,可以分享一下吗?

使用特权

评论回复
10
hu9jj|  楼主 | 2021-1-15 17:52 | 只看该作者
嵌入小菜菜 发表于 2021-1-15 17:08
用的是什么软件测试的,可以分享一下吗?

就是移植的商家提供的代码,已经全文发布在一楼。

使用特权

评论回复
11
里面有晴雨| | 2021-1-15 17:53 | 只看该作者
这是谁家的语音模块?分享一下。

使用特权

评论回复
12
hu9jj|  楼主 | 2021-1-15 19:52 | 只看该作者
里面有晴雨 发表于 2021-1-15 17:53
这是谁家的语音模块?分享一下。

JQ8400,某宝搜索一下,会有很多的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1059

帖子

11

粉丝