標(biāo)題: 基于51單片機(jī)和LD3320的智能語音管家程序,語音控制開關(guān)燈,可二次開發(fā) [打印本頁]

作者: magica1    時間: 2023-6-4 20:15
標(biāo)題: 基于51單片機(jī)和LD3320的智能語音管家程序,語音控制開關(guān)燈,可二次開發(fā)
基于51單片機(jī)的智能語音管家,主控采用STC89C516,語音識別模塊采用LD3320語音識別單元,語言播報(bào)模塊為JQ8900-16P,主要實(shí)現(xiàn)開關(guān)燈以及通過舵機(jī)實(shí)現(xiàn)開關(guān)門。

實(shí)驗(yàn)名稱:LD3320A語音識別控制設(shè)計(jì)接線說明:
                  SG90舵機(jī)模塊-->單片機(jī)IO
                  MOTOR-->P21
                  VCC-->5V
                  GND-->GND

                  LD3320A語音識別模塊-->單片機(jī)IO
                  5V-->5V
                  GND-->GND
                  TXD-->P30
                  RXD-->P31

                  JQ8900-16P語音模塊-->單片機(jī)IO
                  VPP-->P11
                  GND-->GND
                  VCC-->5V
                  SPK-/SPK+-->喇叭
         
實(shí)驗(yàn)現(xiàn)象:系統(tǒng)運(yùn)行后,當(dāng)對語音模塊說出“小芳小芳”時,收到回復(fù)信息后,開始說出控制指令,項(xiàng)目中已設(shè)計(jì):
                  開門、關(guān)門、開燈、關(guān)燈、晚安指令,每當(dāng)說控制指令前,必須先說“小芳小芳”,等待回復(fù)后才能繼續(xù)。
                  如果沒有回復(fù),系統(tǒng)會提示要說對應(yīng)的指令。對應(yīng)指令可控制舵機(jī)和LED的開關(guān)。
                        
注意事項(xiàng):本程序適用于51全系列開發(fā)板。

首先將相應(yīng)的程序燒錄到LD3320,注意芯片型號,我的是STC11L48XE。
有些LD3320沒有一鍵下載按鈕,需要自己拔下VCC來再插上

然后打開串口調(diào)試助手試試吧,對著咪頭說:“小芳小芳”

然后將JQ8900-16P通過USB線連接到電腦,把mp3文件復(fù)制進(jìn)去。

最后把51的程序燒錄到51單片機(jī)里,連接好線,就大功告成了!

制作出來的實(shí)物圖如下:


