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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5588|回復: 9
打印 上一主題 下一主題
收起左側

基于stc12c5a60s2單片機的智能語音識別天氣時鐘制作

  [復制鏈接]
跳轉到指定樓層
樓主
設備說明:本設備使用具有兩個usart串口的stc12c5a60s2作為MCU主控,SNR3512作為語音識別模塊,JQC80作為語音模塊,esp8266作為聯網模塊。本設備可以實現非特定人聲的語音識別,并且在識別之后進行自動聯網獲取目標城市的時間和未來七天的溫度。在本裝置中,可以在上電之后按下key1或者呼叫"小星,小星"啟動SNR3512模塊,之后呼叫"啟動引擎",開啟聯網。聯網成功后自動播放時間和溫度。天氣API用的www點sojson點com/blog/234.html,因為這個天氣API需要進行解析,利用單片機進行解析比較麻煩。所以就讓朋友搭建了一個新的網址,在自己搭建的網址中先把API中的天氣提取完成。這樣我的設備直接訪問這個網址就可以獲取到時間和天氣了。操作說明:
1.插上電源,會啟動OLED并且播放聲音語句:"歡迎使用小桔智能天氣時鐘"
2.按鍵Key1或者呼叫“小星小星”+"啟動引擎",播放語句"小桔正在努力聯網中"
3.oled最下面會依次顯示step1-ok,step2-ok,step3-ok,step4-ok,step5-ok.step6-ok.,step7-0k。
其中,step2-step3需要進行大概10~20s的時間,之后就會播放"聯網成功",否則播放"聯網失敗,重新聯網中"
,聯網失敗需要按下key1進行重新聯網,或者重新啟動設備。
4.到step7-ok后則會播放時間和天氣,此時播放結束后可以按key1或者呼叫"小星,小星",則可以重新播放時間。如果需要退出聯網狀態,按下key2,顯示step8-ok。

最后:本代碼還有不少的地方需要進行完善,有興趣的伙伴可以自己動手進行試驗哦。
作者:Vence

原理圖:

PCB:



實物:


聯網前





聯網后


