锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于国产语音芯片KT142A加灵动微的MM32F031K8T6组成的语音提示器

时间:2023-10-17 13:37:01 国产电容器20200513

基于国产语音芯片KT142A加灵动微的MM32F031K8T由6组成的语音提示器

项目简介

不久前,我们公司有一个项目,需要在现有产品的基础上添加一些操作语音提示,这也是终端客户提出的,毕竟,有声音提醒,产品的操作体验一定要好得多,
所以我在网上到处寻找相关的的解决方案。我以前没有接触过这一块,我也是一个新手,所以我踩了很多坑。项目基本开发完成,总结记录开发

详细记录–网上找资料

经过一天的料一天后,发现网上数据导向,基本上只有两种选择方式
方案1:直接使用我们的主控芯片,灵活MM32F031K8T6 ,用内置的PWM,外挂一个spiflash将预存的声音文件wav格式,解码输出,外围加RC电路再加功放去实现
方案二:直接购买现成的语音芯片,通过串口或一线串口控制播放

目前我个人的结论是选择方案二,我的考虑是
1.事实上,选择方案1是最好的选择,但在网上找了很长时间后,我没有找到合适的例子。我自己的想法只是停留在知道如何实现它上,但有很多技术点需要处理flash文件管理需要处理wav解码速度快,声音效果慢,稳定性不可预测,可生产性等
最后,我在网上找到了一个芯片,KT142A,深圳市清月电子的,成本也合适,芯片使用起来也很简单。
外围有两个105电容
芯片也可以直接驱动
扬声器,买样品测试,声音很大,很清晰

在这里插入图片描述

硬件设计


实际打板回来,还是弄错了脚位,不得不单独
跳线,到KT142A在芯片的测试板上进行测试

不管怎样,这也很简单,只是一串来处理一切


调整后,更换板,完成任务

打板测试,4天,这个也不得不赞美嘉立创,20元钱包邮还能48小时发货,太厉害了

程序部分

由于我们产品的保密性,我们产品的内部程序细节不方便暴露。这里有一个官方的例子。事实上,移植仍然是一个非常简单的数量  #include "STK6037.h"  //运行晶振:11.05926MHZ #define TIMER0_H (65536-1800)/256//定时2Ms #define TIMER0_L (65536-1800)%256  #define SYS_Fosc 11059200 ///晶振频率  #define COMM_BAUD_RATE 9600 //串口波特率  #define OSC_FREQ 11059200 //11059200  static INT8U Send_buf[10] = { 
        0} ; static INT8U Recv_buf[10] = { 
        0} ;  static INT8U SendDataLen = 0 ; static INT8U ResendDataLen = 0 ;  /******************************串口1的波特率********************************/ //T作为波特率发生器//在波特率加倍情况下 
#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254 FF
#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 254 FE
#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 253 FD
#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 252 FC
#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 250 FA

/***************************************************************************************************** - 功能描述:10us的延时函数 - 隶属模块:常用函数库(内部) - 参数说明:无 - 返回参数:无 - 注: 在这里的运行环境是51,晶振为12MHZ *****************************************************************************************************/
void Delay_Us(INT32U z)
{ 
        
	while(z--);
}

/***********************毫秒级别延时************************/

void Delay_Ms(INT32U z)
{ 
        
	INT32U x=0 , y=0;
	for(x=110 ; x>0 ;x--)
	for(y=z; y>0;y-- );
}

/***************************************************************************************************** - 功能描述: 串口1初始化 - 隶属模块: 外部 - 参数说明: 无 - 返回说明: 无 - 注: 都是9600波特率 *****************************************************************************************************/
void Serial_init(void)
{ 
        
	TMOD = 0x20;                // 设置 T1 为波特率发生器
	SCON = 0x50;                // 0101,0000 8位数据位, 无奇偶校验
				   		
	PCON = 0x00;                //PCON=0;

	TH1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);//设置为9600波特率
	TL1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);

    TR1     = 1; 			   //定时器1打开
    REN     = 1;			   //串口1接收使能
    ES      = 1;			   //串口1中断使能
}


/******************************************************************************************** - 功能描述: 串口发送一个字节 - 隶属模块: 外部 - 参数说明: - 返回说明: - 注: ********************************************************************************************/
void Uart_PutByte(INT8U ch)
{ 
        
    SBUF  = ch;
    while(!TI){ 
        ;}
    TI = 0;
}

/***************************************************************************************************** - 功能描述: 串口发送一帧数据 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注:无 *****************************************************************************************************/
void SendCmd(INT8U len)
{ 
        
    INT8U i = 0 ;

    Uart_PutByte(0x7E); //起始
    for(i=0; i<len; i++)//数据
    { 
        
		Uart_PutByte(Send_buf[i]) ;
    }
    Uart_PutByte(0xEF) ;//结束
}


/******************************************************************************************** - 功能描述: 串口向外发送命令[包括控制和查询] - 隶属模块: 外部 - 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令 feedback:是否需要应答[0:不需要应答,1:需要应答] data:传送的参数 - 返回说明: - 注: ********************************************************************************************/
#define WORD_HIGH(x) ((u8)((u16)(x)>>8))
#define WORD_LOW(x) ((u8)((u16)(x)))
void Uart_SendCMD(u8 CMD ,u16 len , u16 dat)
{ 
        
    g_user.Send_buf[0] = CMD;
    g_user.Send_buf[1] = WORD_HIGH(len);
    g_user.Send_buf[2] = WORD_LOW(len);
    g_user.Send_buf[3] = WORD_HIGH(dat);
    g_user.Send_buf[4] = WORD_LOW(dat);
    SendCmd(5,1);                //发送此帧数据
}

void Uart_SendDat(u8 CMD , u8 *pbf ,u8 len)
{ 
        
    static u8 i = 0 ;
    g_user.Send_buf[0] = CMD ;         //保留字节
    g_user.Send_buf[1] = WORD_HIGH(len);
    g_user.Send_buf[2] = WORD_LOW(len);
    for(i=0 ; i<len ; i++)
    { 
        
        g_user.Send_buf[3+i] = *(pbf+i) ;
    }
    SendCmd(len+3 , 1 );  //发送此帧数据
}

u8 testbuf[6] = { 
        01,01,02,02,03,03} ;
u8 testlen = 6 ;

void main()
{ 
         
	Delay_Us(1) ;
	Delay_Ms(1) ;

	Serial_init() ;

    Delay_Ms(1000) ;//延时大概6S
    
    Uart_SendCMD(0x03 , 2 , 0x01) ;//播放第一首
    
    Delay_Ms(1000) ;//延时大概6S
    
    Uart_SendCMD(0x03 , 2 , 0x02) ;//播放第二首

    Delay_Ms(1000) ;//延时大概6S

    Uart_SendCMD(0x03 , 2 , 0x04) ;//播放第四首
    
     Delay_Ms(1000) ;//延时大概6S

    Uart_SendCMD(0x21 , testbuf , testlen) ;//组合播放文件夹01里面的001 ,文件夹02里面的002 ,文件夹03里面的003 ,

    while(1) ;
}

总结

其实这个项目,从确定需求,到最后做好样品,也就花了1个星期不到
查资料半天时间,确定方案
买样品3天时间,
打板测试,4天,这个也不得不得赞美一下嘉立创,20块钱包邮还能做到48小时发货,太厉害了
调程序,半天时间,搞掂,手工

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章