【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基本原理。继续加油!

相关推荐
蓬荜生灰11 分钟前
永磁无刷电机旋转原理
单片机·嵌入式硬件
笑衬人心。2 小时前
Ubuntu 22.04 修改默认 Python 版本为 Python3 笔记
笔记·python·ubuntu
金色光环2 小时前
【Modbus学习笔记】stm32实现Modbus
笔记·stm32·学习
zyxzyx6663 小时前
Flyway 介绍以及与 Spring Boot 集成指南
spring boot·笔记
西岭千秋雪_4 小时前
Redis性能优化
数据库·redis·笔记·学习·缓存·性能优化
Ronin-Lotus5 小时前
嵌入式硬件与应用篇---寄存器GPIO控制
stm32·单片机·嵌入式硬件·微处理器原理与应用
HuashuiMu花水木5 小时前
Matplotlib笔记4----------图像处理
图像处理·笔记·matplotlib
DES 仿真实践家6 小时前
【Day 11-N22】Python类(3)——Python的继承性、多继承、方法重写
开发语言·笔记·python
IMPYLH12 小时前
Python 的内置函数 reversed
笔记·python
星辰pid12 小时前
STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)
stm32·单片机·嵌入式硬件·机械臂