主函數代碼:
  1. /*********************************************************
  2. ***************時間:2020年4月9日22點33分******************
  3. 項目名稱:基于stc12c5a60s2+snr3512的智能語音天氣時鐘*******
  4. 說明:通過非特定人聲的語音操作,讓設備自動獲取網絡時間并進*
  5. 行語音播報 ***********************************************
  6. *******************作者:Vence*****************************
  7. *********************************************************/

  8. #include<STC12C5A60S2.h>
  9. #include "GLOBAL.h"
  10. #include "DEFINE.h"

  11. //全局函數
  12. //unsigned char temp1,temp2;     //串口1、2數據接收數量
  13. volatile unsigned char idata recarray[39]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};        //數據緩存
  14. volatile unsigned char idata receive_snr3512[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};                                //接收SNR3512的數據
  15. //獲取的時間,年,月,日
  16. unsigned char  year[6] = {'2','0','2','0','-','\0'};
  17. unsigned char  date[6] = {'0','1','-','0','1','\0'};
  18. unsigned char  time[6] = {'1','2',':','0','0','\0'};                //結尾要加\0,否則不知道是否為字符串的結尾
  19. unsigned char temp[8] = {21,0,0,0,0,0,0,0};                                                                                                                //寧波市未來七天最低溫度
  20. unsigned char month,dat,hour,minute;
  21. //unsigned char  step[2] = {'0','\0'};
  22. unsigned char step,reapeat,reap;
  23. unsigned char time_flag;
  24. //unsigned char  *time = "2020-04-17 12:15";
  25. //主函數
  26. void main()
  27. {
  28.           time_flag = 0;
  29.           step = 0;
  30.           reapeat = 0;
  31.           reap = 0;
  32.           flag = 0;
  33.                 count_all = 0;
  34.                 snr3512_count = 0;
  35.           Init1302();                                //初始化1302
  36.                 InitUART();                                //初始化串口,關閉串口1、2
  37.                 OLED_Init();                        //初始化OLED  
  38.                 OLED_Clear();
  39.                 //delay1ms(100);                                                //esp8266上電初始化
  40.                 OLED_ShowCHinese(0,0,0);//小
  41.                 OLED_ShowCHinese(18,0,1);//桔
  42.                 OLED_ShowCHinese(36,0,2);//智
  43.                 OLED_ShowCHinese(54,0,3);//能
  44.                 OLED_ShowCHinese(72,0,4);//天
  45.                 OLED_ShowCHinese(90,0,5);//氣
  46.                 OLED_ShowCHinese(108,0,6);//鐘
  47.                 OLED_ShowString(0,2,year);
  48.                 OLED_ShowString(40,2,date);
  49.                 OLED_ShowString(88,2,time);
  50.                 OLED_ShowString(0,4,"weather: sun");
  51.                 OLED_ShowString(0,6,"0");
  52.                 voice_display(1);        
  53.                 while(1)
  54.                 {
  55.                         if(key1 == 0 || receive_snr3512[0] == 0x88)                                        //按下key1或者啟動引擎
  56.                         {
  57.                                 time_flag = 0;
  58.                                 delay1ms(10);
  59.                                 if(key1 == 0 || receive_snr3512[0] == 0x88)
  60.                                 {
  61.                                         ES = 1;
  62.                                         IE2 =0x00;      //關閉串口2中斷 ES2=1
  63.                                         step = 1;
  64.                                         while(1)
  65.                                         {
  66.                                                 if(step == 1)
  67.                                                 {
  68.                                                         voice_display(2);                                        //小桔正在努力聯網中
  69.                                                         ClearRec();
  70.                                                         ClearSNR3512();
  71.                                             SendGprsCmd(str1);
  72.                                                         while(reapeat<30 && reap<10)
  73.                                             {
  74.                                                     delay1ms(100);
  75.                                                     reap++;
  76.                                             }
  77.                  
  78.                                             if(recarray[0] == 'K')
  79.                                             {
  80.                                                     OLED_ShowString(0,6,"step1-ok");
  81.                                                     ClearRec();
  82.                                                     step = 2;
  83.                                                     reap = reapeat = 0;
  84.                                             }
  85.                                             
  86.                                             else
  87.                                             {
  88.                                                     reapeat++;
  89.                                                     if(reapeat>30)
  90.                                                     {
  91.                                                                         voice_display(4);                        //聯網失敗,重新聯網中
  92.                                                                         IE2 =0x01;
  93.                                                             ClearRec();
  94.                                                                         reap = reapeat = 0;
  95.                                                             OLED_ShowString(0,6,"step1-err");
  96.                                                             break;
  97.                                                     }
  98.                                             }
  99.                                                 }
  100.                                                 
  101.                                                 if(step == 2)
  102.                                     {
  103.                                             ClearRec();
  104.                                             SendGprsCmd(str2);
  105.                                             while(reapeat<5 && reap<10)
  106.                                             {
  107.                                                     delay1ms(100);
  108.                                                     reap++;        
  109.                                             }
  110.                  
  111.                                             if(recarray[0] == 'K')
  112.                                             {
  113.                                                     OLED_ShowString(0,6,"step2-ok");
  114.                                                     ClearRec();
  115.                                                     step = 3;
  116.                                                     reap = reapeat = 0;
  117.                                             }
  118.                                             
  119.                                             else
  120.                                             {
  121.                                                     reapeat++;
  122.                                                     if(reapeat>5)
  123.                                                     {
  124.                                                                         voice_display(4);                        //聯網失敗,重新聯網中
  125.                                                                         IE2 =0x01;
  126.                                                             ClearRec();
  127.                                                                         reap = reapeat = 0;
  128.                                                             OLED_ShowString(0,6,"step2-err");
  129.                                                             break;
  130.                                                     }
  131.                                             }
  132.                                     }
  133.                                                 
  134.                                                 if(step == 3)
  135.                                     {
  136.                                             ClearRec();
  137.                                             SendGprsCmd(str3);
  138.                                             while(reapeat<5 && reap<100)
  139.                                             {
  140.                                                     delay1ms(100);
  141.                                                     reap++;
  142.                                             }
  143.                  
  144.                                             if(recarray[0] == 'K')
  145.                                             {
  146.                                                                 voice_display(3);                        //聯網成功
  147.                                                     OLED_ShowString(0,6,"step3-ok");
  148.                                                     ClearRec();
  149.                                                     step = 4;
  150.                                                     reap = reapeat = 0;
  151.                                             }
  152.                                             
  153.                                             else
  154.                                             {
  155.                                                     reapeat++;
  156.                                                     if(reapeat>5)
  157.                                                     {
  158.                                                                         voice_display(4);                        //聯網失敗,重新聯網中
  159.                                                                         IE2 =0x01;
  160.                                                             ClearRec();
  161.                                                                         reap = reapeat = 0;
  162.                                                             OLED_ShowString(0,6,"step3-err");
  163.                                                             break;
  164.                                                     }
  165.                                             }
  166.                                     }
  167.                                                 
  168.                                                 if(step == 4)
  169.                                     {
  170.                                             ClearRec();
  171.                                             SendGprsCmd(str4);
  172.                                             while(reapeat<5 && reap<10)
  173.                                             {
  174.                                                     delay1ms(100);
  175.                                                     reap++;
  176.                                             }
  177.                  
  178.                                             if(recarray[0] == 'K')
  179.                                             {
  180.                                                     OLED_ShowString(0,6,"step4-ok");
  181.                                                     ClearRec();
  182.                                                     step = 5;
  183.                                                     reap = reapeat = 0;
  184.                                             }
  185.                                             
  186.                                             else
  187.                                             {
  188.                                                     reapeat++;
  189.                                                     if(reapeat>5)
  190.                                                     {
  191.                                                                         voice_display(4);                        //聯網失敗,重新聯網中
  192.                                                                         IE2 =0x01;
  193.                                                             ClearRec();
  194.                                                                         reap = reapeat = 0;
  195.                                                             OLED_ShowString(0,6,"step4-err");
  196.                                                             break;
  197.                                                     }
  198.                                             }
  199.                                     }
  200.                                                 
  201.                                                 if(step == 5)
  202.                                     {
  203.                                             ClearRec();
  204.                                             SendGprsCmd(str5);
  205.                                             while(reapeat<5 && reap<10)
  206.                                             {
  207.                                                     delay1ms(100);
  208.                                                     reap++;
  209.                                             }
  210.                  
  211.                                             if(recarray[0] == 'K')
  212.                                             {
  213.                                                     OLED_ShowString(0,6,"step5-ok");
  214.                                                     ClearRec();
  215.                                                     step = 6;
  216.                                                     reap = reapeat = 0;
  217.                                             }
  218.                                             
  219.                                             else
  220.                                             {
  221.                                                     reapeat++;
  222.                                                     if(reapeat>5)
  223.                                                     {
  224.                                                                         voice_display(4);                        //聯網失敗,重新聯網中
  225.                                                                         IE2 =0x01;
  226.                                                             ClearRec();
  227.                                                                         reap = reapeat = 0;
  228.                                                             OLED_ShowString(0,6,"step5-err");
  229.                                                             break;
  230.                                                     }
  231.                                             }        
  232.                                     }
  233.                                                 
  234.                                                 if(step == 6)
  235.                                     {
  236.                                             ClearRec();
  237.                                             SendGprsCmd(str6);
  238.                                             while(reapeat<5 && reap<10)
  239.                                             {
  240.                                                     delay1ms(100);
  241.                                                     reap++;
  242.                                             }
  243.                  
  244.                                             if(recarray[0] == 0x3e)
  245.                                             {
  246.                                                     OLED_ShowString(0,6,"step6-ok");
  247.                                                     ClearRec();
  248.                                                     step = 7;
  249.                                                     reap = reapeat = 0;
  250.                                             }
  251.                                             
  252.                                             else
  253.                                             {
  254.                                                     reapeat++;
  255.                                                     if(reapeat>5)
  256.                                                     {
  257.                                                                         voice_display(4);                        //聯網失敗,重新聯網中
  258.                                                                         IE2 =0x01;
  259.                                                             ClearRec();
  260.                                                                         reap = reapeat = 0;
  261.                                                             OLED_ShowString(0,6,"step6-err");
  262.                                                             break;
  263.                                                     }
  264.                                             }        
  265.                                     }
  266.                                                 
  267.                                                 if(step == 7)
  268.                                     {
  269.                                             SendGprsCmd(str7);
  270.                                             delay1ms(100);
  271.                                             SendGprsCmd(str8);
  272.                                             while(reapeat<5 && reap<20)
  273.                                             {
  274.                                                     delay1ms(100);
  275.                                                     reap++;
  276.                                             }
  277.                  
  278.                                             if(recarray[0] == '0')
  279.                                             {
  280.                                                     OLED_ShowString(0,6,"step7-ok");
  281.                                                                 date[0] = recarray[1];
  282.                                                                 date[1] = recarray[2];
  283.                                                                 date[3] = recarray[3];
  284.                                                                 date[4] = recarray[4];
  285.                                                                 time[0] = recarray[5];
  286.                                                                 time[1] = recarray[6];
  287.                                                                 time[3] = recarray[7];
  288.                                                                 time[4] = recarray[8];
  289.                                                                 temp[1] = (Ctoi(recarray[11]))*10+Ctoi(recarray[12]);
  290.                                                                 temp[2] = (Ctoi(recarray[13]))*10+Ctoi(recarray[14]);
  291.                                                                 temp[3] = (Ctoi(recarray[15]))*10+Ctoi(recarray[16]);
  292.                                                                 temp[4] = (Ctoi(recarray[17]))*10+Ctoi(recarray[18]);
  293.                                                                 temp[5] = (Ctoi(recarray[19]))*10+Ctoi(recarray[20]);
  294.                                                                 temp[6] = (Ctoi(recarray[21]))*10+Ctoi(recarray[22]);
  295.                                                                 temp[7] = (Ctoi(recarray[23]))*10+Ctoi(recarray[24]);
  296.                                                                 month = (Ctoi(recarray[1]))*10+Ctoi(recarray[2]);
  297.                                                                 dat = (Ctoi(recarray[3]))*10+Ctoi(recarray[4]);
  298.                                                                 hour = (Ctoi(recarray[5]))*10+Ctoi(recarray[6]);
  299.                                                                 minute = (Ctoi(recarray[7]))*10+Ctoi(recarray[8]);
  300.                                                     OLED_ShowString(0,2,year);
  301.                                                                 OLED_ShowString(40,2,date);
  302.                                                                 OLED_ShowString(88,2,time);
  303.                                                                 time_dispaly(month,dat,hour,minute);                                //播放時間
  304.                                                                 if(time_flag == 0)
  305.                                                                         weath_display(temp);                                                                                                //播放天氣
  306.                                                                 voice_display(5);                                                                                                                //小桔溫馨提醒,注意防護
  307.                                                           time_flag = 0;
  308.                                                     step = 8;
  309.                                                     reap = reapeat = 0;
  310.                                             }
  311.                                                    
  312.                                             else
  313.                                             {
  314.                                                     reapeat++;
  315.                                                     if(reapeat>5)
  316.                                                     {
  317.                                                                         voice_display(4);                        //聯網失敗,重新聯網中
  318.                                                                         IE2 =0x01;
  319.                                                             SendGprsCmd(str9);
  320.                                                             ClearRec();
  321.                                                                         reap = reapeat = 0;
  322.                                                             OLED_ShowString(0,6,"step7-err");
  323.                                                             break;
  324.                                                     }
  325.                                             }        
  326.                                     }
  327.                                                 
  328.                                                 if(step == 8)
  329.                                     {
  330.                                                         IE2 =0x01;                                                        
  331.                                             if(key1 == 0 || receive_snr3512[0] == 0x7f)                                        //重復獲取時間
  332.                                             {
  333.                                                     if(key1 == 0 || receive_snr3512[0] == 0x7f)
  334.                                                     {
  335.                                                                         time_flag = 1;
  336.                                                                         voice_display(6);
  337.                                                                         ClearRec();
  338.                                                                         ClearSNR3512();
  339.                                                             step = 7;
  340.                                                     }
  341.                                             }
  342.                                             
  343.                                             if(key2 == 0 || receive_snr3512[0] == 0x89)                                        //退出透傳模式
  344.                                             {
  345.                                                     SendGprsCmd(str9);
  346.                                                     ClearRec();
  347.                                                                 ClearSNR3512();
  348.                                                     OLED_ShowString(0,6,"step8-ok");
  349.                                                     ES = 0;
  350.                                                     break;
  351.                                             }
  352.                                     }
  353.                                         }
  354.                                 }
  355.                         }
  356.                         
  357.                 }        
  358. }

  359. /************串口1中斷處理函數*************/
  360. void UART_1Interrupt(void) interrupt 4
  361. {
  362.         if(RI)
  363.         {
  364.                 if(step == 1 || step == 2 || step == 3 || step == 4 || step == 5)
  365.                 {
  366.                         RI = 0;
  367.                         recarray[count_all] = SBUF;
  368.                         if(recarray[0] == 'K')
  369.             {
  370.                     flag = 1;
  371.             }
  372.             if(flag == 1)
  373.                     count_all++;
  374.                 }
  375.                
  376.                 if(step == 6)
  377.                 {
  378.                         RI = 0;
  379.                         recarray[count_all] = SBUF;
  380.                         if(recarray[0] == 0x3e)
  381.                         {
  382.                                 flag = 1;
  383.                         }
  384.                         if(flag == 1)
  385.                                 count_all++;
  386.                 }
  387.                
  388.                 if(step == 7)
  389.                 {
  390.                         if(flag == 0)
  391.                         {
  392.                                 RI = 0;
  393.                                 recarray[count_all] = SBUF;
  394.                                 if(recarray[0] == 'L')
  395.                                 {
  396.                                         flag = 1;
  397.                                 }
  398.                         }
  399.                         if(flag == 1)
  400.                         {
  401.                                 RI = 0;
  402.                                 recarray[count_all] = SBUF;
  403.                                 if(recarray[0] == '0')
  404.                                 {
  405.                                         count_all++;
  406.                                 }
  407.                         }
  408.                                        
  409.                 }
  410.         }
  411. }

  412. /************串口2中斷處理函數*************/
  413. void UART_2Interrupt(void) interrupt 8
  414. {
  415.     if(S2CON&S2RI)
  416.     {            
  417.             S2CON&=~S2RI;
  418.             receive_snr3512[0] = S2BUF;
  419.     }
  420. }
