久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2762|回復: 0
收起左側

基于51單片機和LD3320的智能語音管家程序,語音控制開關燈,可二次開發(fā)

[復制鏈接]
ID:1069230 發(fā)表于 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+-->喇叭
         
實驗現象:系統運行后,當對語音模塊說出“小芳小芳”時,收到回復信息后,開始說出控制指令,項目中已設計:
                  開門、關門、開燈、關燈、晚安指令,每當說控制指令前,必須先說“小芳小芳”,等待回復后才能繼續(xù)。
                  如果沒有回復,系統會提示要說對應的指令。對應指令可控制舵機和LED的開關。
                        
注意事項:本程序適用于51全系列開發(fā)板。

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

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

然后將JQ8900-16P通過USB線連接到電腦,把mp3文件復制進去。

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

制作出來的實物圖如下:

總覽

總覽


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

  2. #include "config.h"
  3. /************************************************************************************/
  4. //        nAsrStatus 用來在main主程序中表示程序運行的狀態(tài),不是LD3320芯片內部的狀態(tài)寄存器
  5. //        LD_ASR_NONE:                表示沒有在作ASR識別
  6. //        LD_ASR_RUNING:                表示LD3320正在作ASR識別中
  7. //        LD_ASR_FOUNDOK:                表示一次識別流程結束后,有一個識別結果
  8. //        LD_ASR_FOUNDZERO:        表示一次識別流程結束后,沒有識別結果
  9. //        LD_ASR_ERROR:                表示一次識別流程中LD3320芯片內部出現不正確的狀態(tài)
  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);//用戶執(zhí)行操作函數
  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;                //        初始狀態(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、關門\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);//用戶執(zhí)行函數
  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. * 名    稱:用戶執(zhí)行函數
  260. * 功    能:識別成功后,執(zhí)行動作可在此進行修改
  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)                   /*對結果執(zhí)行相關操作,客戶可刪除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, 下載次數: 35, 下載積分: 黑幣 -5

程序

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人综合一区二区 | 伊人伊人 | 亚洲色图插插插 | 国产真实精品久久二三区 | 日本精品一区二区三区视频 | 日韩精品视频中文字幕 | 亚洲一区欧美一区 | 国产免费福利小视频 | 成人精品一区二区三区中文字幕 | 日韩欧美二区 | 国久久| 毛片久久久 | 精品一区二区三区免费视频 | 天天草天天爱 | 日韩精品久久一区 | 午夜综合| 黄色成人在线观看 | 九九热免费观看 | www.精品国产 | www.亚洲一区二区三区 | 成人在线免费视频观看 | 亚洲日本三级 | 午夜精品视频在线观看 | 亚洲黄色视屏 | 国产精品亚洲综合 | 欧美在线一区二区三区 | 青青草av在线播放 | 国产欧美精品一区二区色综合朱莉 | 一区精品在线观看 | 日韩欧美在线观看 | 性色的免费视频 | 中文字幕高清av | 欧美精品久久一区 | 精品国产免费人成在线观看 | 日韩精品中文字幕一区二区三区 | 精品国产欧美一区二区三区成人 | 日韩不卡三区 | 亚洲国产一区在线 | 国产精品中文字幕在线 | 国产这里只有精品 | 天堂av在线影院 |