找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11948|回复: 14
收起左侧

STM32单片机LD3320智能家居语音控制系统设计与调试资料

  [复制链接]
ID:427862 发表于 2020-12-6 17:07 | 显示全部楼层 |阅读模式
电路设计和部分程序源码在附录中。

本设计以 STM32 单片机为核心的智能家居语音控制系统,结合各功能模块和传感器模块,形成一套对家居电器智能控制系统的设计方案。系统以 STM32103C8T6为系统的主控芯片,辅以步进电机、非特定人语音识别模块等诸多外设器件。通过编程完成对串口通讯、 非特定人语音识别等模块的功能实现。设计侧重于局域网本地控制及通讯接口设计。通过发送语音消息,根据语音的内容实现对家用电器控制、照明系统控制等本地控制,功能实用、操作简单、易于安装,能够有效地提升居民的生活质量。

语音智能家居是现代家用电器未来发展的一个必然趋势。在现在市场上主要运用的功能为语音对话,就是说在居家生活中由人与家用电器进行对话,在距离有限的范围里,语音模块能根据相应的语音指令自动识别,然后由主控芯片控制用电器实现相应功能。根据芯片的语言程序编写的不同,识别的范围和实现的功能也会有相应的区别。其中,硬件设计为软件的实现提供了坚实的基础,软件是硬件内在,软硬件相辅相成,共同作用。系统功能是否能够实现取决于二者的配合。本系统的功能框图如下图。

2.2控制芯片的选择
2.2.1
选择控制芯片需要考虑的几个因素

(1)芯片所能应用的领域:因为每个芯片的功能有所差别,因此所能应用的系统环境也会不同,当选定控制芯片之后,所需要的环境必须适合[1]。因此,在选定芯片之前要确定系统的环境与芯片的环境相匹配。

(2)芯片自身的功能:当芯片的功能与设计所需要功能更加接近时,设计的难度也会降低。首先要确定系统要实现的功能,然后再看每个芯片自身的功能和能实现的功能,然后选择最合适的芯片[1]。

(3)芯片的功耗:由于设计中有能量供给模块,因此选择控制芯片的时候要考虑到芯片所需要的能源大小以及供给的能量是否能够维持芯片的工作时长[1]。并且也要考虑到芯片运行时会不会对环境有所污染,尽可能让做出的产品环保节能。

2.2.2 主控制芯片的确定

STM32F103C8T6功能强大,集成度高,是MSC-51单片机所有型号中应用比较多的一个型号。STM32F103C8T6单片机是把所必需的控制应用都集成在一个尺寸空间有限的集成电路芯片上,传统结构模式是把CPU加到外围芯片上。对各种功能部件的控制采用特殊功能寄存器的集中控制方式[2]。考虑到STM32单片机比51功能更加全面,所用资料比较容易搜集以及应用更加广泛,因此采用STM32单片机来实现本系统的相应功能。

2.3系统实现的功能

1.语音控制开关灯

当语音芯片收到“开灯”命令,单片机进行识别和处理,然后灯就会打开。当语音芯片收到“关灯”命令,单片机再次进行识别和处理,识别成功,灯就会关闭。
2.语音控制窗帘的开启和关闭

当语音芯片收到“打开窗帘”命令,单片机进行识别处理,ULN2003步进电机驱动驱动步进电机模拟窗帘的开启,当步进电机旋转到一定角度时,窗帘开启。当语音芯片收到“关闭窗帘”命令,单片机进行识别处理,ULN2003步进电机驱动驱动步进电机模拟窗帘的关闭,当步进电机旋转到一定角度时,窗帘关闭。

3.语音控制风扇的开启和关闭

当语音芯片收到“打开风扇”命令,单片机进行识别和处理,然后风扇就会旋转。当语音芯片收到“关闭”命令,单片机再次进行识别和处理,识别成功,风扇就会停止转动。

4.语音控制开关用电器

当语音芯片收到“打开空调”命令,单片机进行识别和处理,然后空调的指示灯就会打开。当语音芯片收到“关闭空调”命令,单片机再次进行识别和处理,识别成功,空调的指示灯就会关闭。
5.语音控制关闭电源

当用电器同时运行时,为了人们出行方便,可以使用关闭电源命令,就可以把开着的所有用电器同时关闭。


第三章 系统硬件设计
3.1 主控制器模块

本系统采用的单片机是STM32F103C8T6单片机。此单片机比51系列更加实用高效,自带2个AD转换,同时运行速度比51单片机要快很多,非常方便;