復制代碼
附件中包含的文件有:原理圖+PCB+代碼+演示視頻



全部資料51hei下載地址:
智能天氣時鐘.zip (19.17 MB, 下載次數: 91)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:286225 發表于 2020-4-25 11:34 | 只看該作者
圖片看起來感覺好復雜
回復

使用道具 舉報

板凳
ID:600952 發表于 2020-4-25 13:53 | 只看該作者
太厲害了!用到了stc12c5a60s主控,語音識別模塊,語音模塊,esp8266聯網模塊,功能強大,很高級!
回復

使用道具 舉報

地板
ID:89072 發表于 2020-4-25 15:10 | 只看該作者
正在學習12864,對于樓主的資料感覺很有意思,語音應該是未來的發展趨勢吧,尤其智能家居這一塊的
回復

使用道具 舉報

5#
ID:444235 發表于 2020-4-28 16:58 | 只看該作者
stc12c5a60s2這個新芯片剛剛入手,以前接觸的都是89C52和STC15F2K60S2,不知這個單時鐘周期的程序是不更簡單點,求賜教
回復

使用道具 舉報

6#
ID:372961 發表于 2020-4-29 08:54 | 只看該作者
2246754355 發表于 2020-4-28 16:58
stc12c5a60s2這個新芯片剛剛入手,以前接觸的都是89C52和STC15F2K60S2,不知這個單時鐘周期的程序是不更簡 ...

