基于STM32F103的语音控制模块的应用(实现语音控制小灯开关) ...

慢吞云雾缓吐愁  论坛元老 | 2025-1-4 05:27:36 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1531|帖子 1531|积分 4593

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一,硬件接线

把语音模块的5v 和  GND  跟主控芯片的5v 和 GND 连接起来,就能一起供电了

二,语音模块图形化代码实现
我这边直接用了1.0版本的了,后面的陀机和风扇后面硬件接上就好了,现在主要看控小灯





三,代码实现
  1. /*
  2.   ******************************************************************************
  3.   * @file    main.c
  4.   * @author  
  5.   * @version V1.0
  6.   * @date    2024/12/30
  7.   * @brief   本代码通过检测PA15的电平高低,来做出相应的动作,(目前)实现通过
  8.                          来控制小灯的开关
  9.                          往后        PB3                --->        负责检测SG90
  10.                                         PB4                --->        负责检测风扇
  11.   ******************************************************************************
  12. */
  13. #include "stm32f10x.h"
  14. #include "delay_us.h"
  15. #include "delay_ms.h"
  16. #include "string.h"
  17. /* Private typedef   用于记录用户自定义的一些数据类型的别名-------------------*/
  18. /* Private define    用于记录用户自定义的类型,比如结构体、共用体、枚举-------*/
  19. /* Private macro     用于记录用户自定义的宏定义-------------------------------*/
  20. /* Private variables 用于记录用户自定义的全局变量-----------------------------*/
  21. uint8_t  u1_rxbuf[512] = {0}; //作为UART1的接收缓冲区
  22. uint32_t u1_rxcnt = 0;        //作为UART1的接收计数器
  23. /* Private function prototypes 用于记录用户自定义的函数声明-------------------*/
  24. /* Private functions 用于记录用户自定义的函数原型-----------------------------*/
  25. /**
  26.   * @brief  该函数初始化IO引脚,用于LED的点亮
  27.   * @param  None
  28.   * @retval None
  29.   */
  30. void LED_Config(void)
  31. {
  32.         GPIO_InitTypeDef GPIO_InitStructure;
  33.         //打开时钟
  34.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  35.         //配置引脚参数
  36.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;
  37.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  38.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  39.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  40.        
  41.         //输出高电平(点亮小灯)
  42.         GPIO_SetBits(GPIOC, GPIO_Pin_14);
  43. }
  44. /**
  45.   * @brief  该函数初始化IO引脚,用于检测PA15的电平变化
  46.   * @param  None
  47.   * @retval None
  48.   */
  49. void GPIOA_Pin15_Config(void)
  50. {
  51.         GPIO_InitTypeDef GPIO_InitStructure;
  52.         //打开时钟
  53.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  54.         //配置引脚参数,配置为浮空输入模式
  55.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
  56.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  57.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  58. }
  59. /**
  60.   * @brief  该函数初始化USART1,用于BLE通信
  61.   * @param  None
  62.   * @retval None
  63.   */
  64. void USART1_Config(u32 baud)
  65. {
  66.         USART_InitTypeDef USART_InitStructure;
  67.         NVIC_InitTypeDef  NVIC_InitStructure;
  68.         GPIO_InitTypeDef  GPIO_InitStructure;
  69.         //打开GPIOA的时钟
  70.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  71.         //打开USART2的时钟
  72.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  73.         //重映射IO引脚为串口功能
  74.         GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
  75.         //配置GPIO的引脚
  76.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  77.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  78.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  79.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  80.         //配置UART1的参数    最常用的格式: 1bit停止位  8bit数据位  No校验位  9600bps
  81.         USART_InitStructure.USART_BaudRate = baud;                                                                                        //波特率
  82.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;                                                        //数据位
  83.         USART_InitStructure.USART_StopBits = USART_StopBits_1;                                                                //停止位
  84.         USART_InitStructure.USART_Parity = USART_Parity_No;                                                                        //校验位
  85.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;         //无流控
  86.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                                     //全双工
  87.         USART_Init(USART1, &USART_InitStructure);
  88.         //配置USART的中断
  89.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  90.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  91.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  92.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  93.         NVIC_Init(&NVIC_InitStructure);
  94.         //选择UART1的中断源   接收到数据则触发中断请求
  95.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  96.         //打开UART1串口
  97.         USART_Cmd(USART1, ENABLE);
  98.        
  99. }
  100. /**
  101.   * @brief  程序的入口
  102.   * @param  None
  103.   * @retval None
  104.   */
  105. int main(void)
  106. {
  107.         LED_Config();
  108.         USART1_Config(9600);
  109.         GPIOA_Pin15_Config();
  110.   
  111.         while (1)
  112.         {
  113. /*--------------------------------------------当语言模块信号来时------------------------------------------------------------------*/
  114.                 //检测LED,当检测为高电平时开灯
  115.                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 1)
  116.                 {  
  117.                         GPIO_SetBits(GPIOC,GPIO_Pin_14);         //输出高电平,开灯
  118.                        
  119.                 }
  120.                 else
  121.                 {
  122.                         GPIO_ResetBits(GPIOC,GPIO_Pin_14);         //输出低电平,关灯
  123.                   
  124.                 }
  125.                
  126.                
  127.                
  128. /*--------------------------------------------当蓝牙信号来时------------------------------------------------------------------*/
  129.                 //判断UART2是否接收到数据  假设接收到 "led_on",则让LED点亮
  130.                 if( u1_rxcnt > 0 && strstr((char *)u1_rxbuf,"led_on"))
  131.                 {
  132.                        
  133.                         GPIO_SetBits(GPIOC,GPIO_Pin_14); //输出高电平       
  134.                         u1_rxcnt = 0; //计数器复位
  135.                         memset((char *)u1_rxbuf,0,512); //清空数组
  136.                 }
  137.                
  138.                 //判断UART2是否接收到数据  假设接收到 "led_off",则让LED熄灭
  139.                 if( u1_rxcnt > 0 && strstr((char *)u1_rxbuf,"led_off"))
  140.                 {
  141.                        
  142.                         GPIO_ResetBits(GPIOC,GPIO_Pin_14); //输出低电平       
  143.                         u1_rxcnt = 0; //计数器复位
  144.                         memset((char *)u1_rxbuf,0,512); //清空数组
  145.                 }
  146.         }
  147. }
  148. /**
  149. * @brief  This function handles USRAT1 interrupt request.
  150. * @param  None
  151. * @retval None
  152. */
  153. void USART1_IRQHandler(void)
  154. {
  155.   //判断是否接收到数据
  156.   if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
  157.   {   
  158.       //把串口收到的字节存储到变量data中
  159.       u1_rxbuf[u1_rxcnt++] = USART_ReceiveData(USART1);
  160.                         if( u1_rxcnt >= 512 )
  161.                         {
  162.                                 u1_rxcnt = 0;
  163.                         }
  164.                   
  165.   }
  166. }
  167. /********************** (C) COPYRIGHT Your Name xxxx@126.com***END OF FILE****/
复制代码

核心代码:
  1. /**
  2.   * @brief  该函数初始化IO引脚,用于检测PA15的电平变化
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void GPIOA_Pin15_Config(void)
  7. {
  8.         GPIO_InitTypeDef GPIO_InitStructure;
  9.         //打开时钟
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  11.         //配置引脚参数,配置为浮空输入模式
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  14.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  15. }
  16. /*--------------------------------------------当语言模块信号来时------------------------------------------------------------------*/
  17.                 //检测LED,当检测为高电平时开灯
  18.                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 1)
  19.                 {  
  20.                         GPIO_SetBits(GPIOC,GPIO_Pin_14);         //输出高电平,开灯
  21.                        
  22.                 }
  23.                 else
  24.                 {
  25.                         GPIO_ResetBits(GPIOC,GPIO_Pin_14);         //输出低电平,关灯
  26.                   
  27.                 }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

慢吞云雾缓吐愁

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表