有幸申请到了武汉芯源公司的大学计划板开发板,本次结合历程探索学习,应一位小学教师朋友的需要,对孩子兴趣启蒙并对孩子们声音大小提醒,故使用cw32f030c8t6mcu开发这款多功能语音播报提醒装置
功能 如下:
1,开机播放一段开机音频,节奏灯跳动
2,检测环境分贝数
3,根据分贝大小播放触发音频,并升降电机升起
4,三个按键➕lcd屏可视画调节参数
(正片照:节奏灯,升降电机)
(反面照:lcd屏幕,三个按键)
(上面照:usb供电触发口,开关)
功能演示:(由于csdn无法上传视频,给出哔哩哔哩链接 https://b23.tv/3kR70Zf?share_medium=android&share_source=qq&bbid=XXE5484E23ECCA74654CCFCEB674878AF4B29&ts=1688880479575
所用模块:
声音检测模块x1
录音播放模块x2
升降步进电机x1
3w扬声器x1
惠普有源音箱x1
大学计划版套件(mcu lcd屏)
节奏阵列灯x1
PCB主板原理图:
主要代码:
include "main.h"
#include "OLED_I2C.h"
#include "LCD_calculate.h"
#include "Lcd_Driver.h"
#include "stdio.h"
#include "bujin.h"
#include "adc.h"
#include "key.h"
#include "led.h"
u8 flash_buff[20];
extern u8 mode;
extern u8 time_selset_status;
static float val;
static u8 count=0,tongji;
void Noise_Process(float dB_val);
void alarm_Tick(void);
void Lcd_Process(void);
void arm_Process();
u8 AT_flag=0;
u8 dB_flag=0;
s32 dB_time;
float Trag_dB=50.0;
u16 Trag_time=300;
u16 Fall_time=180;
u16 Delay_time=3;
u8 fall_flag;
extern u8 Speed_level;
int main()
{
Sys_64M_Init(); //系统时钟64M,后面将这个函数都放在cw_systick库文件里面
SysTick_Init(64000000);
My_ADC_Init();
BuJin_Init();
LED_Init();
KEY_Init();
Lcd_Init();
Lcd_Clear(WHITE);
JiDian_Music_Action(1);
REC_1_Trag();
PA05_SETHIGH();
S_Delay(2000);
BoFan_1_Trag();
JiDian_USB_Action(0);
while(1)
{
if(uwTick>30000&uwTick<35000)
{
JiDian_Music_Action(0);
}
Noise_Process(Trag_dB);
arm_Process();
Key_Process();
}
}
void Noise_Process(float dB_val)
{
u8 buff[20],buff1[20];
//25次统计如果有15次统计 大于设定值,仍然计时 如果50到150次之内,则不计算时间,<50 时间--
for(count=0;count<25;count++)
{
if(CW_ADC->ISR_f.EOC==1)//CW_ADC->ISR_f.EOC为1标志AD转换完成
{
val=((float)CW_ADC->RESULT0_f.RESULT*3.3/4095+0.6)*120/2.5;
if(val>dB_val) { tongji++;}
}
}
if(count==25)
{
count=0;
if(tongji>=15)
{
dB_flag=1;
}
if(tongji<=5)
{
dB_flag=2;
}
if(tongji>5&&tongji<15)
{
dB_flag=0;
}
tongji=0;
if(mode==0)
{
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 主界面 ");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 参数设置 ");
sprintf((char*)buff," %3.2f(dB) ",val);
sprintf((char*)buff1," %2.1f",Trag_dB);
Gui_DrawFont
按键处理代码:
#include "key.h"
#include "LCD_calculate.h"
#include "Lcd_Driver.h"
#include "bujin.h"
extern float Trag_dB;
extern u16 Trag_time;
extern u16 Fall_time;
extern u16 Delay_time;
extern u16 BuJin_time;
u8 mode=0; //0 主界面 1 修改触发分贝数 2 修改触发时间 3设置开机录音,设置触发录音
u8 Trag;
u8 Cont;
u8 Speed_level=5;
u8 time_selset_status=0;
u8 rec_status,bo_status;
u8 flash_data[20];
#define KB1 GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13)
#define KB2 GPIO_ReadPin(CW_GPIOB,GPIO_PIN_14)
#define KB3 GPIO_ReadPin(CW_GPIOA,GPIO_PIN_4)
#define KB4 GPIO_ReadPin(CW_GPIOB,GPIO_PIN_2)
#define KEYPORT KB1|(KB2<<1)|(KB3<<2)|(KB4<<3) |0xf0
void KEY_Init(void)
{
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
// GPIO_InitStruct.IT = GPIO_IT_FALLING; //KEY_UP
GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
GPIO_InitStruct.Pins = GPIO_PIN_13|GPIO_PIN_14;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
// GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
// GPIO_InitStruct.Pins = GPIO_PIN_8|GPIO_PIN_9;
// GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
// GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
// PB08_SETLOW();
// PB09_SETLOW();
// CW_GPIOB->FILTER_f.FLTCLK=6; //寄存器设置滤波器
//
// CW_GPIOB->ICR_f.PIN13=0;
// __disable_irq();
// NVIC_EnableIRQ(GPIOB_IRQn);
// __enable_irq();
}
void POW_1_Trag()
{
PA00_SETLOW();
S_Delay(50);
PA00_SETHIGH();
}
void POW_2_Trag()
{
PA04_SETLOW();
S_Delay(50);
PA04_SETHIGH();
}
void REC_1_Trag()
{
PA03_SETLOW();
S_Delay(50);
PA03_SETHIGH();
}
void REC_2_Trag()
{
PA07_SETLOW();
S_Delay(50);
PA07_SETHIGH();
}
void BoFan_1_Trag()
{
PA01_SETLOW();
S_Delay(50);
PA01_SETHIGH();
// PA02_SETLOW();
// S_Delay(50);
// PA02_SETHIGH();
}
void BoFan_2_Trag()
{
PA05_SETLOW();
S_Delay(50);
PA05_SETHIGH();
}
void JiDian_USB_Action(u8 Open_Off)
{
if(Open_Off==1)
{
PA08_SETHIGH();
}
if(Open_Off==0)
{
PA08_SETLOW();
}
}
void JiDian_Music_Action(u8 Open_Off)
{
if(Open_Off==1)
{
PA09_SETHIGH();
}
if(Open_Off==0)
{
PA09_SETLOW();
}
}
void Key_Read()
{
u8 keyRead;
keyRead=(KEYPORT)^0xFF;
Trag=keyRead&(keyRead^Cont);
Cont=keyRead;
}
void Key_Process()
{
static u8 num=0,num1=0,num2=0,video_Trag=0,video_Open=0,status=0;
static u16 Time=0;
static u32 keyTick=0;
if(uwTick-keyTick<10) return;
__NVIC_DisableIRQ(SysTick_IRQn);
keyTick=uwTick;
Key_Read();
if(mode==1)
{
if(Trag==0x01)
{
Trag_dB+=0.5;
}
if(Trag==0x04)
{
Trag_dB-=0.5;
}
}
if(mode==2)
{
if(time_selset_status==0)
{
time_selset_status=1;
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 时间阈值设置 ");
Gui_DrawFont_GBK16(10,116,RED,GRAY1,"增加");
Gui_DrawFont_GBK16(85,116,RED,GRAY1,"减少");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK,"点击绿键选中下个");
}
else if(time_selset_status==1)
{
if(Trag==0x01)
{
Trag_time+=5;
}
if(Trag==0x04)
{
Trag_time-=5;
}
if(Trag==0x02)
{
time_selset_status=2;
}
}
else if(time_selset_status==2)
{
if(Trag==0x01)
{
Fall_time+=5;
}
if(Trag==0x04)
{
Fall_time-=5;
}
if(Trag==0x02)
{
time_selset_status=3;
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 开机音频设置 ");
}
}
else if(time_selset_status==3)
{
if(Trag==0x01)
{
Delay_time+=1;
}
if(Trag==0x04)
{
Delay_time-=1;
}
if(Trag==0x02)
{
time_selset_status=0;
}
}
}
if(mode==3)//开机音频设置
{
if(video_Open==0&&Trag==0x01)//按键一按下,录制页面
{
S_Delay(30);
REC_1_Trag();//开机音频录制
rec_status=1;
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 开机音频录制 ");
Gui_DrawFont_GBK16(0,40,WHITE,BLACK," 录制中****** ");
Gui_DrawFont_GBK16(0,100,WHITE,BLACK,"停止");
Gui_DrawFont_GBK16(0,116,WHITE,BLACK,"录制");
video_Open=1;
return;
}
if(video_Open==1)
{
if(Trag==0x01)
{
rec_status=0;
REC_1_Trag();//结束开机音频录制
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,40,WHITE,BLACK," 停止录制 ");
S_Delay(300);
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 开机音频设置 ");
Gui_DrawFont_GBK16(10,116,RED,GRAY1,"录制");
Gui_DrawFont_GBK16(85,116,RED,GRAY1,"播放");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 触发音频设置 ");
video_Open=0;
return;
}
}
if(Trag==0x04)//按键三按下,播放
{
if(rec_status==1)
{
bo_status=1;
}
else
{
bo_status=2;
}
Lcd_Clear(WHITE);
JiDian_Music_Action(1);
BoFan_1_Trag();//开机音频播放
S_Delay(30);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 开机音频播放 ");
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 开机音频 ");
Gui_DrawFont_GBK16(0,40,WHITE,BLACK," 播放中****** ");
S_Delay(300);
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 开机音频设置 ");
Gui_DrawFont_GBK16(10,116,RED,GRAY1,"录制");
Gui_DrawFont_GBK16(85,116,RED,GRAY1,"播放");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 触发音频设置 ");
}
}
if(mode==4)//触发音频设置
{
if(video_Trag==0&&Trag==0x01)//按键一按下,录制页面
{
Lcd_Clear(WHITE);
REC_2_Trag();//触发音频录制
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 触发音频录制 ");
Gui_DrawFont_GBK16(0,40,WHITE,BLACK," 录制中****** ");
Gui_DrawFont_GBK16(0,100,WHITE,BLACK,"停止");
Gui_DrawFont_GBK16(0,116,WHITE,BLACK,"录制");
video_Trag=1;
return;
}
if(video_Trag==1)
{
if(Trag==0x01)
{
REC_2_Trag();//结束触发音频录制
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,40,WHITE,BLACK," 停止录制 ");
S_Delay(300);
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 触发音频设置 ");
Gui_DrawFont_GBK16(10,116,RED,GRAY1,"录制");
Gui_DrawFont_GBK16(85,116,RED,GRAY1,"播放");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 主界面 ");
video_Trag=0;
return;
}
}
if(Trag==0x04)//按键三按下,播放
{
Lcd_Clear(WHITE);
BoFan_2_Trag();//触发音频播放
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 触发音频播放 ");
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 触发音频 ");
Gui_DrawFont_GBK16(0,40,WHITE,BLACK," 播放中****** ");
S_Delay(300);
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 触发音频设置 ");
Gui_DrawFont_GBK16(10,116,RED,GRAY1,"录制");
Gui_DrawFont_GBK16(85,116,RED,GRAY1,"播放");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 主界面 ");
}
}
if(mode==5)
{
if(Trag==0x01)
{
Speed_level--;
BuJin_time+=2;
if(BuJin_time>=21)
{
BuJin_time=21;
Speed_level=0;
}
}
if(Trag==0x04)
{
Speed_level++;
BuJin_time-=2;
if(BuJin_time<2)
{
BuJin_time=2;
Speed_level=10;
}
}
}
if(mode==6)
{
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13)==0)
{
motoni();
}
if(KB3==0)
{
motoshun();
}
else
{
PB08_SETLOW();
PB09_SETLOW();
PB10_SETLOW() ;
PB11_SETLOW();
}
}
if(time_selset_status==0)
{
if(Trag==0x02)
{
if(mode==0)
{
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 分贝阈值设置 ");
Gui_DrawFont_GBK16(10,116,RED,GRAY1,"增加");
Gui_DrawFont_GBK16(85,116,RED,GRAY1,"减少");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 时间阈值设置 ");
mode=1;
status=0;
}
else if(mode==1)
{
mode=2;
status=0;
return;
}
else if(mode==2)
{
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 开机音频设置 ");
Gui_DrawFont_GBK16(10,95,RED,GRAY1,"录制");
Gui_DrawFont_GBK16(80,95,RED,GRAY1,"播放");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 触发音频设置 ");
mode=3;
}
else if(mode==3)
{
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 触发音频设置 ");
Gui_DrawFont_GBK16(10,95,RED,GRAY1,"录制");
Gui_DrawFont_GBK16(80,95,RED,GRAY1,"播放");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 升降电机调速 ");
mode=4;
}
else if(mode==4)
{
if(status==0)
{
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 升降电机调速 ");
Gui_DrawFont_GBK16(10,116,RED,GRAY1,"增加");
Gui_DrawFont_GBK16(85,116,RED,GRAY1,"减少");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 升降电机控制 ");
mode=5;
video_Open=0;
video_Trag=0;
}
}
else if(mode==5)
{
if(status==0)
{
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 升降电机控制 ");
Gui_DrawFont_GBK16(10,116,RED,GRAY1,"升起");
Gui_DrawFont_GBK16(85,116,RED,GRAY1,"下降");
mode=6;
video_Open=0;
video_Trag=0;
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 主界面 ");
}
}
else if(mode==6)
{
if(status==0)
{
Lcd_Clear(WHITE);
Gui_DrawFont_GBK16(0,0,WHITE,BLACK," 主界面 ");
Gui_DrawFont_GBK16(0,144,GREEN,BLACK," 分贝阈值设置 ");
mode=0;
video_Open=0;
video_Trag=0;
}
}
}
}
__NVIC_EnableIRQ(SysTick_IRQn);
}