速度更快,有兩個串口,有獨立波特率,完全兼容8051單片機,其他可以查詢相關數據手冊
回復

使用道具 舉報

7#
ID:140183 發表于 2020-4-30 17:16 | 只看該作者
我剛好有幾片stc12le5a60s2.有空做來看看
回復

使用道具 舉報

8#
ID:88256 發表于 2020-6-13 08:52 | 只看該作者
功能太單調了,聯網太慢也只能作為學習用,如果能再加上幾路開關控制就比較完美了
回復

使用道具 舉報

9#
ID:118110 發表于 2020-6-13 10:15 | 只看該作者
STC單片機穩定性稍差一點
回復

使用道具 舉報

10#
ID:302325 發表于 2020-6-17 09:04 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品毛片一区二区在线看 | 青娱乐国产 | 国产高清在线观看 | 亚洲视频精品 | 精品国产一级片 | www.精品国产| av手机在线 | 国产高清免费 | 一级片免费观看 | 日韩一区二区三区视频在线观看 | 欧美一级片中文字幕 | 一道本不卡视频 | 久久久久久国产 | jlzzjlzz国产精品久久 | 黄色在线免费观看视频 | 久久久久久美女 | 久久久久国产精品午夜一区 | 亚洲一区二区在线播放 | 国产成人精品一区二区 | 亚洲综合热 | 日韩黄a | 精品亚洲一区二区三区 | 亚洲伦理自拍 | 成人精品一区二区三区 | 国产亚洲精品久久久久久豆腐 | 国产精品美女久久久 | 毛片在线看片 | 国产精品久久久久久久久免费软件 | 国产欧美视频一区二区三区 | 亚洲国产成人av | 国产伦精品一区二区三区四区视频 | 91精品入口蜜桃 | 成人在线一区二区 | 91精品久久久久久久久久入口 | 久久国产精品视频免费看 | .国产精品成人自产拍在线观看6 | 国产精品免费福利 | 色免费在线视频 | 国产精品毛片一区二区三区 | 久久i | 日韩在线视频一区二区三区 |