找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1027|回复: 0
收起左侧

基于51单片机和LD3320的智能语音管家程序,语音控制开关灯,可二次开发

[复制链接]
ID:1069230 发表于 2023-6-4 20:15 | 显示全部楼层 |阅读模式
基于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单片机里,连接好线,就大功告成了!

制作出来的实物图如下:

总览

总览


单片机源程序如下:
  1. /*  说明:口令模式: 即每次识别时都需要说“小芳小芳”这个口令 ,才能够进行下一级的识别,注释仅供参考!*/

  2. #include "config.h"
  3. /************************************************************************************/
  4. //        nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
  5. //        LD_ASR_NONE:                表示没有在作ASR识别
  6. //        LD_ASR_RUNING:                表示LD3320正在作ASR识别中
  7. //        LD_ASR_FOUNDOK:                表示一次识别流程结束后,有一个识别结果
  8. //        LD_ASR_FOUNDZERO:        表示一次识别流程结束后,没有识别结果
  9. //        LD_ASR_ERROR:                表示一次识别流程中LD3320芯片内部出现不正确的状态
  10. /***********************************************************************************/
  11. uint8 idata nAsrStatus=0;        
  12. void MCU_init();
  13. void ProcessInt0(); //识别处理函数
  14. void delay(unsigned long uldata);
  15. void User_handle(uint8 dat);//用户执行操作函数
  16. void Delay200ms();
  17. void Led_test(void);//单片机工作指示
  18. uint8_t G0_flag=DISABLE;//运行标志,ENABLE:运行。DISABLE:禁止运行
  19. sbit LED=P4^2;//信号指示灯

  20. sbit RELAY=P1^0;

  21. //+++
  22. typedef unsigned char BYTE;
  23. typedef unsigned int WORD;

  24. //-----------------------------------------------

  25. /* define constants */
  26. #define FOSC 22118400L
  27. //#define MODE1T                      //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode

  28. #ifdef MODE1T
  29. #define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode  A99A
  30. #else
  31. #define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode
  32. #endif

  33. #ifdef MODE1T
  34. #define T100US (65536-FOSC/10/1000)      //1ms timer calculation method in 1T mode
  35. #else
  36. #define T100US (65536-FOSC/10/12/1000)   //1ms timer calculation method in 12T mode
  37. #endif

  38. /* define SFR */
  39. sbit SG90 = P1^7;

  40. /* define variables */
  41. WORD count;                         //1000 times counter

  42. WORD nCount1 = 0;
  43. WORD nCount2 = 0;

  44. int bOpenDoor = 0;
  45. int nT0Count = 0;

  46. //-----------------------------------------------

  47. /* Timer0 interrupt routine */
  48. void tm0_isr() interrupt 1
  49. {
  50.     TL0 = T100US;                     //reload timer0 low byte
  51.     TH0 = T100US >> 8;                //reload timer0 high byte

  52.         nT0Count++;

  53.         if(nT0Count >= 200)        //20ms
  54.         {
  55.                 nT0Count = 0;
  56.         }

  57.         if(bOpenDoor)
  58.         {
  59.                 if(nT0Count >= 20)
  60.                 {
  61.                         SG90 = 0;
  62.                 }
  63.                 else
  64.                 {
  65.                         SG90 = 1;        
  66.                 }        
  67.         }
  68.         else
  69.         {
  70.                 if(nT0Count >= 5)
  71.                 {
  72.                         SG90 = 0;
  73.                 }
  74.                 else
  75.                 {
  76.                         SG90 = 1;        
  77.                 }
  78.         }
  79. }
  80. /***********************************************************
  81. * 名    称: void  main(void)
  82. * 功    能: 主函数        程序入口
  83. * 入口参数:  
  84. * 出口参数:
  85. * 说    明:                                          
  86. * 调用方法:
  87. **********************************************************/
  88. void  main(void)
  89. {
  90.         uint8 idata nAsrRes;
  91.         uint8 i=0;        
  92.          
  93.         //+++
  94. #ifdef MODE1T
  95.     AUXR = 0x80;                    //timer0 work in 1T mode
  96. #endif
  97.     TMOD = 0x21;                    //set timer0 as mode1 (16-bit)
  98.     TL0 = T100US;                     //initial timer0 low byte
  99.     TH0 = T100US >> 8;                //initial timer0 high byte
  100.     TR0 = 1;                        //timer0 start running
  101.     ET0 = 1;                        //enable timer0 interrupt
  102.     EA = 1;                         //open global interrupt switch
  103.     count = 0;                      //initial counter

  104.         Led_test();
  105.         MCU_init();
  106.         LD_Reset();
  107.         UartIni(); /*串口初始化*/
  108.         nAsrStatus = LD_ASR_NONE;                //        初始状态:没有在作ASR

  109. //        PrintCom("Test demo by Xiao Ha .\r\n");
  110.         
  111. #ifdef TEST        
  112.     PrintCom("一级口令:小芳小芳\r\n"); /*text.....*/
  113.         PrintCom("二级口令:1、开门\r\n"); /*text.....*/
  114.         PrintCom("        2、关门\r\n"); /*text.....*/
  115.         PrintCom("        3、报警开\r\n"); /*text.....*/
  116.         PrintCom("        4、报警关\r\n"); /*text.....*/
  117.         PrintCom("  5、开灯\r\n"); /*text.....*/
  118.         PrintCom("        6、关灯\r\n"); /*text.....*/
  119.         PrintCom("        7、晚安\r\n"); /*text.....*/
  120. #endif

  121.         while(1)
  122.         {
  123.                 nCount1++;

  124. //                if(nCount1%10000==0)
  125. //                {
  126. //                        nCount2++;
  127. //                        if(nCount2%50 == 0)
  128. //                        {
  129. //                                bOpenDoor = !bOpenDoor;
  130. //                        }
  131. //                }                  

  132.                 switch(nAsrStatus)
  133.                 {
  134.                         case LD_ASR_RUNING:
  135.                         case LD_ASR_ERROR:               
  136.                                 break;
  137.                         case LD_ASR_NONE:
  138.                         {
  139.                                 nAsrStatus=LD_ASR_RUNING;
  140.                                 if (RunASR()==0)        /*        启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
  141.                                 {
  142.                                         nAsrStatus = LD_ASR_ERROR;
  143.                                 }
  144.                                 break;
  145.                         }
  146.                         case LD_ASR_FOUNDOK: /*        一次ASR识别流程结束,去取ASR识别结果*/
  147.                         {                                
  148.                                 nAsrRes = LD_GetResult();                /*获取结果*/
  149.                                 User_handle(nAsrRes);//用户执行函数
  150.                                 nAsrStatus = LD_ASR_NONE;
  151.                                 break;
  152.                         }
  153.                         case LD_ASR_FOUNDZERO:
  154.                         default:
  155.                         {
  156.                                 nAsrStatus = LD_ASR_NONE;
  157.                                 break;
  158.                         }
  159.                 }// switch                                 
  160.         }// while

  161. }
  162. /***********************************************************
  163. * 名    称:          LED灯测试
  164. * 功    能: 单片机是否工作指示
  165. * 入口参数: 无
  166. * 出口参数:无
  167. * 说    明:                                          
  168. **********************************************************/
  169. void Led_test(void)
  170. {
  171.         LED=~ LED;
  172.         Delay200ms();
  173.         LED=~ LED;
  174.         Delay200ms();
  175.         LED=~ LED;
  176.         Delay200ms();
  177.         LED=~ LED;
  178.         Delay200ms();
  179.         LED=~ LED;
  180.         Delay200ms();
  181.         LED=~ LED;
  182. }
  183. /***********************************************************
  184. * 名    称: void MCU_init()
  185. * 功    能: 单片机初始化
  186. * 入口参数:  
  187. * 出口参数:
  188. * 说    明:                                          
  189. * 调用方法:
  190. **********************************************************/
  191. void MCU_init()
  192. {
  193.         P0 = 0xff;
  194.         P1 = 0xff;
  195.         P2 = 0xff;
  196.         P3 = 0xff;
  197.         P4 = 0xff;

  198.         P1M0=0XFF;        //P1端口设置为推挽输出功能,即提高IO口驱动能力,从驱动继电器模块工作
  199.         P1M1=0X00;

  200.         LD_MODE = 0;                //        设置MD管脚为低,并行模式读写
  201.         IE0=1;
  202.         EX0=1;
  203.         EA=1;
  204. }
  205. /***********************************************************
  206. * 名    称:        延时函数
  207. * 功    能:
  208. * 入口参数:  
  209. * 出口参数:
  210. * 说    明:                                          
  211. * 调用方法:
  212. **********************************************************/
  213. void Delay200us()                //@22.1184MHz
  214. {
  215.         unsigned char i, j;
  216.         _nop_();
  217.         _nop_();
  218.         i = 5;
  219.         j = 73;
  220.         do
  221.         {
  222.                 while (--j);
  223.         } while (--i);
  224. }

  225. void  delay(unsigned long uldata)
  226. {
  227.         unsigned int j  =  0;
  228.         unsigned int g  =  0;
  229.         while(uldata--)
  230.         Delay200us();
  231. }

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

  235.         i = 17;
  236.         j = 208;
  237.         k = 27;
  238.         do
  239.         {
  240.                 do
  241.                 {
  242.                         while (--k);
  243.                 } while (--j);
  244.         } while (--i);
  245. }

  246. /***********************************************************
  247. * 名    称: 中断处理函数
  248. * 功    能:
  249. * 入口参数:  
  250. * 出口参数:
  251. * 说    明:                                          
  252. * 调用方法:
  253. **********************************************************/
  254. void ExtInt0Handler(void) interrupt 0  
  255. {         
  256.         ProcessInt0();                                
  257. }
  258. /***********************************************************
  259. * 名    称:用户执行函数
  260. * 功    能:识别成功后,执行动作可在此进行修改
  261. * 入口参数: 无
  262. * 出口参数:无
  263. * 说    明:                                          
  264. **********************************************************/
  265. void         User_handle(uint8 dat)
  266. {
  267.      //UARTSendByte(dat);//串口识别码(十六进制)
  268.                  if(0==dat)
  269.                  {
  270.                   G0_flag=ENABLE;
  271.                         LED=0;
  272.                         PrintCom("收到\r\n"); /*text.....*/
  273.                  }
  274.                  else if(ENABLE==G0_flag)
  275.                  {        
  276.                                  G0_flag=DISABLE;
  277.                                 LED=1;
  278.                          switch(dat)                   /*对结果执行相关操作,客户可删除Printcom 串口输出语句替换为其他需要控制的代码*/
  279.                           {
  280.                                   case CODE_DMCS:                        
  281.                                                 PrintCom("开门\r\n"); /*text.....*/
  282.                                                                                                          break;
  283.                                         case CODE_KFBYZ:        
  284.                                                 PrintCom("关门\r\n"); /*text.....*/
  285.                                                                                                          break;
  286.                                         case CODE_KD:                                       
  287.                                                 PrintCom("报警开\r\n"); /*text.....*/
  288.                                                                                                         break;
  289.                                         case CODE_GD:                                       
  290.                                                 PrintCom("报警关\r\n"); /*text.....*/
  291.                                                                                                         break;
  292.                                         case CODE_BJ:                                                
  293.                                                 PrintCom("开灯\r\n"); /*text.....*/
  294.                                                                                                         break;
  295.                                         case CODE_SH:                                                
  296.                                                 PrintCom("关灯\r\n"); /*text.....*/
  297.                                                                                                         break;
  298.                                         case CODE_GZ:                                       
  299.                                                 PrintCom("晚安\r\n"); /*text.....*/
  300.                                                                                                         break;                                                                                                                                                                                                                        
  301.                                                         default:PrintCom("没听清\r\n"); /*text.....*/break;
  302.                                 }        
  303.                         }        
  304.                         else         
  305.                         {
  306.                                 PrintCom("请叫小芳小芳\r\n"); /*text.....*/        
  307.                         }
  308. }         
复制代码

烧录LD3320

烧录LD3320

LD3320烧录完成

LD3320烧录完成

串口调试助手测试

串口调试助手测试

通过usb连接JQ8900-16P

通过usb连接JQ8900-16P

JQ8900-16P原理图

JQ8900-16P原理图

JQ8900-16P里面MP3文件

JQ8900-16P里面MP3文件

文件结构

文件结构

新建文件夹.7z

1.28 MB, 下载次数: 26, 下载积分: 黑币 -5

程序

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表