STM32F103C8T6单片机具有5个不同的串口进行通信,而51单片机只有1个单独串口进行通信,所以STM32有着更加强大的控制功能和通信功能,并且所具有的功能在现在市场上有广泛的运用,由于STM32单片机可以进行多种不同的时钟模数转换来进行工作,因此功耗比较高[3]。引脚JDQ1和JDQ2与两个用电器模块连接,引脚29-32与步进电机模块连接,引脚34与风扇模块连接,引脚B12-B15和A8与语音模块相连接。STM32单片机原理图如图3.1所示。

图3.1 STM32单片机原理图

STM32实物图如图3.2所示:

图3.2 STM32F103C8T6实物图

3.2 电源模块

单片机的供电电源开关控制如图3.3所示,单片机的供电电路是一个自锁开关加上一个电源座子。因为本系统中所有的器件都是5V供电,所以只需要用电池和充电宝或者USB连接到我们使用的笔记本或者台式电脑就可以直接使用了。但是需要注意的是,此电路之所以可以这样设计,是因为电路中没有什么功耗比较大的外围电路。我们有时候会遇到虽然芯片上写的是5V供电但是功耗非常的高[4]。所以我们在设计驱动电机或者是风扇等电路的时候就需要特别注意电路中电流可不可以符合这些器件运行的要求。如果符合要求就可以使用,否则不可以使用。

图3.3电源电路图


3.3  语音识别模块

LD3320语音芯片如下图3.4所示,该芯片是由公司设计生产的一款“语音识别”专用芯片。该芯片不仅集成了一些外部电路和语音识别处理器,而且包括DA、AD转换器、麦克风接口、声音输出接口等[5]。LD3320语音芯片识别的关键词语

图3.4语音识别芯片

列表根据客户需要是可以任意动态编辑的,不需要外接任何的辅助芯片。此芯片在功能设计上注重准确与高效。只需在现成的产品中加上语音芯片就可以实现语音识别、声控、人机对话功能[6]。

图3.5语音识别原理图

3.4  步进电机及驱动模块

我们可以通过脉冲的控制对电机的转速和方向进行调整,通过单片机来处理标准逻辑缓冲器来处理数据。单片机通过IN1 IN2 IN3 IN4 接口与ULN2003进行连接,然后单片机用来输出电流,由OUT1 OUT2 OUT3 OUT4输出到电机的四相也就是ABCD。ULN2003的输入电流只需要几毫安就可以,由单片机提供,经过达林顿结构,驱动为5V,耐压为50V,灌电流可达500mA[7]。

图3.6 ULN2003管脚原理图

图3.7 步进电机驱动原理图

3.5 风扇控制模块

   传统电风扇的开启和关闭给用户带来了许多不便,每次风扇开启或者关闭,必然进行手动操作。如果能够不动手就可以实现开关风扇的这些功能,那么就可以给用户带来很多方便。
   本设计系统通过语音芯片进行语音信息的收集,然后由单片机分析和处理语音信息。从而达到语音控制风扇开启和关闭的效果。

图3.8风扇控制电路原理图

3.6 继电器控制模块

由铁芯、衔铁、线圈、触点簧片等工作原件共同组成了电磁式继电器[8]。导体在闭合线圈里作切割磁感线运动,在电路中就会产生感应电流,这就产生了电磁效应,在电磁力吸引的作用下,衔铁就会克服返回弹簧的拉力吸向铁芯,衔铁的动触点与静触点因此就会吸合[10]。当关闭电源后,电磁之间就没有相了应的吸力,这时弹簧的反作用力就会让衔铁自动返回到原来的位置,动触点与原来的静触点就会分开。这样吸合、分开。从而实现了电路间的导通和切断。


图3.9继电器原理图

3.7 原理设计

Altium Designer这个绘图软件具有综合电子元件开发的很多功能,设计者刻意通过这个阮籍绘制电路图和制作电路板等。这款软件中,有大量的可以使用的元器件的原理图都存在与元器件库里,并且易于查找,可用于多种电路原理图的绘制,并且可以自己画自己需要的元器件,使用的方法简单,并且在绘制完电路图之后,也可以为制作电路板提供PCB线路图[11]。设计者可以利用这款软件完成电路设计中的各项任务,为我们省去了大量繁琐的任务,因此选择它来作为此次设计电路图的软件。设计过程中所用到的软件界面如下图3.11所示。

图3.11 原理图设计界面



第四章 系统软件设计
4.1 Keil编程软件

