找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4988|回复: 9
收起左侧

基于stc12c5a60s2单片机的智能语音识别天气时钟制作

  [复制链接]
ID:372961 发表于 2020-4-19 21:50 | 显示全部楼层 |阅读模式
设备说明:本设备使用具有两个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

原理图:
原理图.png
PCB:
PCB.png


实物:
微1.jpg

联网前



2.jpg

联网后


主函数代码:
  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.png

全部资料51hei下载地址:
智能天气时钟.zip (19.17 MB, 下载次数: 91)

评分

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

查看全部评分

回复

使用道具 举报

ID:286225 发表于 2020-4-25 11:34 | 显示全部楼层
图片看起来感觉好复杂
回复

使用道具 举报

ID:600952 发表于 2020-4-25 13:53 | 显示全部楼层
太厉害了!用到了stc12c5a60s主控,语音识别模块,语音模块,esp8266联网模块,功能强大,很高级!
回复

使用道具 举报

ID:89072 发表于 2020-4-25 15:10 | 显示全部楼层
正在学习12864,对于楼主的资料感觉很有意思,语音应该是未来的发展趋势吧,尤其智能家居这一块的
回复

使用道具 举报

ID:444235 发表于 2020-4-28 16:58 | 显示全部楼层
stc12c5a60s2这个新芯片刚刚入手,以前接触的都是89C52和STC15F2K60S2,不知这个单时钟周期的程序是不更简单点,求赐教
回复

使用道具 举报

ID:372961 发表于 2020-4-29 08:54 | 显示全部楼层
2246754355 发表于 2020-4-28 16:58
stc12c5a60s2这个新芯片刚刚入手,以前接触的都是89C52和STC15F2K60S2,不知这个单时钟周期的程序是不更简 ...

速度更快,有两个串口,有独立波特率,完全兼容8051单片机,其他可以查询相关数据手册
回复

使用道具 举报

ID:140183 发表于 2020-4-30 17:16 | 显示全部楼层
我刚好有几片stc12le5a60s2.有空做来看看
回复

使用道具 举报

ID:88256 发表于 2020-6-13 08:52 | 显示全部楼层
功能太单调了,联网太慢也只能作为学习用,如果能再加上几路开关控制就比较完美了
回复

使用道具 举报

ID:118110 发表于 2020-6-13 10:15 | 显示全部楼层
STC单片机稳定性稍差一点
回复

使用道具 举报

ID:302325 发表于 2020-6-17 09:04 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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