首页 > 其他分享 >buzzer模块

buzzer模块

时间:2023-10-14 17:24:30浏览次数:26  
标签:buzzer sound 蜂鸣器 bzr alarm 模块 time HAL

1 目的:

A  很多产品中都要使用蜂鸣器模块,有的产品中蜂鸣器只需要做为按键音,提示用户有按键按下,有的产品中蜂鸣器做为告警声,不同的警告有不同的蜂鸣音。

B  虽然蜂鸣器直接用MCU的GPIO控制即可,置IO高或低,蜂鸣器就会鸣叫或关闭,但是在有的产品中,它的控制却并不简单。例如:出现A高告警以滴滴2声的方式鸣叫,出现B告警以滴滴滴3声的方式鸣叫,更有的产品,以某种方式鸣叫10次后停 止,所以要按以上方式控制好蜂鸣器其实并不简单,没有一两个小时激励的脑力活动是做不出这些功能的,至少对我来说是这样。

C 综上,经过一番思考后特开发了以下蜂鸣器模块,支持以滴滴滴3声的方式鸣叫,鸣叫次数可以通过参数控制,参数为0xFFFF时一直鸣叫直至断电,支持普通的按键提示音,即短时间鸣叫后自动停止。

D 如果有多种类型的告警提示音,可以在 BUZZER_ALARM 结构体内在定义一个函数指针,在定义BUZZER_ALARM对象的时候赋值不同的告警处理函数即可 bzr_alarming_process()。

E 该模块使用方法,把 bzr_buzzing_process(); bzr_alarming_process();函数放入主循环中,在函数要启动蜂鸣器或使蜂鸣器发出告警音的地方直接调用bzr_buzzing(),bzr_alarming()即可。

2 代码:

#include "main.h"
#include "buzzer.h"
#include "stm32f1xx_hal.h"
/* USER CODE BEGIN 0 */

#define portBUZZER_PORT   GPIOA
#define portBUZZER_PIN      GPIO_PIN_6

 uint8_t bzr_enabled;
 uint16_t bzr_duration;
 uint32_t bzr_time_stamp;


void bzr_buzzing(uint16_t duration)
{
    // OPEN the port corresponde to buzzer pin
    HAL_GPIO_WritePin(portBUZZER_PORT,portBUZZER_PIN,GPIO_PIN_SET);
    WRITE_REG(bzr_enabled,1);
    bzr_time_stamp = HAL_GetTick();
    bzr_duration = duration;
}

 

void bzr_buzzing_process(void) //the main loop called this function every cycle
{
    if(bzr_enabled){
      if(( HAL_GetTick()- bzr_time_stamp)>bzr_duration){
           //shut down the corresponde buzzer pin.
               HAL_GPIO_WritePin(portBUZZER_PORT,portBUZZER_PIN,GPIO_PIN_RESET);
             CLEAR_REG(bzr_enabled);
        }
    }
}

// type1: 滴-滴-滴 --- 滴-滴-滴
// type2: 滴--滴 -- 滴--滴
typedef struct{
uint8_t type;//
uint16_t sound_time;
uint16_t silent_time;
}BUZZER_ALARM;//存在多种报警的时候报警函数分别处理。不同类型处理采用函数指针,在//使能报警时,根据不同type的报警,示指针指向不同类型的报警函数。

//为了不把问题复杂化,定义下面宏
//#define SOUND_TIME   200
//#define SLIENT_TIME  200

  uint8_t bzr_alarm_enabled;//报警使能
  uint32_t bzr_alarm_stamp;//报警使能时的时间戳
  uint8_t bzr_alarm_state;//报警状态机
  uint8_t bzr_alarm_times;//报警次数
  uint16_t bzr_alarm_interval;//报警间隔

void bzr_alarming(uint16_t times, uint16_t interval)
{
    WRITE_REG(bzr_alarm_enabled,1);
    bzr_alarm_stamp = HAL_GetTick();
    bzr_alarm_state = 0;
    bzr_alarm_times = times;
    bzr_alarm_interval = interval;
}