上一章节着重介绍了本系统的硬件设计,这一章将介绍软件设计。Keil5是一款兼容单片机C语言的软件开发系统。Keil包括C编辑器、链接器、宏汇编等,通过uVision开发环境将这些部分结合起来。近几年Keil编程软件得到了很多仿真机厂的认可和支持。Keil 编程软件是由美国公司出品的软件开发系统[12],目的是为了方便编程人员进行程序编程。

本系统我们选择STM32单片机进行工程的建立。如图4.1所示,你可以根据你使用的处理器来选择,如果您所使用的处理器型号在列表中找不到,也可以找一款与您使用的相兼容的型号来代替。右边一栏是对这个芯片的基本的说明,然后鼠标点击“是” [13]。


图4.1芯片启动代码拷贝确认对换框
有些芯片会提供启动代码,我们这个时候点击“是”,到此一个工程就建立好。

4.2 系统总程序设计

软件部分的主要任务是完成对语音进行识别和处理然后控制各个器件对当前不同的指令进行判断基于上述分析,当语音芯片收到“打开窗帘”语音指令,单片机进行处理和判别,然后步行电机就会转动模拟窗帘的开启,当旋转到一定角度后,窗帘完全打开。当语音芯片收到“打开风扇”的语音指令,风扇就会转动。当收到“开灯”指令,LED灯就会打开。当收到“关闭电源”的语音指令时,不管此时打开多少用电器,都会同时关闭。系统软件设计流程如图4.2所示。程序见附录C。

图4.2软件设计流程图

4.3 系统各功能子程序设计
4.3.1 窗帘控制子程序设计

步进电机是现代数字程序控制系统中的主要执行元件。它的主要功能是:当步进驱动器加上一个脉冲信号时,驱动步进电机就会按照设定的方向旋转一个固定的角度。在本系统中,如果语音芯片识别到“打开窗帘”的语音指令,ULN2003步行电机驱动就会驱动步行电机进行旋转,来模拟窗帘的开启,当步行电机停止旋转时,说明窗帘已经完全打开。如果语音芯片识别到“关闭窗帘”的语音指令,ULN2003步行电机驱动就会驱动步行电机进行旋转[14],来模拟窗帘的关闭,当步行电机停止旋转时,说明窗帘已经完全关闭。程序见附录C。

图4.3电机驱动流程图

4.3.2 空调电视控制子系统设计

继电器是一种用较小的电流去控制较大电流的电子控制器件,它常被用在自动控制电路中,具有输入回路和输出回路[15]。在本系统中,我们用继电器模拟空调和电视,当语音芯片收到“打开空调”指令,经过单片机的处理判断,空调前的指示灯就会打开。当语音芯片收到“打开电视”的语音指令,经过单片机的处理判别,电视前的指示灯就会打开。程序见附录C。

图4.4空调电视控制子程序流程图

4.3.3风扇控制子系统设计    

传统的家用风扇每次开启或者关闭时,必然有人参与操作,这样给用户带来诸多不便。如果能够不动手就可以实现开关风扇的这些功能,那么就可以给用户带来很多方便。
    本设计中的智能电风扇控制系统,是将电风扇与语音芯片相关联,由单片机分析和处理语音信息。当语音芯片收到“打开风扇”指令时,经过单片机的识别处理,风扇就会打开。当语音芯片收到“关闭风扇”指令时,经过单片机的识别处理,风扇就会关闭。从而达到语音控制风扇开启和关闭的效果。程序见附录C。

图4.5 风扇控制子系统流程图

4.3.4 开关灯子系统设计

  在本系统中,当语音模块识别到“开灯”的语音命令,然后将收到的命令输送给单片机主控模块进行处理识别,从而实现对灯泡的相应操作。开关灯的子系统流程图如4.6程序见附录C。

图4.6 灯控制子程序流程图

4.3.5 关闭电源子系统设计

  从上面四部分已经知道,利用语音芯片采集语音信息,通过主控芯片进行识别和处理信息,系统可以实现对风扇、窗帘、继电器、灯泡的开启和关闭进行单一的控制。为了使人们的居家生活更加便捷,当我们离开家的时候,我们可以把所有用电器同时关闭。程序见附录C。

图4.7 关闭电源子程序流程图


章  焊接与系统调试
5.1 电路焊

