基于单片机的一种蜂鸣器的简易控制

news/2024/10/18 13:38:57/

有源和无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。这就是通过驱动原理来分别的方法。

buzzer.h

#ifndef __BUZZER_H__
#define __BUZZER_H__#include "stm32l0xx_hal.h"//有源蜂鸣器引脚
#define BUZZER_PORT				GPIOA	
#define BUZZER_PIN				GPIO_PIN_12typedef enum 
{BUZZER_OFF = 0,  // 停止BUZZER_ON,      // 开始 }BUZZER_STATUE_E;typedef struct{BUZZER_STATUE_E Buzzer_SW; 		//蜂鸣器开关uint8_t Buzzer_Times; 	      //蜂鸣器响的次数uint32_t Buzzer_DUR;	        //蜂鸣器响的时长uint32_t Buzzer_OFF_DUR;	    //蜂鸣器不响的时长	uint32_t Buzzer_TEMP;	 
}Buzzer_time_T;extern Buzzer_time_T Buzzer_time;void buzzer_ring(Buzzer_time_T *Buzzer_time_para); void set_buzzer(uint8_t sw,uint8_t times,uint32_t on_time,uint32_t off_time);#endif

buzzer.c

#include "buzzer.h"Buzzer_time_T Buzzer_time;//开蜂鸣器
static void open_buzzer(void)
{HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_SET);
}//关蜂鸣器
static void close_buzzer(void)
{HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET);
}/*********************************************************
根据结构体Buzzer_time的Buzzer_SW、Buzzer_DUR、Buzzer_Times
三个参数确定蜂鸣器开关、每次时长和次数
*********************************************************/
void buzzer_ring(Buzzer_time_T *Buzzer_time_para)
{static uint8_t flag, times_flag;if(Buzzer_time_para->Buzzer_SW){if((Buzzer_time_para->Buzzer_Times) && (times_flag == 0)){			if(!flag){flag = 1;open_buzzer();Buzzer_time_para->Buzzer_TEMP = HAL_GetTick();}if(HAL_GetTick()-Buzzer_time_para->Buzzer_TEMP > Buzzer_time_para->Buzzer_DUR){flag = 0;Buzzer_time_para->Buzzer_Times--;close_buzzer();	if(Buzzer_time_para->Buzzer_Times == 0){Buzzer_time_para->Buzzer_SW = BUZZER_OFF;				Buzzer_time_para->Buzzer_DUR = 0;		times_flag = 0;}else{times_flag = 1;				}}}else if((Buzzer_time_para->Buzzer_Times) && (times_flag == 1)){if(HAL_GetTick()-Buzzer_time_para->Buzzer_TEMP > (Buzzer_time_para->Buzzer_DUR + Buzzer_time_para->Buzzer_OFF_DUR))	{times_flag = 0;}}}else{close_buzzer();}
}/*********************************************************
设置蜂鸣器响的次数及相应时长
*********************************************************/
void set_buzzer(BUZZER_STATUE_E sw,uint8_t times,uint32_t on_time,uint32_t off_time)
{Buzzer_time.Buzzer_SW      = sw;Buzzer_time.Buzzer_Times   = times;  Buzzer_time.Buzzer_DUR     = on_time;Buzzer_time.Buzzer_OFF_DUR = off_time;
}//for simple test
void test_buzzer(void)
{set_buzzer(BUZZER_ON,3,1000,1000);	while(1){buzzer_ring(&Buzzer_time);}
}


http://www.ppmy.cn/news/1540010.html

相关文章

在Linux操作系统上安装NVM教程——CentOS 7/VMware 17版

目录 一、测试网络是否能上网 二、下载阿里云镜像 三、解决执行yum命令出现报错(没有就跳过) 四、下载NVM安装包 五、解压NVM安装包 六、安装Node 七、连接新的动态库 八、升级GLIBC版本 九、安装GCC 十、查看当前服务器CentOS版本 一、测试网…

qiankun 应用之间数据传递

qiankun 应用之间数据传递 全局共享 initGlobalState qiankun initGlobalState API 单击前往 qiankun 内部提供了 initGlobalState 方法用于注册 MicroAppStateActions 实例用于通信,该实例有三个方法,分别是onGlobalStateChange、setGlobalState、of…

精益生产现场管理和改善的具体步骤是什么?

在竞争日益激烈的今天,企业如何才能在保持高效运营的同时,不断提升产品质量与客户满意度?答案就藏在精益生产现场管理和改善之中。今天,就让我们(深圳天行健企业管理咨询公司)一同探索,从混乱无…

掌握 Vue.js 中的 Axios:解密字符串插值和 URL 构建20241011

掌握 Vue.js 中的 Axios:解密字符串插值和 URL 构建 在使用 Vue.js 进行前端开发时,Axios 是一个常用的 HTTP 客户端库,用于与后端服务器进行通信。然而,对于初学者来说,如何正确编写 Axios 请求,特别是在…

广州市孤独症康复训练学校,携手迈向未来

在繁华的广州市,隐藏着一家充满爱与希望的孤独症康复训练学校——星贝育园康复中心。作为全国规模较大的广泛性发育障碍全托寄宿制儿童康复训练机构,星贝育园以其专业的康复理念、科学的训练方法以及显著的康复效果,成为了无数特殊儿童家庭的…

探索 Spring AI:Java 开发者的 AI 应用开发新利器

在当今这个由人工智能驱动的时代,AI 技术正在以前所未有的速度改变着我们的工作和生活方式。对于 Java 开发者来说,将 AI 能力集成到他们的应用程序中,已经成为了一个迫切的需求。阿里云开源的 Spring AI Alibaba 框架,正是为了满…

Axure重要元件三——中继器修改数据

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器修改数据 主要内容:显示编辑内容、表格赋值、修改数据 应用场景:更新行、表单数据行修改 案例展示: 正文…

接口模式、工厂模式、模板方法模式的日志文件系统

日志文件系统 编写一个与具体业务无关的示例代码。这个示例代码主要体现以下几个设计思想和模式: 接口模式(Interface Pattern):定义接口类,并让具体实现类去实现该接口的功能。工厂模式(Factory Pattern…