目录
- 前言
- 硬件介绍
- PWM基础
- 蜂鸣器简介
- 原理图分析
- 蜂鸣器驱动电路
- 软件实现
- 蜂鸣器短鸣
- 蜂鸣器功能封装
- 总结
前言
蜂鸣器在生活中的应用实则相当广泛。通过本章你将学会制造噪声 (笑~)你将学会驱动它们,并发出响声。
硬件介绍
PWM基础
占空比
频率
延时实现
定时器实现
蜂鸣器简介
蜂鸣器的英文为Buzzer
,是将电信号转化为音频信号的基本电子器件。蜂鸣器有无源蜂鸣器和有源蜂鸣器两种。
- 无源蜂鸣器:即压电式蜂鸣器。内部不带振荡源,须提供脉冲信号驱动。通过改变频率调节音调高低,改变占空比调节音量大小。
- 有源蜂鸣器:即电磁式蜂鸣器。内部自带振荡源,只需通直流电即响,驱动简单,但频率固定。
这里的源与电源无关,指的是内部是否有振荡源。有源蜂鸣器通常用于只需要发出响声的场景,如:按键音、报警器等等。无源蜂鸣器由于可以改变电压,可以应用于电子琴、变声器中。
图1 无源蜂鸣器 | |
判断有源无源的方法
- 用万用表测试
- 无源蜂鸣器电阻大致为10Ω左右。对于脉冲信号才能发声。
- 有源蜂鸣器电阻大致为几百欧姆。且接通持续发声。
- 看表面封装
- 无源蜂鸣器一般都是无贴纸标识。
- 有源蜂鸣器一般都是有贴纸标识。
原理图分析
蜂鸣器驱动电路
一般IO输出电流小于20mA,不能直接驱动蜂鸣器,需要相应的驱动电路,一般利用三级管的放大和开关作用驱动蜂鸣器。
如图所示,R1用于限制基极电流,R2用于限制蜂鸣器电流,8550为PNP型三极管,当IO引脚为低电平时导通。
对于有源蜂鸣器而言,IO引脚输出低电平就能持续发声。
对于无源蜂鸣器而言,需要IO引脚输出PWM脉冲信号来使之发声。
软件实现
蜂鸣器短鸣
#include <REG52.H>#define DELAY_TIME 100typedef 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,即频率为500Hzi++;}}
}
通过调节不同的频率,可以得到不同音调的声音;调节占空比,可以控制音量高低。
蜂鸣器功能封装
delay.h
#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
#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
#ifndef _BEEP_H_
#define _BEEP_H_#include "delay.h"sbit BEEP_PORT = P1^5;void beep_once(u8, u16);#endif
beep.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
#include "beep.h"void main(){// 以1000Hz频率,50%占空比,持续时间约1sbeep_once(100, 1000);while(1);
}
蜂鸣器本身的控制很简单,它也经常和其他元器件一起搭配使用。
总结
本章相对轻松,了解了蜂鸣器的主要类别与驱动方式。还学习了PWM的基本原理。继续加油!