基于51单片机的智能语音管家,主控采用STC89C516,语音识别模块采用LD3320语音识别单元,语言播报模块为JQ8900-16P,主要实现开关灯以及通过舵机实现开关门。

实验名称:LD3320A语音识别控制设计接线说明:
                  SG90舵机模块-->单片机IO
                  MOTOR-->P21
                  VCC-->5V
                  GND-->GND

                  LD3320A语音识别模块-->单片机IO
                  5V-->5V
                  GND-->GND
                  TXD-->P30
                  RXD-->P31

                  JQ8900-16P语音模块-->单片机IO
                  VPP-->P11
                  GND-->GND
                  VCC-->5V
                  SPK-/SPK+-->喇叭
         
实验现象:系统运行后,当对语音模块说出“小芳小芳”时,收到回复信息后,开始说出控制指令,项目中已设计:
                  开门、关门、开灯、关灯、晚安指令,每当说控制指令前,必须先说“小芳小芳”,等待回复后才能继续。
                  如果没有回复,系统会提示要说对应的指令。对应指令可控制舵机和LED的开关。
                        
注意事项:本程序适用于51全系列开发板。

首先将相应的程序烧录到LD3320,注意芯片型号,我的是STC11L48XE。
有些LD3320没有一键下载按钮,需要自己拔下VCC来再插上

然后打开串口调试助手试试吧,对着咪头说:“小芳小芳”

然后将JQ8900-16P通过USB线连接到电脑,把mp3文件复制进去。

最后把51的程序烧录到51单片机里,连接好线,就大功告成了!

制作出来的实物图如下:
image.png
单片机源程序如下:
/*  说明:口令模式: 即每次识别时都需要说“小芳小芳”这个口令 ,才能够进行下一级的识别,注释仅供参考!*/
  • #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;//信号指示灯
  • sbit RELAY=P1^0;
  • //+++
  • typedef unsigned char BYTE;
  • typedef unsigned int WORD;
  • //-----------------------------------------------
  • /* define constants */
  • #define FOSC 22118400L
  • //#define MODE1T                      //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
  • #ifdef MODE1T
  • #define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode  A99A
  • #else
  • #define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode
  • #endif
  • #ifdef MODE1T
  • #define T100US (65536-FOSC/10/1000)      //1ms timer calculation method in 1T mode
  • #else
  • #define T100US (65536-FOSC/10/12/1000)   //1ms timer calculation method in 12T mode
  • #endif
  • /* define SFR */
  • sbit SG90 = P1^7;
  • /* define variables */
  • WORD count;                         //1000 times counter
  • WORD nCount1 = 0;
  • WORD nCount2 = 0;
  • int bOpenDoor = 0;
  • int nT0Count = 0;
  • //-----------------------------------------------
  • /* Timer0 interrupt routine */
  • void tm0_isr() interrupt 1
  • {
  •     TL0 = T100US;                     //reload timer0 low byte
  •     TH0 = T100US >> 8;                //reload timer0 high byte
  •         nT0Count++;
  •         if(nT0Count >= 200)        //20ms
  •         {
  •                 nT0Count = 0;
  •         }
  •         if(bOpenDoor)
  •         {
  •                 if(nT0Count >= 20)
  •                 {
  •                         SG90 = 0;
  •                 }
  •                 else
  •                 {
  •                         SG90 = 1;        
  •                 }        
  •         }
  •         else
  •         {
  •                 if(nT0Count >= 5)
  •                 {
  •                         SG90 = 0;
  •                 }
  •                 else
  •                 {
  •                         SG90 = 1;        
  •                 }
  •         }
  • }
  • /***********************************************************
  • * 名    称: void  main(void)
  • * 功    能: 主函数        程序入口
  • * 入口参数:  
  • * 出口参数:
  • * 说    明:                                          
  • * 调用方法:
  • **********************************************************/
  • void  main(void)
  • {
  •         uint8 idata nAsrRes;
  •         uint8 i=0;        
  •          
  •         //+++
  • #ifdef MODE1T
  •     AUXR = 0x80;                    //timer0 work in 1T mode
  • #endif
  •     TMOD = 0x21;                    //set timer0 as mode1 (16-bit)
  •     TL0 = T100US;                     //initial timer0 low byte
  •     TH0 = T100US >> 8;                //initial timer0 high byte
  •     TR0 = 1;                        //timer0 start running
  •     ET0 = 1;                        //enable timer0 interrupt
  •     EA = 1;                         //open global interrupt switch
  •     count = 0;                      //initial counter
  •         Led_test();
  •         MCU_init();
  •         LD_Reset();
  •         UartIni(); /*串口初始化*/
  •         nAsrStatus = LD_ASR_NONE;                //        初始状态:没有在作ASR
  • //        PrintCom("Test demo by Xiao Ha .\r\n");
  •         
  • #ifdef TEST        
  •     PrintCom("一级口令:小芳小芳\r\n"); /*text.....*/
  •         PrintCom("二级口令:1、开门\r\n"); /*text.....*/
  •         PrintCom("        2、关门\r\n"); /*text.....*/
  •         PrintCom("        3、报警开\r\n"); /*text.....*/
  •         PrintCom("        4、报警关\r\n"); /*text.....*/
  •         PrintCom("  5、开灯\r\n"); /*text.....*/
  •         PrintCom("        6、关灯\r\n"); /*text.....*/
  •         PrintCom("        7、晚安\r\n"); /*text.....*/
  • #endif
  •         while(1)
  •         {
  •                 nCount1++;
  • //                if(nCount1%10000==0)
  • //                {
  • //                        nCount2++;
  • //                        if(nCount2%50 == 0)
  • //                        {
  • //                                bOpenDoor = !bOpenDoor;
  • //                        }
  • //                }                  
  •                 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;
  •         Delay200ms();
  •         LED=~ LED;
  •         Delay200ms();
  •         LED=~ LED;
  • }
  • /***********************************************************
  • * 名    称: void MCU_init()
  • * 功    能: 单片机初始化
  • * 入口参数:  
  • * 出口参数:
  • * 说    明:                                          
  • * 调用方法:
  • **********************************************************/
  • void MCU_init()
  • {
  •         P0 = 0xff;
  •         P1 = 0xff;
  •         P2 = 0xff;
  •         P3 = 0xff;
  •         P4 = 0xff;
  •         P1M0=0XFF;        //P1端口设置为推挽输出功能,即提高IO口驱动能力,从驱动继电器模块工作
  •         P1M1=0X00;
  •         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("开门\r\n"); /*text.....*/
  •                                                                                                          break;
  •                                         case CODE_KFBYZ:        
  •                                                 PrintCom("关门\r\n"); /*text.....*/
  •                                                                                                          break;
  •                                         case CODE_KD:                                       
  •                                                 PrintCom("报警开\r\n"); /*text.....*/
  •                                                                                                         break;
  •                                         case CODE_GD:                                       
  •                                                 PrintCom("报警关\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.....*/        
  •                         }
  • }         
  • 复制代码
    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png