由STM32F103C8T6和ISD1820,LCD1602,按键模块组成的录音设备,具体写一下语音采集的代码
时间: 2023-09-30 12:09:41 浏览: 69
好的,下面是基于STM32F103C8T6、ISD1820、LCD1602和按键模块的语音采集代码:
首先,我们需要使用STM32的定时器来控制ISD1820的录音时间,并使用ADC采集模拟信号,将其转换为数字信号。在这里,我们将使用ADC1和TIM2。
```c
#include "stm32f10x.h"
void init_ADC(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
}
void init_TIM2(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = 65535;
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
// 停止录音
ISD1820_StopRecord();
}
}
int main(void)
{
// 初始化ADC和TIM2
init_ADC();
init_TIM2();
// ...
while(1)
{
if(按键1被按下)
{
// 开始录音
ISD1820_StartRecord();
// 启动ADC
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
int16_t data = ADC_GetConversionValue(ADC1);
// 保存录音数据
ISD1820_SaveData(data);
}
}
}
```
在上面的代码中,我们初始化了ADC和TIM2,并在按键1被按下时开始录音并启动ADC。ADC采样完成后,我们将数据保存到ISD1820中。在录音时间到达后,TIM2中断会被触发,停止录音。
下面是ISD1820的控制代码:
```c
#include "stm32f10x.h"
void ISD1820_StartRecord(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
void ISD1820_StopRecord(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
}
void ISD1820_SaveData(int16_t data)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
for(int i = 0; i < 16; i++)
{
if(data & 0x8000)
GPIO_SetBits(GPIOB, GPIO_Pin_3);
else
GPIO_ResetBits(GPIOB, GPIO_Pin_3);
GPIO_SetBits(GPIOB, GPIO_Pin_2);
GPIO_ResetBits(GPIOB, GPIO_Pin_2);
data <<= 1;
}
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
}
```
在上面的代码中,我们定义了三个函数。`ISD1820_StartRecord`函数用于开始录音,`ISD1820_StopRecord`函数用于停止录音,`ISD1820_SaveData`函数用于保存录音数据。在保存数据时,我们将数据写入ISD1820的16位数据口中。
最后,我们需要初始化GPIO和LCD1602,并在LCD1602上显示录音状态。
```c
#include "stm32f10x.h"
#include "delay.h"
#include "lcd1602.h"
void init_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
int main(void)
{
// 初始化GPIO和LCD1602
init_GPIO();
LCD1602_Init();
// ...
while(1)
{
if(按键1被按下)
{
// 开始录音
ISD1820_StartRecord();
// 启动ADC
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
int16_t data = ADC_GetConversionValue(ADC1);
// 保存录音数据
ISD1820_SaveData(data);
// 显示录音状态
LCD1602_Clear();
LCD1602_WriteString("Recording...");
while(TIM_GetFlagStatus(TIM2, TIM_IT_Update) == RESET);
LCD1602_Clear();
LCD1602_WriteString("Recording end");
}
}
}
```
在上面的代码中,我们初始化了GPIO和LCD1602,并在按键1被按下时开始录音。在录音过程中,我们在LCD1602上显示“Recording...”字样。在录音完成后,我们在LCD1602上显示“Recording end”字样。
以上就是基于STM32F103C8T6、ISD1820、LCD1602和按键模块的语音采集代码。
阅读全文