手工焊接是最原始的焊接方法,在现代工业中,由于电子产品需要批量的生产,从而手工焊接已经不能满足生产速度和质量的需求,大量的由机器焊接所替代;但是手工焊接这种原始的焊接方法在电子元器件的设计、维修、检测中仍然是必不可少的,并且维修、设计的质量好坏也会由手工焊接的质量好坏所影响。作为一名合格的工学类大学生,每个人都应该具备手工焊接这项技能,并且应该不断地练习这项技能,使焊接的产品达到更好的质量。

在焊接之前准备好用到的焊接工具,电烙铁的手握方法有以下几种:正握法、握笔式和反握法。

手工焊接有以下几个主要的步骤:

    1、准备焊接: 清洁元器件、电路板、焊锡表面的灰尘,以防焊接过程中由于灰尘而导致焊接的不牢固或者导电性差。然后将元器件的各个管脚尽量的分开最大距离,避免烙铁在焊接时烫坏元器件。

    2、加热焊接:电烙铁通电以后,先将电烙铁进行几秒钟的预热,然后将电烙铁的头沾上合适量焊锡和松香,将其慢慢的融化后,与被焊接元器件管脚相接处,等待焊锡与电路板上的焊锡想融合之后移开。

    3、清理焊接面:在焊接完元器件时,可能会有过多的焊锡,需要将这些多余的焊锡清理干净。需要用干净的镊子,在将这些焊锡融化的同时用镊子将多余的焊锡去掉。

    4、检查焊点:观察元器件管脚在焊接时是与否电路板焊锡连接牢固,如有缺口需要补焊。观察是否有过连接等现象,保证线路安全。

焊接过程应注意的事项:

    5、焊接中一定要注意电烙铁的放置,应放在原本的底座上,以防将焊

接者烫伤,或者将其他的元器件烫坏,而导致系统问题。

    6、焊接前保证仔细清洁元器件的表面灰尘,防止焊接不牢固,或者接

触不良。

    7、焊接时焊锡一定不可以过多或者过少;当焊锡过多时,可能导致线路过连接使电路短路。当焊锡过少时,元器件和电路板会连接不牢固,或者会焊点接触不良等问题。

    8、焊接完成后要清洁电路板上遗留的焊锡,防止影响电路正常运行,以

及整体的美观。

图5.1焊接完成图

5.2 系统调试

硬件电路板完成以后,为了达到较好的语音控制效果,在完成以后进行了多次调试。尤其对语音模块,步行电机驱动模块以及小风扇进行了多次调试。如语音调试,语音识别过程主要包括“收集”和“识别”两个阶段。在收集阶段,通过LD3320语音芯片对说话者的声音进行采集,从中提取出单片机能够识别的信息,建立一个特征模型;在识别阶段,单片机对LD3320语音芯片采集到的语音样本进行分析处理,提取出语音的特征信息,然后.将这个特征信息模型与已有的特征模型进行对比,如果二者达到了一定的匹配度,则输入的语音被识别。

1. 语音芯片识别到“打开窗帘”的语音指令,ULN2003步行电机驱动就会驱动步行电机进行旋转,来模拟窗帘的开启,当步行电机停止旋转时,说明窗帘已经完全打开。如果语音芯片识别到“关闭窗帘”的语音指令,ULN2003步行电机驱动就会驱动步行电机进行旋转,来模拟窗帘的关闭,当步行电机停止旋转时,说明窗帘已经完全关闭。如下图5.2

图5.2 窗帘的开启实物图

2.本设计中的智能电风扇控制系统,是将电风扇与语音芯片相关联,由单片机分析和处理语音信息。当语音芯片收到“打开风扇”指令时,经过单片机的识别处理,风扇就会打开。当语音芯片收到“关闭风扇”指令时,经过单片机的识别处理,风扇就会关闭。

图5.3 风扇的开启实物图

3. 当语音芯片收到“开灯”指令时,经过单片机的识别处理,灯泡就会打开。当语音芯片收到“关灯”指令时,经过单片机的识别处理,灯泡就会关闭。当语音芯片收到“打开空调”指令时,经过单片机的识别处理,空调就会打开。当语音芯片收到“打开电视”指令时,经过单片机的识别处理,电视就会打开。

图5.4 灯泡和用电器的开启实物图

4.当我们着急离开家的时候,我们可以通过语音控制关闭电源,把正在运行的电器一起关掉。也可以逐一关掉。



附录A 原理图

图附A1电路原理图


附录B PCB

