当前位置: 首页 > article >正文

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

一,硬件接线

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

二,语音模块图形化代码实现

我这边直接用了1.0版本的了,后面的陀机和风扇后面硬件接上就好了,现在主要看控小灯

三,代码实现

/*
  ******************************************************************************
  * @file    main.c 
  * @author  
  * @version V1.0
  * @date    2024/12/30
  * @brief   本代码通过检测PA15的电平高低,来做出相应的动作,(目前)实现通过
			 来控制小灯的开关
			 往后	PB3		--->	负责检测SG90
					PB4		--->	负责检测风扇
  ******************************************************************************
*/

#include "stm32f10x.h"
#include "delay_us.h"
#include "delay_ms.h"
#include "string.h"

/* Private typedef   用于记录用户自定义的一些数据类型的别名-------------------*/


/* Private define    用于记录用户自定义的类型,比如结构体、共用体、枚举-------*/


/* Private macro     用于记录用户自定义的宏定义-------------------------------*/


/* Private variables 用于记录用户自定义的全局变量-----------------------------*/
uint8_t  u1_rxbuf[512] = {0}; //作为UART1的接收缓冲区
uint32_t u1_rxcnt = 0;        //作为UART1的接收计数器


/* Private function prototypes 用于记录用户自定义的函数声明-------------------*/



/* Private functions 用于记录用户自定义的函数原型-----------------------------*/


/**
  * @brief  该函数初始化IO引脚,用于LED的点亮
  * @param  None
  * @retval None
  */
void LED_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	//打开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

	//配置引脚参数
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	//输出高电平(点亮小灯)
	GPIO_SetBits(GPIOC, GPIO_Pin_14);
}

/**
  * @brief  该函数初始化IO引脚,用于检测PA15的电平变化
  * @param  None
  * @retval None
  */
void GPIOA_Pin15_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	//打开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//配置引脚参数,配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}



/**
  * @brief  该函数初始化USART1,用于BLE通信
  * @param  None
  * @retval None
  */
void USART1_Config(u32 baud)
{
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef  NVIC_InitStructure;
	GPIO_InitTypeDef  GPIO_InitStructure;

	//打开GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//打开USART2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	//重映射IO引脚为串口功能
	GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);


	//配置GPIO的引脚
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	//配置UART1的参数    最常用的格式: 1bit停止位  8bit数据位  No校验位  9600bps
	USART_InitStructure.USART_BaudRate = baud;											//波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;							//数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;								//停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;									//校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 	//无流控
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;     				//全双工
	USART_Init(USART1, &USART_InitStructure);

	//配置USART的中断
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	//选择UART1的中断源   接收到数据则触发中断请求
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

	//打开UART1串口
	USART_Cmd(USART1, ENABLE);
	
}



/**
  * @brief  程序的入口
  * @param  None
  * @retval None
  */
int main(void)
{
	LED_Config();
	USART1_Config(9600);
	GPIOA_Pin15_Config();
  
	while (1)
	{
/*--------------------------------------------当语言模块信号来时------------------------------------------------------------------*/
		//检测LED,当检测为高电平时开灯
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 1)
		{  
			GPIO_SetBits(GPIOC,GPIO_Pin_14); 	//输出高电平,开灯
			
		}
		else
		{
			GPIO_ResetBits(GPIOC,GPIO_Pin_14); 	//输出低电平,关灯
		  
		}
		
		
		
/*--------------------------------------------当蓝牙信号来时------------------------------------------------------------------*/
		//判断UART2是否接收到数据  假设接收到 "led_on",则让LED点亮
		if( u1_rxcnt > 0 && strstr((char *)u1_rxbuf,"led_on"))
		{
			
			GPIO_SetBits(GPIOC,GPIO_Pin_14); //输出高电平	
			u1_rxcnt = 0; //计数器复位
			memset((char *)u1_rxbuf,0,512); //清空数组
		}
		
		//判断UART2是否接收到数据  假设接收到 "led_off",则让LED熄灭
		if( u1_rxcnt > 0 && strstr((char *)u1_rxbuf,"led_off"))
		{
			
			GPIO_ResetBits(GPIOC,GPIO_Pin_14); //输出低电平	
			u1_rxcnt = 0; //计数器复位
			memset((char *)u1_rxbuf,0,512); //清空数组
		}


	}
}


/**
* @brief  This function handles USRAT1 interrupt request.
* @param  None
* @retval None
*/
void USART1_IRQHandler(void)
{
 
  //判断是否接收到数据
  if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
  {   
      //把串口收到的字节存储到变量data中
      u1_rxbuf[u1_rxcnt++] = USART_ReceiveData(USART1); 
			if( u1_rxcnt >= 512 )
			{
				u1_rxcnt = 0;
			}
		  
  }
}





/********************** (C) COPYRIGHT Your Name xxxx@126.com***END OF FILE****/

核心代码:

/**
  * @brief  该函数初始化IO引脚,用于检测PA15的电平变化
  * @param  None
  * @retval None
  */
void GPIOA_Pin15_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	//打开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//配置引脚参数,配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}

/*--------------------------------------------当语言模块信号来时------------------------------------------------------------------*/
		//检测LED,当检测为高电平时开灯
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 1)
		{  
			GPIO_SetBits(GPIOC,GPIO_Pin_14); 	//输出高电平,开灯
			
		}
		else
		{
			GPIO_ResetBits(GPIOC,GPIO_Pin_14); 	//输出低电平,关灯
		  
		}


http://www.kler.cn/a/467317.html

相关文章:

  • 【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析
  • Redis - 5 ( 18000 字 Redis 入门级教程 )
  • 125个Docker的常用命令
  • CANFD芯片在商业航天的应用
  • [Linux]进程间通信-共享内存与消息队列
  • 《Rust权威指南》学习笔记(二)
  • 机器学习之过采样和下采样调整不均衡样本的逻辑回归模型
  • 常见中间件漏洞(tomcat,weblogic,jboss,apache)
  • 【管道——二分+区间合并】
  • .Net加密与Java互通
  • Ubuntu静态IP地址
  • HTML——78. 图像地图
  • 【AWS SDK PHP】This operation requests `sigv4a` auth schemes 问题处理
  • 常见的 MySQL 性能问题
  • 框架Tensorflow2
  • 《Rust权威指南》学习笔记(四)
  • Elasticsearch:Lucene 2024 年回顾
  • 豆包 MarsCode 编程助手之Visual Studio Code快速开始教程
  • 【数据可视化-10】国防科技大学录取分数线可视化分析
  • SQL Server 数据库 忘记密码
  • 5.1 冒泡排序与选择排序
  • 对一个双向链表,从尾部遍历找到第一个值为x的点,将node p插入这个点之前,如果找不到,则插在末尾。使用C语言实现
  • Unity3D仿星露谷物语开发16之角色拾取道具
  • spark环境搭建
  • T-SQL语言的编程范式
  • 如何不修改模型参数来强化大语言模型 (LLM) 能力?