單片機(jī)源程序如下:
  1. /*  說明:口令模式: 即每次識別時都需要說“小芳小芳”這個口令 ,才能夠進(jìn)行下一級的識別,注釋僅供參考!*/

  2. #include "config.h"
  3. /************************************************************************************/
  4. //        nAsrStatus 用來在main主程序中表示程序運(yùn)行的狀態(tài),不是LD3320芯片內(nèi)部的狀態(tài)寄存器
  5. //        LD_ASR_NONE:                表示沒有在作ASR識別
  6. //        LD_ASR_RUNING:                表示LD3320正在作ASR識別中
  7. //        LD_ASR_FOUNDOK:                表示一次識別流程結(jié)束后,有一個識別結(jié)果
  8. //        LD_ASR_FOUNDZERO:        表示一次識別流程結(jié)束后,沒有識別結(jié)果
  9. //        LD_ASR_ERROR:                表示一次識別流程中LD3320芯片內(nèi)部出現(xiàn)不正確的狀態(tài)
  10. /***********************************************************************************/
  11. uint8 idata nAsrStatus=0;        
  12. void MCU_init();
  13. void ProcessInt0(); //識別處理函數(shù)
  14. void delay(unsigned long uldata);
  15. void User_handle(uint8 dat);//用戶執(zhí)行操作函數(shù)
  16. void Delay200ms();
  17. void Led_test(void);//單片機(jī)工作指示
  18. uint8_t G0_flag=DISABLE;//運(yùn)行標(biāo)志,ENABLE:運(yùn)行。DISABLE:禁止運(yùn)行
  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. * 功    能: 主函數(shù)        程序入口
  83. * 入口參數(shù):  
  84. * 出口參數(shù):
  85. * 說    明:                                          
  86. * 調(diào)用方法:
  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;                //        初始狀態(tài):沒有在作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、關(guān)門\r\n"); /*text.....*/
  115.         PrintCom("        3、報(bào)警開\r\n"); /*text.....*/
  116.         PrintCom("        4、報(bào)警關(guān)\r\n"); /*text.....*/
  117.         PrintCom("  5、開燈\r\n"); /*text.....*/
  118.         PrintCom("        6、關(guān)燈\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添加關(guān)鍵詞語,啟動ASR運(yùn)算*/
  141.                                 {
  142.                                         nAsrStatus = LD_ASR_ERROR;
  143.                                 }
  144.                                 break;
  145.                         }
  146.                         case LD_ASR_FOUNDOK: /*        一次ASR識別流程結(jié)束,去取ASR識別結(jié)果*/
  147.                         {                                
  148.                                 nAsrRes = LD_GetResult();                /*獲取結(jié)果*/
  149.                                 User_handle(nAsrRes);//用戶執(zhí)行函數(shù)
  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. * 功    能: 單片機(jī)是否工作指示
  165. * 入口參數(shù): 無
  166. * 出口參數(shù):無
  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. * 功    能: 單片機(jī)初始化
  186. * 入口參數(shù):  
  187. * 出口參數(shù):
  188. * 說    明:                                          
  189. * 調(diào)用方法:
  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端口設(shè)置為推挽輸出功能,即提高IO口驅(qū)動能力,從驅(qū)動繼電器模塊工作
  199.         P1M1=0X00;

  200.         LD_MODE = 0;                //        設(shè)置MD管腳為低,并行模式讀寫
  201.         IE0=1;
  202.         EX0=1;
  203.         EA=1;
  204. }
  205. /***********************************************************
  206. * 名    稱:        延時函數(shù)
  207. * 功    能:
  208. * 入口參數(shù):  
  209. * 出口參數(shù):
  210. * 說    明:                                          
  211. * 調(diào)用方法:
  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. * 名    稱: 中斷處理函數(shù)
  248. * 功    能:
  249. * 入口參數(shù):  
  250. * 出口參數(shù):
  251. * 說    明:                                          
  252. * 調(diào)用方法:
  253. **********************************************************/
  254. void ExtInt0Handler(void) interrupt 0  
  255. {         
  256.         ProcessInt0();                                
  257. }
  258. /***********************************************************
  259. * 名    稱:用戶執(zhí)行函數(shù)
  260. * 功    能:識別成功后,執(zhí)行動作可在此進(jìn)行修改
  261. * 入口參數(shù): 無
  262. * 出口參數(shù):無
  263. * 說    明:                                          
  264. **********************************************************/
  265. void         User_handle(uint8 dat)
  266. {
  267.      //UARTSendByte(dat);//串口識別碼(十六進(jìn)制)
  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)                   /*對結(jié)果執(zhí)行相關(guān)操作,客戶可刪除Printcom 串口輸出語句替換為其他需要控制的代碼*/
  279.                           {
  280.                                   case CODE_DMCS:                        
  281.                                                 PrintCom("開門\r\n"); /*text.....*/
  282.                                                                                                          break;
  283.                                         case CODE_KFBYZ:        
  284.                                                 PrintCom("關(guān)門\r\n"); /*text.....*/
  285.                                                                                                          break;
  286.                                         case CODE_KD:                                       
  287.                                                 PrintCom("報(bào)警開\r\n"); /*text.....*/
  288.                                                                                                         break;
  289.                                         case CODE_GD:                                       
  290.                                                 PrintCom("報(bào)警關(guān)\r\n"); /*text.....*/
  291.                                                                                                         break;
  292.                                         case CODE_BJ:                                                
  293.                                                 PrintCom("開燈\r\n"); /*text.....*/
  294.                                                                                                         break;
  295.                                         case CODE_SH:                                                
  296.                                                 PrintCom("關(guān)燈\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. }         
復(fù)制代碼

shaoluLD3320.jpg (4.28 MB, 下載次數(shù): 91)

燒錄LD3320

燒錄LD3320

shaolu.png (103.78 KB, 下載次數(shù): 85)

LD3320燒錄完成

LD3320燒錄完成

51hei.png (64.95 KB, 下載次數(shù): 90)

串口調(diào)試助手測試

串口調(diào)試助手測試

mp3.jpg (3.06 MB, 下載次數(shù): 92)

通過usb連接JQ8900-16P

通過usb連接JQ8900-16P

JQ8900-16Pyuanlitu.png (389.59 KB, 下載次數(shù): 91)

JQ8900-16P原理圖

JQ8900-16P原理圖

wenjian.png (61.96 KB, 下載次數(shù): 83)

JQ8900-16P里面MP3文件

JQ8900-16P里面MP3文件

51hei.png (55.13 KB, 下載次數(shù): 91)

文件結(jié)構(gòu)

文件結(jié)構(gòu)

新建文件夾.7z

1.28 MB, 下載次數(shù): 35, 下載積分: 黑幣 -5

程序






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1