图附B1电路PCB图


  1. /*************端口信息********************
  2. * 接线说明
  3. LD3320接口                 STM32接口
  4. * RST              PB11
  5. * CS                           PB10
  6. * WR/SPIS          PB12
  7. * P2/SDCK          PB13
  8. * P1/SDO           PB14
  9. * P0/SDI           PB15
  10. * IRQ              PA15
  11. * A0                                        PA8
  12. *****************************************/

  13. /************************************************************************************
  14. //              nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
  15. //              LD_ASR_NONE:                            表示没有在作ASR识别
  16. //              LD_ASR_RUNING:                            表示LD3320正在作ASR识别中
  17. //              LD_ASR_FOUNDOK:                            表示一次识别流程结束后,有一个识别结果
  18. //              LD_ASR_FOUNDZERO:              表示一次识别流程结束后,没有识别结果
  19. //              LD_ASR_ERROR:                            表示一次识别流程中LD3320芯片内部出现不正确的状态
  20. *********************************************************************************/

  21. uint8 nAsrStatus=0;            
  22. void LD3320_Init(void);
  23. uint8 RunASR(void);
  24. void ProcessInt0(void);
  25. void LD3320_EXTI_Cfg(void);
  26. void LD3320_Spi_cfg(void);
  27. void LD3320_GPIO_Cfg(void);
  28. void LED_gpio_cfg(void);
  29. void MOTOR_Implement(u8 mode);
  30. extern void PrintComBit(USART_TypeDef* USARTx, uint8_t Data);
  31. /***********************************************************
  32. * 名    称: LD3320_main(void)
  33. * 功    能: 主函数LD3320程序入口
  34. * 入口参数:
  35. * 出口参数:
  36. * 说    明:
  37. * 调用方法:
  38. **********************************************************/
  39. void  LD3320_main(void)
  40. {
  41.               uint8 nAsrRes=0;
  42.               u8 chuanlian = 0;
  43.               LD3320_Init();               
  44.               while(1)
  45.               {
  46.                   switch(nAsrStatus)
  47.                             {
  48.                                           case LD_ASR_RUNING:
  49.                                           case LD_ASR_ERROR:                           
  50.                                                                                                     break;
  51.                                           case LD_ASR_NONE:
  52.               nAsrStatus=LD_ASR_RUNING;
  53. if (RunASR()==0)              //              启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算
  54.               {                           
  55.                                                         nAsrStatus = LD_ASR_ERROR;
  56.                                                                                                                 }
  57.                                                                                                                 break;

  58.                                           case LD_ASR_FOUNDOK:
  59. nAsrRes = LD_GetResult( );              //识别成功自动 获取识别码,识别码在LDChip.h文件中,自行定义的数据                                                                                                                                                                                                                                                                        
  60. //PrintComBit(USART1,nAsrRes ); //串口输出识别码                           
  61. switch(nAsrRes)                               /*对结果执行相关操作,客户修改*/
  62. {
  63.               case CODE_KD:            
  64.               LED_OPEN();
  65.               PrintCom(USART1,"“开灯”命令识别成功\r\n"); /*text.....*/
  66. break;
  67.               case CODE_GD:            
  68.               LED_CLOSE();
  69.               PrintCom(USART1,"“关灯”命令识别成功\r\n"); /*text.....*/
  70. break;
  71.                                           case CODE_KDS:                           
  72.                                           RELAY1_OPEN();
  73.                                                         PrintCom(USART1,"“打开电视”命令识别成功\r\n"); /*text.....*/
  74. break;
  75. case CODE_GDS:                           
  76. RELAY1_CLOSE();
  77. PrintCom(USART1,"“关闭电视”命令识别成功\r\n"); /*text.....*/
  78. break;
  79.                                                                                                                              
  80.                             case CODE_KKT:
  81.                             RELAY2_OPEN();
  82.                             PrintCom(USART1,"“打开空调”命令识别成功\r\n"); /*text.....*/
  83. break;
  84. case CODE_GKT:            
  85.               RELAY2_CLOSE();
  86.               PrintCom(USART1,"“关闭空调”命令识别成功\r\n"); /*text.....*/
  87. break;
  88. case CODE_KFS:                           
  89.               FAN_OPEN();
  90.               PrintCom(USART1,"“打开风扇”命令识别成功\r\n"); /*text.....*/
  91. break;
  92. case CODE_GFS:                           
  93.               FAN_CLOSE();
  94.               PrintCom(USART1,"“关闭风扇”命令识别成功\r\n"); /*text.....*/
  95. break;
  96.                                                                                                                              
  97. case CODE_KCL:            
  98.               chuanlian = 1;
  99.               PrintCom(USART1,"“打开窗帘”命令识别成功\r\n"); /*text.....*/
  100. break;
  101. case CODE_GCL:                           
  102. chuanlian = 0;
  103.               PrintCom(USART1,"“关闭窗帘”命令识别成功\r\n"); /*text.....*/
  104. break;
  105.               case CODE_GDY:                           
  106. LED_CLOSE();
  107. RELAY1_CLOSE();
  108. RELAY2_CLOSE();
  109. FAN_CLOSE();
  110. chuanlian = 0;
  111. PrintCom(USART1,"“关闭电源”命令识别成功\r\n"); /*text.....*/
  112. break;
  113.               default:break;
  114. }            
  115. nAsrStatus = LD_ASR_NONE;            
  116. break;
  117.                                          
  118. case LD_ASR_FOUNDZERO:
  119. default: nAsrStatus = LD_ASR_NONE;
  120.               PrintCom(USART1,"识别失败\r\n");
  121. break;
  122. }//switch            
  123. if(chuanlian == 1)              MOTOR_Implement(1);                            //打开窗帘
  124. else MOTOR_Implement(0);              //关闭窗帘                           
  125.               }// while

  126. }

  127. void MOTOR_Implement(u8 mode)//步进电机旋转
  128. {
  129. static u16 dj_count=0;
  130.             
  131. if(mode == 1)
  132. {
  133. if(dj_count++ < 100)
  134. {
  135.                             MotorCW();//电机正转,模拟开窗帘
  136. }
  137. else
  138. {
  139.                             dj_count = 100;
  140.                 MotorStop();//旋转到一定程度,电机关闭
  141. }
  142.                                                         sys_delay_ms(1);
  143.                             }
  144.                             else
  145.                             {
  146.                                                         if(dj_count > 0)
  147.                                                         {
  148.                                                                                     dj_count--;
  149.                                                                         MotorCCW();//电机反转,模拟关窗帘
  150.                                                         }
  151.                                                         else
  152.                                                         {
  153.                                                                                     dj_count = 0;
  154.                                                                         MotorStop();//旋转到一定程度,电机关闭
  155.                                                         }
  156.                                                         sys_delay_ms(1);
  157.                             }
  158. }

  159. void PC13_LED()//识别灯闪烁
  160. {
  161.                             LED_PC13_L();
  162.                 sys_delay_ms(60);
  163.                 LED_PC13_H();
  164.                 sys_delay_ms(60);
  165.             
  166.                 LED_PC13_L();
  167.                 sys_delay_ms(60);
  168.                 LED_PC13_H();
  169.                 sys_delay_ms(60);
  170.             
  171.                 LED_PC13_L();
  172.                 sys_delay_ms(60);
  173.                 LED_PC13_H();
  174. }

  175. /***********************************************************
  176. * 名    称:LD3320_Init(void)
  177. * 功    能:模块驱动端口初始配置
  178. * 入口参数:
  179. * 出口参数:
  180. * 说    明:
  181. * 调用方法:
  182. **********************************************************/
  183. void LD3320_Init(void)
  184. {
  185.               LD3320_GPIO_Cfg();            
  186.               LD3320_EXTI_Cfg();
  187.               LD3320_Spi_cfg();            
  188.   MOTOR_GPIO_Init();            
  189.               LED_gpio_cfg();
  190.               LD_reset();
  191.             
  192. }
  193. /***********************************************************
  194. * 名    称:              RunASR(void)
  195. * 功    能:              运行ASR
  196. * 入口参数:
  197. * 出口参数:
  198. * 说    明:
  199. * 调用方法:
  200. **********************************************************/
  201. uint8 RunASR(void)
  202. {
  203.               uint8 i=0;
  204.               uint8 asrflag=0;
  205.               for (i=0; i<5; i++)                                          //              防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
  206.               {
  207.                             LD_AsrStart();                                          //初始化ASR
  208.                             LD3320_delay(100);
  209.                             if (LD_AsrAddFixed()==0)              //添加关键词语到LD3320芯片中
  210.                             {
  211.                                           LD_reset();                                          //              LD3320芯片内部出现不正常,立即重启LD3320芯片
  212.                                           LD3320_delay(50);                                          //              并从初始化开始重新ASR识别流程
  213.                                           continue;
  214.                             }

  215.                             LD3320_delay(10);

  216.                             if (LD_AsrRun() == 0)
  217.                             {
  218.                                           LD_reset();                                          //              LD3320芯片内部出现不正常,立即重启LD3320芯片
  219.                                           LD3320_delay(50);                                          //              并从初始化开始重新ASR识别流程
  220.                                           continue;
  221.                             }

  222.                             asrflag=1;
  223.                             break;                                                                      //              ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
  224.               }

  225.               return asrflag;
  226. }

  227. /***********************************************************
  228. * 名    称: void Delay_( int i)
  229. * 功    能: 短延时
  230. * 入口参数:
  231. * 出口参数:
  232. * 说    明:
  233. * 调用方法:
  234. **********************************************************/
  235. void Delay_( int i)
  236. {   
  237.     while( i--)
  238.        {            

  239.         }
  240. }            
  241. /***********************************************************
  242. * 名    称:              LD3320_delay(unsigned long uldata)
  243. * 功    能:              长延时函数
  244. * 入口参数:
  245. * 出口参数:
  246. * 说    明:
  247. * 调用方法:
  248. **********************************************************/
  249. void  LD3320_delay(unsigned long uldata)
  250. {
  251.               unsigned int j  =  0;
  252.               unsigned int g  =  0;
  253.               for (j=0;j<5;j++)
  254.               {
  255.                             for (g=0;g<uldata;g++)
  256.                             {
  257.                                           Delay_(120);
  258.                             }
  259.               }
  260. }


  261. /***********************************************************
  262. * 名    称:LD3320_GPIO_Cfg(void)
  263. * 功    能:初始化需要用到的IO口
  264. * 入口参数:
  265. * 出口参数:
  266. * 说    明:
  267. * 调用方法:
  268. **********************************************************/
  269. void LD3320_GPIO_Cfg(void)
  270. {            
  271.                   GPIO_InitTypeDef GPIO_InitStructure;
  272.                             // 配置PA8 输出              8M 波形            
  273.                             //定义RST/A0/CS端口
  274.               {
  275.                             RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
  276.                             //LD_CS              /RSET
  277.                             GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10|GPIO_Pin_11;
  278.                             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  279.                             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  280.                             GPIO_Init(GPIOB,&GPIO_InitStructure);
  281.                            
  282.                             GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8;
  283.                             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  284.                             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  285.                             GPIO_Init(GPIOA,&GPIO_InitStructure);
  286.                             GPIO_SetBits(GPIOA,GPIO_Pin_8);              /*A0默认拉高*/
  287.               }
  288. }
  289. /***********************************************************
  290. * 名    称:LD3320_Spi_cfg(void)
  291. * 功    能:配置SPI功能和端口初始化
  292. * 入口参数:
  293. * 出口参数:
  294. * 说    明:
  295. * 调用方法:
  296. **********************************************************/
  297. void LD3320_Spi_cfg(void)
  298. {
  299.               SPI_InitTypeDef  SPI_InitStructure;
  300.               GPIO_InitTypeDef GPIO_InitStructure;
  301.   //spi端口配置
  302.               RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 | RCC_APB2Periph_GPIOB,ENABLE);                 //使能SPI3外设时钟
  303.   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  304.               //P0/P1/P2
  305.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13;
  306.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  307.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  308.               GPIO_Init(GPIOB,&GPIO_InitStructure);

  309.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                          //spis 片选              WR
  310.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  311.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  312.               GPIO_Init(GPIOB, &GPIO_InitStructure);

  313.               LD_CS_H();
  314.             
  315.               //spi功能配置
  316.               SPI_Cmd(SPI2, DISABLE);
  317.               /* SPI3 配置 */
  318.               SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   //全双工
  319.               SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                                                       //主模式
  320.               SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                                         //8位
  321.               SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                                                                       //时钟极性 空闲状态时,SCK保持低电平
  322.               SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                                                       //时钟相位 数据采样从第一个时钟边沿开始
  323.               SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                                                     //软件产生NSS
  324.               SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   //波特率控制 SYSCLK/128
  325.               SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                           //数据高位在前
  326.               SPI_InitStructure.SPI_CRCPolynomial = 7;                                                                                                     //CRC多项式寄存器初始值为7
  327.               SPI_Init(SPI2, &SPI_InitStructure);
  328.               /* 使能SPI3 */
  329.               SPI_Cmd(SPI2, ENABLE);
  330. }
  331. /***********************************************************
  332. * 名    称: LD3320_EXTI_Cfg(void)
  333. * 功    能: 外部中断功能配置和相关端口配置
  334. * 入口参数:
  335. * 出口参数:
  336. * 说    明:
  337. * 调用方法:
  338. **********************************************************/
  339. void LD3320_EXTI_Cfg(void)
  340. {
  341.   EXTI_InitTypeDef EXTI_InitStructure;
  342.               NVIC_InitTypeDef NVIC_InitStructure;
  343.   GPIO_InitTypeDef GPIO_InitStructure;

  344.   //定义IRQ中断引脚配置
  345.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  346.   GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15;
  347.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  348.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  349.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  350.               //外部中断线配置
  351.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
  352.   EXTI_InitStructure.EXTI_Line = EXTI_Line15;
  353.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  354.   EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
  355.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  356.   EXTI_Init(&EXTI_InitStructure);
  357.   EXTI_GenerateSWInterrupt(EXTI_Line15);
  358.                            
  359.               GPIO_SetBits(GPIOA,GPIO_Pin_15);              //默认拉高中断引脚

  360.               EXTI_ClearFlag(EXTI_Line15);
  361.               EXTI_ClearITPendingBit(EXTI_Line15);
  362.               //中断嵌套配置
  363.   NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  364.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  365.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  366.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  367.   NVIC_Init(&NVIC_InitStructure);
  368. }
  369. /***********************************************************
  370. * 名    称:  EXTI1_IRQHandler(void)
  371. * 功    能: 外部中断函数
  372. * 入口参数:
  373. * 出口参数:
  374. * 说    明:
  375. * 调用方法:
  376. **********************************************************/
  377. void EXTI15_10_IRQHandler(void)
  378. {
  379.               if(EXTI_GetITStatus(EXTI_Line15)!= RESET )
  380.               {
  381.                             ProcessInt0();
  382.                             PrintCom(USART1,"进入中断\r\n");
  383.                             EXTI_ClearFlag(EXTI_Line15);
  384.                             EXTI_ClearITPendingBit(EXTI_Line15);
  385.                             PC13_LED();
  386.               }
  387. }
