基于 WT2003H语音芯片在扫地机/洗地机语音更换+LCD扩展的应用介绍

  • 产品市场

   随着家用电子设备的普及,各种智能化设备进入人们生活中,如洗地机、扫地机等,目前大多数扫地机和洗地机都加了音效提示音,以及人工提示音,但较为单一,且部分应用无法随时更换语音,针对部分客户的特殊需求,去定制化语音方案。同时一些客户端的工程师,会经常感到主控MCU IO口不够,需要驱动电机、温度检测、LCD或数码管显示、语音控制播报等。唯创知音WT2003H语音芯片,能用一个IO实现复杂功能需求,留出主控MCU更多的IO口,去实现更多交互功能。

   本文以WT2003H0系列芯片+一颗外挂Flash为例,介绍WT2003H系列芯片即时更换语音功能,及唯创知音后续推出的扩展类,芯片语音播报+LCD驱动显示作一些简单介绍。

  • 产品应用框图

                  

 语音更新+语音播报+LCD驱动显示

单片机MCU

语音更换: 使用本司WT2003HX系列烧写下载器+上位机,通过串口快速进行语音更换

WT2003X系列语音芯片:WT2003H0-24SS

LCD驱动显示:唯创知音扩展类系列产品,本文这里仅对LCD12864作简单概述

  • 芯片功能特点

  

注: COM(位)- IO口可扩展作为数码管位选使用;

 LED(段) - IO口可扩展作为数码管段选使用;

 Key(按键)- IO口可扩展作为按键使用。

标准UART异步串口接口,属于3.3V TTL电平接口。通讯数据格式是:起始位:1位;数据位:8位;奇偶位:无;停止位:1位。使用电脑串口调试助手,需要正确设置串口的参数,设置如图:

起始码

长度

命令码

参数

累加和校验

结束码

0X7E

见下文

见下文

见下文

见下文

0XEF

注意:“长度”是指长度+命令码+参数+校验和的长度,“累加和校验”是指长度+命令码+参数的累加和的低字节。

注意:Flash语音播放可以实现FLash索引播放,组合播放,插播等指令;

CMD详解

对应功能

参数

A0

指定FLASH索引播放(全盘)

文件索引

A1

指定Flash根目录文件名

曲目信息

AA

播放暂停命令

AB

停止命令

AC

下一曲命令

AD

上一曲命令

AE

音量控制命令

音量级数

AF

指定播放模式

循环模式

B0

组合播放

曲目信息

B1

插播

曲目信息

B6 00

音频输出方式切换到SPK

B6 XX

B6 01

音频输出方式切换到DAC

B6 XX

B8

进入低功耗

B8 XX

表4通信查询命令

CMD详解

对应功能

参数

C0

查询当前软件版本

C0 XX XX XX XX

C1

查询当前设置音量

C1 XX

C2

读取当前工作状态

C2 XX

C3

查询Flash内音乐文件总数

C3 XX XX

C9

查询当前播放文件地址

C9 XX XX

FB

波特率切换指令

FB XX XX XX

  • 设计应用案例
  1. 器件选型

部位

型号

特性概述

主控

WT2003H0-24SS

16bit ADC和DAC、具有低功耗模式…

LCD

--

LCD显示屏,本文仅以LCD12864作简单概述,亦可选择其他LCD

电阻

0R/1K

电阻17个

电容

106/104

106两个,104一个

喇叭

--

1个

2.设计原理图

如上原理图所示,LCD12864 的 8 位数据口与芯片IO口相连, LCD12864 的 RS、RW、EN 脚与语音芯片的 4、5、6 管脚连接,LCD片选脚CS与芯片第20脚相连

3.部分代码示例

3.1语音芯片串口测试部分

extern u8 Rx_Buffer_t[UART_MAX_RX_BETY];

extern u32 Rx_Len_t;

extern u8 wt_uart_rx_flag_a;

static u8 test_mode = 0;

u8 Uart_Receive_Deal(void)

{

    u16 Code_Sum_t  = 0;

    u32 code_num = 0;

    code_num = Rx_Len_t;

    put_buf(Rx_Buffer_t,Rx_Len_t);

    if(Rx_Buffer_t[0] != CODE_HEAD)

    {

        //uart_buff();

        return 0;

    }

    if(Rx_Buffer_t[code_num - 1] != CODE_TAIL)

    {

        //uart_buff();

        return 0;

    }

    //累加和

    for(u8 i=1; i

    {

        Code_Sum_t += Rx_Buffer_t[i];

    }

    //校验

    if(Rx_Buffer_t[code_num - 2] != (Code_Sum_t & 0xff))

    {

        //uart_buff();

        return 0;

    }

    if(Rx_Buffer_t[2]==0xA1)

    {

        test_mode = Rx_Buffer_t[3];

        test_set_mode(test_mode);

    }

    else

    {

        log_info("Comand Erro!\n");

    }

    return 1;

}

3.2 LCD命令和数据写入

void Lcd_WriteCmd(cmd)      //写入命令到LCD

{

LCD12864_CS = 0;    //打开片选

LCD12864_RD = 1;    //读使能

LCD12864_RS = 0;       //选择命令

LCD12864_RW = 0;       //选择写模式

_nop_();

_nop_();

     _nop_();

DATA_PORT = cmd; //放置命令

_nop_();

_nop_();

    _nop_();

LCD12864_RW = 1;    //写入命令

}

void Lcd_WriteData(dat)       //写入数据到LCD

{

LCD12864_CS = 0;    //打开片选

LCD12864_RD = 1;    //读失能

LCD12864_RS = 1;       //选择数据

LCD12864_RW = 0;       //选择写模式

_nop_();

_nop_();

DATA_PORT = dat;       //放置数据

_nop_();

_nop_();

LCD12864_RW = 1;    //写数据

}

控制和发码时序图:


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部