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

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

buzzer.h

复制代码
#ifndef __BUZZER_H__
#define __BUZZER_H__

#include "stm32l0xx_hal.h"


//有源蜂鸣器引脚
#define BUZZER_PORT				GPIOA	
#define BUZZER_PIN				GPIO_PIN_12

typedef 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);
	}
}
相关推荐
七牛开发者4 小时前
从 GLM 到 GPT,HarnessPro 如何用 RSI 降低 Agent 成本
人工智能·gpt·agent·harness·rsi
跨境卫士-小汪4 小时前
TikTokShop欧洲商品接口架构调整跨境技术团队需要做好哪些准备
大数据·人工智能·新媒体运营·跨境电商·跨境·营销策略
康小汪5 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
收放扳机6 小时前
多机连线(In-Line)场景下,收放板机“缓存工位”的容量与架构选型参考
人工智能·科技·自动化·制造·pcb工艺
武天旭6 小时前
AI安全--AI大模型的后门攻击检测与防御
人工智能·深度学习·安全·机器学习
zhangrelay6 小时前
新版|-|单片机原理与接口技术-2026持续改进优化-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈
笔记·单片机·嵌入式硬件·学习
智能运维指南6 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
人工智能AI技术6 小时前
DeepInfer开源炸场!别再妄想个人电脑跑满血DeepSeek
人工智能
深蓝电商API6 小时前
用AI生成拟人行为:让鼠标轨迹更“有人味”
人工智能·爬虫
znnnk6 小时前
数据库被AI“重写”:2026,从CPU中心走向GPU中心
数据库·人工智能·oracle