复制代码

以上的Word格式文档51黑下载地址:
基于STM32的智能家居语音控制系统.doc (1.98 MB, 下载次数: 304)
回复

使用道具 举报

ID:223788 发表于 2020-12-7 16:59 | 显示全部楼层
看起来好厉害的样子,支持一下
回复

使用道具 举报

ID:660950 发表于 2020-12-30 16:33 | 显示全部楼层
元器件清单可以发一下吗
回复

使用道具 举报

ID:116773 发表于 2020-12-30 17:15 | 显示全部楼层
也买了一块LD3220语音识别模块,正在熟悉过程中,正好可以借鉴楼主的经验。
回复

使用道具 举报

ID:654855 发表于 2021-1-11 21:52 | 显示全部楼层
楼主不公开源码吗?
回复

使用道具 举报

ID:762171 发表于 2021-3-26 08:47 | 显示全部楼层
最近刚好用到,感谢楼主分享
回复

使用道具 举报

ID:485057 发表于 2021-4-2 06:55 | 显示全部楼层
电流检测电路更为合理,电流超过允许值,可以直接判断系统故障,确保所有设备及控制部分安全
回复

使用道具 举报

ID:652597 发表于 2021-4-16 10:03 来自手机 | 显示全部楼层
可以分享一下ad的原理图吗
回复

