外部中断的按键实现语音控制
一、实现语音功能
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和PB9
GPIO_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;//速度50Mhz
GPIO_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)
{
}
}
这样我们用外部中断的按键实现语音控制就完成了
如果这篇博文对你有帮助赶紧关注、点赞、收藏吧,感谢你的支持!
后面还会有关于系统滴答定时器的相关实验,每天持续更新…