外部中断的按键实现语音控制
一、实现语音功能1、语音模块的资料2、代码实现二、外部中断的按键实现语音控制一、实现语音功能
1、语音模块的资料
首先我们要做的就是了解语音模块是怎么使用的,那么就要找到语音模块的数据手册,找到了下面就看一下语音模块的参数
2、代码实现
STM32F401RET6与语音模块的的接口
看完上面的材料我们就可以按照语音模块的数据手册和STM32F401RET6与语音模块的原理图来完成我们的代码
下面就写我们的代码,具体的工程是怎么建立的,这里就不说了,不会的可以回去前面看一下,我们就直接上代码
voice.c代码
#include "voice.h"#include "delay.h"void Voice_Config(void){GPIO_InitTypeDef GPIO_InitStruct;//声明结构体变量RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//打开GPIOC的时钟//初始化PB8和PB9GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//通用输出GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;//第5号管脚GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度50MhzGPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//通用输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;//第4号管脚GPIO_Init(GPIOC, &GPIO_InitStruct);}void Data_H(void){Voice_Data_H;Delay_us(1500);Voice_Data_L;Delay_us(500);}void Data_L(void){Voice_Data_H;Delay_us(500);Voice_Data_L;Delay_us(1500);}void Voice_SendData(u8 data){u8 i;Voice_Data_H;Delay_ms(8);Voice_Data_L;Delay_ms(1);for(i = 0;i < 8;i++){if(data & (0x80 >> i)){Data_H();}else{Data_L();}}}
voice.h代码,里面包含了一个位带操作的头文件和延时的头文件
#ifndef _VOICE_H#define _VOICE_H#include "stm32f4xx.h"#include "delay.h"#include "io_bit.h"#define Voice_Data_H PCout(5) = 1#define Voice_Data_L PCout(5) = 0#define Voice_BUSY PCin(4) void Voice_Config(void);void Voice_SendData(u8 data);#endif
main.h也要包含voice.h
#ifndef _MAIN_H#define _MAIN_H#include "stm32f4xx.h"#include "stdio.h"#include "led.h"#include "delay.h"#include "key.h"#include "usart.h"#include "voice.h"#include "systick.h"#include "exit.h"#endif
main.c的代码
#include "main.h"int main(){Voice_Config();Delay_ms(500);Voice_SendData(0x18);Delay_ms(100);while(Voice_BUSY);while(1);}
这样就可以让语音模块响起来了,下面就来用外部中断用按键来实现语音控制
二、外部中断的按键实现语音控制
语音模块的代码还是保持不变,我们再加上外部中断的代码和改一下主程序的代码
exit.h代码
#ifndef _EXIT_H#define _EXIT_H#include "stm32f4xx.h"void Exit_Config(void);#endif
exit.c代码
#include "exit.h"#include "voice.h"#include "led.h"void Exit_Config(void){EXTI_InitTypeDef exit_InitTypeDef;NVIC_InitTypeDef nvic_InitTypeDef;RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13);exit_InitTypeDef.EXTI_Line = EXTI_Line13;exit_InitTypeDef.EXTI_Trigger = EXTI_Trigger_Falling;exit_InitTypeDef.EXTI_Mode = EXTI_Mode_Interrupt;exit_InitTypeDef.EXTI_LineCmd = ENABLE;EXTI_Init(&exit_InitTypeDef);nvic_InitTypeDef.NVIC_IRQChannel=EXTI15_10_IRQn; nvic_InitTypeDef.NVIC_IRQChannelCmd=ENABLE;nvic_InitTypeDef.NVIC_IRQChannelPreemptionPriority=2;nvic_InitTypeDef.NVIC_IRQChannelSubPriority=1;NVIC_Init(&nvic_InitTypeDef);}//外部中断void EXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line13) != RESET){LED1 = 0; Delay_ms(500);Voice_SendData(0x18);Delay_ms(100);while(Voice_BUSY);}EXTI_ClearITPendingBit(EXTI_Line13);}
main.h要包含voice.h和exit.h
#ifndef _MAIN_H#define _MAIN_H#include "stm32f4xx.h"#include "stdio.h"#include "led.h"#include "delay.h"#include "key.h"#include "usart.h"#include "voice.h"#include "systick.h"#include "exit.h"#endif
main.c代码
#include "main.h"int main(){Led_Config();//LED初始化Voice_Config();Exit_Config();Key_Init();//按键初始化while(1){}}
这样我们用外部中断的按键实现语音控制就完成了
如果这篇博文对你有帮助赶紧关注、点赞、收藏吧,感谢你的支持!
后面还会有关于系统滴答定时器的相关实验,每天持续更新…