【51单片机实验笔记】声学篇(一) 蜂鸣器基本控制

目录


前言

蜂鸣器 在生活中的应用实则相当广泛。通过本章你将学会制造噪声 (笑~)你将学会驱动它们,并发出响声


硬件介绍

PWM基础

占空比

频率

延时实现

定时器实现


蜂鸣器简介

蜂鸣器 的英文为Buzzer,是将电信号 转化为音频信号 的基本电子器件。蜂鸣器有无源蜂鸣器有源蜂鸣器两种。

  • 无源蜂鸣器 :即压电式蜂鸣器 。内部不带振荡源 ,须提供脉冲信号 驱动。通过改变频率 调节音调 高低,改变占空比 调节音量大小。
  • 有源蜂鸣器 :即电磁式蜂鸣器 。内部自带振荡源 ,只需通直流电即响驱动简单 ,但频率固定

这里的源与电源无关,指的是内部是否有振荡源有源蜂鸣器 通常用于只需要发出响声的场景,如:按键音报警器 等等。无源蜂鸣器 由于可以改变电压,可以应用于电子琴变声器中。

|-----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
| 图1 无源蜂鸣器 | 图2 有源蜂鸣器 |


判断有源无源的方法

  • 万用表 测试
    • 无源 蜂鸣器电阻大致为10Ω 左右。对于脉冲信号才能发声。
    • 有源 蜂鸣器电阻大致为几百欧姆 。且接通持续发声
  • 表面封装
    • 无源 蜂鸣器一般都是无贴纸标识。
    • 有源 蜂鸣器一般都是有贴纸标识。

原理图分析

蜂鸣器驱动电路

一般IO 输出电流小于20mA不能直接 驱动蜂鸣器 ,需要相应的驱动电路 ,一般利用三级管放大开关 作用驱动蜂鸣器

如图所示,R1 用于限制基极电流R2 用于限制蜂鸣器电流8550PNP型三极管 ,当IO引脚为低电平导通

对于有源蜂鸣器 而言,IO引脚输出低电平 就能持续发声。

对于无源蜂鸣器 而言,需要IO引脚输出PWM脉冲信号来使之发声。


软件实现

蜂鸣器短鸣

c 复制代码
#include <REG52.H>

#define DELAY_TIME 100

typedef unsigned char u8;
typedef unsigned int u16;

sbit BEEP = P1^5; //信号端与P1.5引脚相连

void delay(u16 i){
	while(i--);
}

void main(){
	u8 i = 0;
	while(1){
		while(i < DELAY_TIME){
			BEEP = !BEEP; //内部上拉,初始为1,占空比为50%
			delay(100); //延时1ms,周期2ms,即频率为500Hz
			i++;
		}
	}
}

通过调节不同的频率 ,可以得到不同音调 的声音;调节占空比 ,可以控制音量高低


蜂鸣器功能封装

delay.h

c 复制代码
#ifndef _DELAY_H_
#define _DELAY_H_

#include <regx52.h>

typedef unsigned char u8;
typedef unsigned int u16;

void delay_10us(u16);
void delay_ms(u16);

#endif

delay.c

c 复制代码
#include "delay.h"

/**
   *  @brief  延时函数(10us)
   *  @param  t:0~65535,循环一次约10us
   *  @retval 无
   */
void delay_10us(u16 t){
	while(t--);
}

/**
   *  @brief 延时函数(ms)
   *  @param t:0~65535,单位ms
   *  @retval 无
   */
void delay_ms(u16 t){
	while(t--){
		delay_10us(100);
	}
}

beep.h

c 复制代码
#ifndef _BEEP_H_
#define _BEEP_H_

#include "delay.h"

sbit BEEP_PORT = P1^5;

void beep_once(u8, u16);

#endif

beep.c

c 复制代码
#include "beep.h"

/**
   *  @brief 蜂鸣器单响
   *  @param t 持续时长, fre 频率HZ
   *  @retval
   */
void beep_once(u8 t, u16 fre){
	while(t--){
		BEEP_PORT = !BEEP_PORT; // 取反
		delay_10us(1e5/2/fre);
	}
}

main.c

c 复制代码
#include "beep.h"

void main(){
	// 以1000Hz频率,50%占空比,持续时间约1s
	beep_once(100, 1000);
	while(1);
}

蜂鸣器 本身的控制很简单 ,它也经常和其他元器件一起搭配使用


总结

本章相对轻松,了解了蜂鸣器主要类别驱动方式 。还学习了PWM基本原理。继续加油!

相关推荐
笨笨饿14 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim
kdxiaojie15 小时前
Linux USB驱动阅读笔记(1)
linux·笔记·学习·usb
半生过往15 小时前
前端学 Java 课程笔记
java·前端·笔记
九硕智慧建筑一体化厂家16 小时前
楼宇自控|智慧建筑核心引擎!楼宇自控系统,赋能建筑高效低碳运维
运维·人工智能·笔记·智慧城市
千秋岁rr16 小时前
5.0 TIM
单片机·嵌入式硬件
GGMM78916 小时前
施耐德 VX5A1HC90110(VX5A1HD9011)ATV61/ATV71 90‑110KW 电源驱动板详解
笔记·变频器·变频器维修
Wang's Blog17 小时前
PostgreSQL笔记48: 全文检索与向量检索的对比与混合检索实践
笔记·postgresql·全文检索
liuyicenysabel18 小时前
Flask 个人站 iProfile 上线笔记(k3s + Nginx + Let‘s Encrypt)
笔记·nginx·flask
深蓝海拓18 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十五)后续完善和改进:PLC端数据解析的防粘包、残包、废包、拆包
笔记·学习·plc
小黄蚁18 小时前
LVGL学习笔记(六)
笔记·学习