搜索

[PIC®/AVR® MCU] 【CuriosityNano测评报告】10.驱动JQ8400语音模块的实验

[复制链接]
159|4
 楼主 | 2021-4-20 20:08 | 显示全部楼层 |阅读模式
#申请原创#

    经过了将近一周的时间,终于完成了驱动JQ8400语音模块的实验。我使用的是还有SD卡槽的语音模块(详见下图):
JQ_02.jpg

    JQ8400语音模块的功能比较多,官方的简介如下:
JQ_03.jpg

    模块与单片机的通讯有一线串口通讯和两线串口通讯两种,其中两线串口通讯就是普通的串口通讯方式,通讯速率是9600,我是通过单片机的串口2与语音模块进行通讯的,测试过程的照片如下:
JQ_01.jpg

    开始按说明直接写代码,但没有成功,后来还是按步就班,通过厂家的调试工具先测试模块至正常放音,然后根据自动生成的数据来进一步了解和掌握其通讯协议,参照示例编写代码,厂家的调试工具如下:
JQ_04.jpg

    这是通过测试获得的数据:
JQ_06.jpg

    基础代码完成后,配合串口调试工具来观察实际数据:
JQ_05.jpg

    我使用模块的组合播放功能来播放动态时间,组合播放就是可以动态地将多个音频文件结合在一起接连播放,例如要播放当前时间,则事先录制好的语音文件按需要排列好,发送到语音模块后,模块便依次将这些语音播放出来,下面就是播放当前时间的函数:
  1. //播放当前时间
  2. void JQ8400_time(void)
  3. {
  4.     uint8_t i,j;
  5.     UartBuff[1] = 0x1B;  //组合播放
  6.     UartBuff[3] = 0x31;
  7.     UartBuff[4] = 0x35;  //现在是北京时间
  8.     i = 5;
  9.     if(hour>19){
  10.         UartBuff[i++] = 0x30;  //二
  11.         UartBuff[i++] = 0x32;
  12.         UartBuff[i++] = 0x31;  //十
  13.         UartBuff[i++] = 0x30;
  14.         if(hour>20){
  15.             UartBuff[i++] = 0x30;
  16.             UartBuff[i++] = 0x30 + hour%10;
  17.         }
  18.     }
  19.     else if(hour>9){
  20.         UartBuff[i++] = 0x31;  //十
  21.         UartBuff[i++] = 0x30;
  22.         if(hour>10){
  23.            UartBuff[i++] = 0x30;
  24.            UartBuff[i++] = 0x30 + hour%10;
  25.         }
  26.     }
  27.     else{
  28.         UartBuff[i++] = 0x30;
  29.         UartBuff[i++] = 0x30 + hour%10;
  30.     }
  31.     UartBuff[i++] = 0x31;
  32.     UartBuff[i++] = 0x36;          //点
  33.     if(minute>0){
  34.         if(minute>19){
  35.             UartBuff[i++] = 0x30;
  36.             UartBuff[i++] = 0x30 + minute/10;
  37.             UartBuff[i++] = 0x31;
  38.             UartBuff[i++] = 0x30;   //十
  39.             if(minute%10 > 0){
  40.                  UartBuff[i++] = 0x30;
  41.                  UartBuff[i++] = 0x30 + minute%10;
  42.             }
  43.         }
  44.         else if(minute > 9){
  45.             UartBuff[i++] = 0x31;
  46.             UartBuff[i++] = 0x30;    //十
  47.             if(minute%10 > 0){
  48.                 UartBuff[i++] = 0x30;
  49.                 UartBuff[i++] = 0x30 + minute%10;
  50.             }
  51.         }
  52.         else{
  53.             UartBuff[i++] = 0x30;
  54.             UartBuff[i++] = 0x30;
  55.             UartBuff[i++] = 0x30;
  56.             UartBuff[i++] = 0x30 + minute%10;
  57.         }
  58.         UartBuff[i++] = 0x31;
  59.         UartBuff[i++] = 0x37;        //分
  60.     }
  61.     else{
  62.         UartBuff[i++] = 0x32;
  63.         UartBuff[i++] = 0x36;  //整
  64.     }
  65.     UartBuff[2] = i - 3;       //长度
  66.     UartBuff[i] = 0;
  67.     for(j=0; j<i; j++){
  68.         UartBuff[i] += UartBuff[j];//和校验
  69.     }
  70.     JQ8400_send(i+1);
  71. }
复制代码


    下面是通过串口2向语音模块发送数据的函数,为方便测试,在发送时同时还通过串口3发送到电脑中:
  1. void JQ8400_send(uint8_t len)
  2. {
  3.     uint8_t i;
  4.     for(i=0; i<len; i++){
  5.         USART2_Write(UartBuff[i]);
  6.         USART3_Write(UartBuff[i]);
  7.     }   
  8. }
复制代码


    在测试过程中生成和编辑需要的音频文件也花费了不少时间,下面是测试的视频文件压缩包。
JQ_1.rar (919.89 KB, 下载次数: 1)
JQ_00.jpg

使用特权

评论回复
| 2021-4-20 22:06 | 显示全部楼层
强! 现在算是完整的门铃了吧?

使用特权

评论回复
 楼主 | 2021-4-21 09:17 | 显示全部楼层
pzsh 发表于 2021-4-20 22:06
强! 现在算是完整的门铃了吧?

    这次实验项目是多功能时钟,具有日历时钟、定时、计时和闹铃等功能,目前项目基本功能已经完成,还需要进一步优化和完善。

使用特权

评论回复
| 2021-4-21 15:50 | 显示全部楼层
感觉很多语音场景都能用上

使用特权

评论回复
 楼主 | 2021-4-21 18:56 | 显示全部楼层
lcczg 发表于 2021-4-21 15:50
感觉很多语音场景都能用上

是的,添加了语音的电子产品更容易受到大家的喜爱。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表