基于cw32f030c8t6的多功能语音播报提醒装置装置
有幸申请到了武汉芯源公司的大学计划板开发板,本次结合历程探索学习,应一位小学教师朋友的需要,对孩子兴趣启蒙并对孩子们声音大小提醒,故使用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);
}
基于cw32f030c8t6的多功能语音播报提醒装置装置相关推荐
- JAVA小功能语音播报功能
JAVA小功能实现----语音播报功能 来点关注吧 1.先创建一个staticTools类添加如下代码 2.导入jacob.jar包 然后进行window配置 3.复制如下代码到staticTools ...
- 多功能语音播报器使用手册!
通信说明 数据发送间隔:必须大于10毫秒 指令测试 波特率默认115200 串口根据实际情况选择,串口选择下拉框会自动搜索系统当前可用的所有串口 系统参数
- 51单片机温度语音播报系统TTS播报DS18B20温度LCD1602显示
实践制作DIY- GC0023-温度语音播报系统 一.功能说明: 基于51单片机设计-温度语音播报系统 功能介绍: 1.STC89C52单片机(STC89C51/52 AT89C51/52 任选其一) ...
- PLC语音播报器Modbus播报器485播报器
多功能语音播报器 一.功能介绍: 支持语音合成(文字转语音):类真人发声,发音自然,非同类产一字一顿新的机械式语音: 支持音频文件播放:用户可以自定义任何mp3或wma格式音频: 支持语音合成与音频混 ...
- 基于Arduino的多功能智能交通信号灯的设计与实现 ---------对盲人语音播报,红灯结束时铃声提醒,信号灯倒计时和闯红灯语音劝阻
** 基于Arduino的多功能智能交通信号灯的设计与实现 ---------对盲人语音播报,红灯结束时铃声提醒,信号灯倒计时和闯红灯语音劝阻 ** 魏树鸿, 1.系统设计思路 a.: 满足基本信号灯 ...
- php加入语音播报功能_PHP实现语音播报功能
大家估计都知道现在很多AI音响能够给你播报天气,叫你起床...甚至能够接受语音指令!所谓的人工智能音响,听起来很高大上,都说PHP是最好的编程语言,今天我就带大家来实现一个语音播报功能!先大体说一个思 ...
- 案例分享——智能手表(全套解决方案:生理监测、久坐提醒、来电提醒、OTA、无线通信、语音播报、长时间待机等)
[系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <从0到1学习嵌入式Linux开发> <A ...
- iOS推送语音播报(类似支付宝收款提醒)
需求分析 实现类似支付宝微信收款后的语音播报如:支付宝到账xx元.要求是APP在前台运行.锁屏.杀死进程后都会有语音播报.那想到的解决方案就是利用推送了. 功能实现思路分析 上面说了,要使用推送,也就 ...
- iOS 推送语音播报(类似支付宝微信的收款提醒)
项目需求: 近期项目有个需求,实现类似支付宝微信收款后的语音播报如:支付宝到账xx元.要求是APP在前台运行.锁屏.杀死进程后都会有语音播报. 预想方案: 1.通过UIBackgroundTaskId ...
最新文章
- 嘿,是时候重新认识下海淘了
- 写python的c扩展简介
- 洛谷P4322 最佳团伙(树上dp)
- xenserver6.2 内存leak故障处理
- IDLDrawWidaget Activex
- 我的世界java导出皮肤_我的世界Alex1.8夕立poi皮肤
- 斐波那契数列连续十项的和
- python数据分析-python数据统计分析
- Toad for Oracle Authorization key
- Oracle11g客户端client的下载与安装
- Global Shutter(全局快门)与Rolling Shutter(卷帘快门)的区别与比较
- 真西游记java,原来《西游记》原著真的很吓人,我们都被86版西游记骗了?
- RuoYi(若依) 微服务分离版 启动及常见问题总结
- float 精度探究
- 【Qt Quick】零基础入门系列之安装与卸载(一)
- Python通过fake_useragent实现生成随机UserAgent
- swift转场动画_Swift游乐场的演变
- 怎么去掉input textarea 选中后的边线框,textarea 不可以拉
- 9款好看又实用的手机APP UI模板
- 智能手机PDR和VDR思考