LD3320语音模块实现“小白开灯”则实现开灯指令

首先需要先一一对应1

uint8 LD_AsrAddFixed()
{
    uint8 k, flag;
    uint8 nAsrAddLength;
    #define DATE_A 8   /*数组二维数值*/
    #define DATE_B 30        /*数组一维数值*/
    uint8 code sRecog[DATE_A][DATE_B] = {
                                                                                "xiao bai",\        
                                                                                "kai deng",\
                                                                                 "guan deng",\
                                                                                 "da kai ji dian qi",\
                                                                                 "guan bi ji dian qi",\
                                                                                 "kai deng",\
                                                                                 "guan deng",\
                                                                                 "wan an"
                                                                            };    /*添加关键词,用户修改*/
    uint8 code pCode[DATE_A] = {
                                                            CODE_CMD,\
                                                            CODE_DMCS,\
                                                            CODE_KFBYZ,\
                                                            CODE_KD,\
                                                            CODE_GD,\
                                                            CODE_BJ,\
                                                            CODE_SH,\
                                                            CODE_GZ
                                                         };    /*添加识别码,用户修改*/    
    flag = 1;
    for (k=0; k<DATE_A; k++)
    {
            
        if(LD_Check_ASRBusyFlag_b2() == 0)
        {
            flag = 0;
            break;
        }
        
        LD_WriteReg(0xc1, pCode[k] );
        LD_WriteReg(0xc3, 0 );
        LD_WriteReg(0x08, 0x04);
        delay(1);
        LD_WriteReg(0x08, 0x00);
        delay(1);

        for (nAsrAddLength=0; nAsrAddLength<DATE_B; nAsrAddLength++)
        {
            if (sRecog[k][nAsrAddLength] == 0)
                break;
            LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
        }
        LD_WriteReg(0xb9, nAsrAddLength);
        LD_WriteReg(0xb2, 0xff);
        LD_WriteReg(0x37, 0x04);
    }
    return flag;
}

随后主函数要写

/******************************************************
**  工程名称:UNV-01语音识别模块驱动程序
**    CPU: STC11L08XE
**    晶振:22.1184MHZ
**    波特率:9600 bit/S
**    配套产品信息:UNV-LD3320+STC11语音识别开发板
**  修改日期:2018.5.13
**  说明:口令模式: 即每次识别时都需要说“小鹰”这个口令 ,才能够进行下一级的识别
***************************/
#include "config.h"
/************************************************************************************/
//    nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
//    LD_ASR_NONE:        表示没有在作ASR识别
//    LD_ASR_RUNING:        表示LD3320正在作ASR识别中
//    LD_ASR_FOUNDOK:        表示一次识别流程结束后,有一个识别结果
//    LD_ASR_FOUNDZERO:    表示一次识别流程结束后,没有识别结果
//    LD_ASR_ERROR:        表示一次识别流程中LD3320芯片内部出现不正确的状态
/***********************************************************************************/
uint8 idata nAsrStatus=0;    
void MCU_init(); 
void ProcessInt0(); //识别处理函数
void delay(unsigned long uldata);
void User_handle(uint8 dat);//用户执行操作函数
void Delay200ms();
void Led_test(void);//单片机工作指示
uint8_t G0_flag=DISABLE;//运行标志,ENABLE:运行。DISABLE:禁止运行 
sbit LED=P4^2;//信号指示灯

