#申请原创#
经过了将近一周的时间,终于完成了驱动JQ8400语音模块的实验。我使用的是还有SD卡槽的语音模块(详见下图):
JQ8400语音模块的功能比较多,官方的简介如下:
模块与单片机的通讯有一线串口通讯和两线串口通讯两种,其中两线串口通讯就是普通的串口通讯方式,通讯速率是9600,我是通过单片机的串口2与语音模块进行通讯的,测试过程的照片如下:
开始按说明直接写代码,但没有成功,后来还是按步就班,通过厂家的调试工具先测试模块至正常放音,然后根据自动生成的数据来进一步了解和掌握其通讯协议,参照示例编写代码,厂家的调试工具如下:
这是通过测试获得的数据:
基础代码完成后,配合串口调试工具来观察实际数据:
我使用模块的组合播放功能来播放动态时间,组合播放就是可以动态地将多个音频文件结合在一起接连播放,例如要播放当前时间,则事先录制好的语音文件按需要排列好,发送到语音模块后,模块便依次将这些语音播放出来,下面就是播放当前时间的函数:
//播放当前时间
void JQ8400_time(void)
{
uint8_t i,j;
UartBuff[1] = 0x1B; //组合播放
UartBuff[3] = 0x31;
UartBuff[4] = 0x35; //现在是北京时间
i = 5;
if(hour>19){
UartBuff[i++] = 0x30; //二
UartBuff[i++] = 0x32;
UartBuff[i++] = 0x31; //十
UartBuff[i++] = 0x30;
if(hour>20){
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30 + hour%10;
}
}
else if(hour>9){
UartBuff[i++] = 0x31; //十
UartBuff[i++] = 0x30;
if(hour>10){
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30 + hour%10;
}
}
else{
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30 + hour%10;
}
UartBuff[i++] = 0x31;
UartBuff[i++] = 0x36; //点
if(minute>0){
if(minute>19){
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30 + minute/10;
UartBuff[i++] = 0x31;
UartBuff[i++] = 0x30; //十
if(minute%10 > 0){
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30 + minute%10;
}
}
else if(minute > 9){
UartBuff[i++] = 0x31;
UartBuff[i++] = 0x30; //十
if(minute%10 > 0){
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30 + minute%10;
}
}
else{
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30;
UartBuff[i++] = 0x30 + minute%10;
}
UartBuff[i++] = 0x31;
UartBuff[i++] = 0x37; //分
}
else{
UartBuff[i++] = 0x32;
UartBuff[i++] = 0x36; //整
}
UartBuff[2] = i - 3; //长度
UartBuff[i] = 0;
for(j=0; j<i; j++){
UartBuff[i] += UartBuff[j];//和校验
}
JQ8400_send(i+1);
}
下面是通过串口2向语音模块发送数据的函数,为方便测试,在发送时同时还通过串口3发送到电脑中:
void JQ8400_send(uint8_t len)
{
uint8_t i;
for(i=0; i<len; i++){
USART2_Write(UartBuff[i]);
USART3_Write(UartBuff[i]);
}
}
在测试过程中生成和编辑需要的音频文件也花费了不少时间,下面是测试的视频文件压缩包。
JQ_1.rar
(919.89 KB)
|