欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 基于STM32F103的语音控制模块的应用(实现语音控制小灯开关)

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

2025/1/7 13:56:04 来源:https://blog.csdn.net/weixin_72119871/article/details/144854946  浏览:    关键词:基于STM32F103的语音控制模块的应用(实现语音控制小灯开关)

一,硬件接线

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

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

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

三,代码实现

/******************************************************************************** @file    main.c * @author  * @version V1.0* @date    2024/12/30* @brief   本代码通过检测PA15的电平高低,来做出相应的动作,(目前)实现通过来控制小灯的开关往后	PB3		--->	负责检测SG90PB4		--->	负责检测风扇******************************************************************************
*/#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校验位  9600bpsUSART_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); 	//输出低电平,关灯}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com