使用道具 举报

ID:818895 发表于 2021-5-5 12:30 | 显示全部楼层
我也想尝试一下这个语音模块。
回复

使用道具 举报

ID:319585 发表于 2021-5-13 17:52 来自手机 | 显示全部楼层
那个LD3320不是带着有开关量输出口吗?能不能直接用开关量输出口,不用单片机?
回复

使用道具 举报

ID:79240 发表于 2021-7-2 10:18 | 显示全部楼层

还没玩过语音模块,想试试。
回复

使用道具 举报

ID:1022577 发表于 2022-5-3 10:16 来自手机 | 显示全部楼层
可以分享下原理图吗
回复

使用道具 举报

ID:310441 发表于 2022-5-4 09:08 来自手机 | 显示全部楼层
曾经也尝试过LD3320 模块,但是一个是贵,另一个是操作复杂……现在某一个宝上十元的模块超级好用了
回复

使用道具 举报

ID:987598 发表于 2022-5-12 18:04 | 显示全部楼层
TEXT1.C(2): error C129: missing ';' before 'nAsrStatus'
这是有错吗,楼主
回复

使用道具 举报

ID:901928 发表于 2022-10-12 16:12 | 显示全部楼层
000111222333@ 发表于 2022-5-12 18:04
TEXT1.C(2): error C129: missing ';' before 'nAsrStatus'
这是有错吗,楼主

加个分号呗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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