基于cw32f030c8t6的多功能语音播报提醒装置装置

有幸申请到了武汉芯源公司的大学计划板开发板,本次结合历程探索学习,应一位小学教师朋友的需要,对孩子兴趣启蒙并对孩子们声音大小提醒,故使用cw32f030c8t6mcu开发这款多功能语音播报提醒装置

功能 如下:

1,开机播放一段开机音频,节奏灯跳动

2,检测环境分贝数

3,根据分贝大小播放触发音频,并升降电机升起

4,三个按键➕lcd屏可视画调节参数

b5879b851f9a4a8cb3e7dee86d1065d9.jpg

 (正片照:节奏灯,升降电机)

01ccebe962864bcdadf6e10bf982f884.jpg

 (反面照:lcd屏幕,三个按键)

12dac2122a3b4500b18ca3fd96246ed7.jpg

(上面照: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主板原理图:

 

3e2b31848f7a4dd38d6d5b0f4f1c8ec2.png

 

主要代码:

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);
        }


 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值