/***********************************************************
* 名    称: void  main(void)
* 功    能: 主函数    程序入口
* 入口参数:  
* 出口参数:
* 说    明:                      
* 调用方法: 
**********************************************************/ 
void  main(void)
{
    uint8 idata nAsrRes;
    uint8 i=0;
    Led_test();
    MCU_init();
    LD_Reset();
    UartIni(); /*串口初始化*/
    nAsrStatus = LD_ASR_NONE;        //    初始状态:没有在作ASR
    


    while(1)
    {
        switch(nAsrStatus)
        {
            case LD_ASR_RUNING:
            case LD_ASR_ERROR:        
                break;
            case LD_ASR_NONE:
            {
                nAsrStatus=LD_ASR_RUNING;
                if (RunASR()==0)    /*    启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
                {
                    nAsrStatus = LD_ASR_ERROR;
                }
                break;
            }
            case LD_ASR_FOUNDOK: /*    一次ASR识别流程结束,去取ASR识别结果*/
            {                
                nAsrRes = LD_GetResult();        /*获取结果*/
                User_handle(nAsrRes);//用户执行函数 
                nAsrStatus = LD_ASR_NONE;
                break;
            }
            case LD_ASR_FOUNDZERO:
            default:
            {
                nAsrStatus = LD_ASR_NONE;
                break;
            }
        }// switch                 
    }// while

}
/***********************************************************
* 名    称:      LED灯测试
* 功    能: 单片机是否工作指示
* 入口参数: 无 
* 出口参数:无
* 说    明:                      
**********************************************************/
void Led_test(void)
{
    LED=~ LED;
    Delay200ms();
    LED=~ LED;
    Delay200ms();
    LED=~ LED;
    Delay200ms();
    LED=~ LED;
}
/***********************************************************
* 名    称: void MCU_init()
* 功    能: 单片机初始化
* 入口参数:  
* 出口参数:
* 说    明:                      
* 调用方法: 
**********************************************************/ 
void MCU_init()
{
    P0 = 0xff;
    P1 = 0xff;
    P2 = 0xff;
    P3 = 0xff;
    P4 = 0xff;
    

    LD_MODE = 0;        //    设置MD管脚为低,并行模式读写
    IE0=1;
    EX0=1;
    EA=1;
}
/***********************************************************
* 名    称:    延时函数
* 功    能:
* 入口参数:  
* 出口参数:
* 说    明:                      
* 调用方法: 
**********************************************************/ 
void Delay200us()        //@22.1184MHz
{
    unsigned char i, j;
    _nop_();
    _nop_();
    i = 5;
    j = 73;
    do
    {
        while (--j);
    } while (--i);
}

void  delay(unsigned long uldata)
{
    unsigned int j  =  0;
    unsigned int g  =  0;
    while(uldata--)
    Delay200us();
}

void Delay200ms()        //@22.1184MHz
{
    unsigned char i, j, k;

    i = 17;
    j = 208;
    k = 27;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

/***********************************************************
* 名    称: 中断处理函数
* 功    能:
* 入口参数:  
* 出口参数:
* 说    明:                      
* 调用方法: 
**********************************************************/ 
void ExtInt0Handler(void) interrupt 0  
{     
    ProcessInt0();                
}
/***********************************************************
* 名    称:用户执行函数 
* 功    能:识别成功后,执行动作可在此进行修改 
* 入口参数: 无 
* 出口参数:无
* 说    明:                      
**********************************************************/
void     User_handle(uint8 dat)
{
     //UARTSendByte(dat);//串口识别码(十六进制)
         if(0==dat)
         {
          G0_flag=ENABLE;
            LED=0;
            PrintCom("收到\r\n"); /*text.....*/
         }
         else if(ENABLE==G0_flag)
         {    
                 G0_flag=DISABLE;
                LED=1;
             switch(dat)           /*对结果执行相关操作,客户可删除Printcom 串口输出语句替换为其他需要控制的代码*/
              {
                  case CODE_DMCS:            
                        PrintCom("00\r\n"); /*text.....*/
                                                     break;
                    case CODE_KFBYZ:    
                        PrintCom("01\r\n"); /*关灯*/
                                                     break;
                    case CODE_KD:                    
                            PrintCom("02\r\n"); /*text.....*/
                                                    break;
                    case CODE_GD:                    
                        PrintCom("03\r\n"); /*text.....*/
                                                    break;
                    case CODE_BJ:                        
                        PrintCom("“开灯”命令识别成功\r\n"); /*text.....*/
                                                    break;
                    case CODE_SH:                        
                        PrintCom("“关灯”命令识别成功\r\n"); /*text.....*/
                                                    break;
                    case CODE_GZ:                    
                        PrintCom("“晚安”命令识别成功\r\n"); /*text.....*/
                                                    break;                                                                                                            
                            default:PrintCom("请重新识别发口令\r\n"); /*text.....*/break;
                }    
            }    
            else     
            {
                PrintCom("请说出一级口令\r\n"); /*text.....*/    
            }
}     
 

这样当识别到开灯指令会串口输出01

然后编译

会出现这个文件

 随后在这个软件进行烧写

 将LD3320语音模块与USB转TTL连接

 

 然后烧录的时候按一下LD3320上面的复位按键,烧录成功!

猜你喜欢

转载自blog.csdn.net/a1060916181/article/details/129664489