BUZZER_ALARM bzr={
  .type         = 1,
  .sound_time = 60,
  .silent_time = 50,
};
void bzr_alarming_process(void) //call this function every cycle
{
    if(bzr_alarm_enabled){
       if(bzr_alarm_times){
          switch(bzr_alarm_state){
              case 0://响
                bzr_buzzing(bzr.sound_time);
                bzr_alarm_state=1;
                break;
              
              case 1://停
                if((HAL_GetTick()-bzr_alarm_stamp) >( bzr.sound_time + bzr.silent_time)){
                    bzr_alarm_state=2;
                }
                break;
                
              case 2://响
                 bzr_buzzing(bzr.sound_time);
                 bzr_alarm_state=3;

                 break;
              
              case 3://停
                if((HAL_GetTick()-bzr_alarm_stamp) >(bzr.sound_time+ bzr.silent_time+ bzr.sound_time + bzr.silent_time)){
                    bzr_alarm_state=4;
                }
                break;

              case 4://响
                bzr_buzzing(bzr.sound_time);
                bzr_alarm_state=5;
              break;
              
              case 5://停
                if((HAL_GetTick()-bzr_alarm_stamp) >( bzr.sound_time + bzr.silent_time+ bzr.sound_time + bzr.silent_time+bzr.sound_time+bzr_alarm_interval)){
                 
                  bzr_alarm_stamp =HAL_GetTick();
                  bzr_alarm_state=0;    
                  bzr_alarm_times--;                    
                }
                break;
            
           }
        }
     else{
          bzr_alarm_enabled =0;
     }     
   } 
}

 

标签:buzzer,sound,蜂鸣器,bzr,alarm,模块,time,HAL
From: https://www.cnblogs.com/okyihu/p/17764393.html

相关文章

  • css-图片和文字小模块
    <!DOCTYPEhtml><htmllang="zh"> <head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width,initial-scale=1.0"> <title>Document</title> <sc......
  • STM32 RTC模块的使用
    1STM32实时时钟RTC原理:   A外部晶振采用32.768KHz的原因,因为2的15次方2^15=32768,所以32.768KHz分频15次后刚好是1Hz,1S就是1Hz。   BRTC模块有一个实时计数器RealTimeCounter,它对震荡源脉冲计数,每个脉冲计数器加1,所以不能从该计数器直接获取时间时、分、秒。......
  • 无涯教程-Matplotlib - PyLab模块
    PyLab是Matplotlib面向对象绘图库的接口,Matplotlib是整个软件包,matplotlib.pyplot是Matplotlib包中的模块,PyLab是一个与Matplotlib一起安装的模块。基本绘图使用plot命令绘制曲线。它需要一对相同长度的数组(或序列)-fromnumpyimport*frompylabimport*x=linspace(......
  • python3的模块FastAPI,APIRouter
    FastAPI将依赖项的值从include_router传递给路由FastAPI依赖项和include_router在FastAPI中,依赖项是一种重要的机制,用于处理从请求到响应的整个过程中所需的各种依赖关系,例如数据库连接、身份验证等。依赖项可以被注入到请求处理函数中,并在执行时提供所需的值。在FastAPI中,我......
  • 通过 modules 创建 vuex 的模块
    模块拆分:1.在store文件夹下再新建文件夹modules,在modules下新建xxx.js文件:eg:新建user.js文件conststate={ userInfo:{  name:'zs',  age:18 }, score:80}constmutations={}constactions={}constgetters={}exportdefault......
  • BOSHIDA DC电源模块低温是否影响转换效率
    BOSHIDADC电源模块低温是否影响转换效率DC电源模块是一种常用的电源转换装置,其主要作用是将输入的电源信号变换成需要的输出电源信号。在实际应用中,DC电源模块的性能会受到多种因素的影响,其中低温也是一个重要的影响因素。本文将从转换效率的角度,探讨低温对DC电源模块的影响。......
  • Go语言模块管理:GO111MODULE的含义
    在cmd中使用goenv命令可以查看到我们的GOPATH环境变量。其目录结构为:bin:存放代码编译后的二进制文件pkg:存放编译后的库文件src:存放自己编写的Go语言代码文件在Go1.11后新增了modules特性,模块是相关Go包的集合。如果在cmd中执行以下命令将GO111MODULE变量的值设为on:go......
  • 4 PyExecJS模块
    PyExecJS模块pyexecjs是一个可以帮助我们运行js代码的一个第三方模块.其使用是非常容易上手的.但是它的运行是要依赖能运行js的第三方环境的.这里我们选择用node作为我们运行js的位置.1.1安装Nodejs切记.重启pycharm或者重启电脑.1.2安装pyexecjspipinstall......
  • vue3.2+ts报错:找不到模块“./App.vue”或其相应的类型声明。
    解决方法:在项目根目录创建env.d.ts 文件(如果已有,则在文件中追加)加入下面内容:declaremodule'*.vue'{ importtype{DefineComponent}from'vue'; constvueComponent:DefineComponent<{},{},any>; exportdefaultvueComponent;} 报错原因:未定义.vue文件......
  • python模块之sys模块
    sys.argvsys模块是python解释器交互的一个接口该模块提供对解释器使用或维护的一些变量的访问和获取它提供了许多函数和变量来处理python运行时欢姐的不同部分importsysprint(sys.argv)test=sys.argv[1]iftest=="shawn":print("iamshawn")eliftest=="s......