蜂鸣器的介绍
- 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于电子产品中作为发声器件。
- 蜂鸣器主要分为压电式蜂鸣器(无源蜂鸣器)和电磁式蜂鸣器(有源蜂鸣器)两种类型。
- 无源和有源的区别:”源“的不同,其中的”源“不是电源,而是多谐振荡电路。
- 无源蜂鸣器要发出声音必须提供一定频率的脉冲信号(脉冲频率通常在1.5~5KHz),而有源蜂鸣器发出声音只需要提供电源即可。
- 判断蜂鸣器是否为有源或无源:无源的底部是裸露的,有源的底部是封装好的;无源的体积较大,有源的体积较小。(如下图:左边为无源,右边为有源)
蜂鸣器的原理图
因为单片机IO口驱动能力较弱,而驱动蜂鸣器通常需要30mA的电流,可通过三极管放大电流。本次的采用的驱动电路为ULN2003D芯片对电流进行放大。
而ULN2003D芯片可以看作是一个”非“电流,当输入为低(0)时输出为高(1),输入为高(1)时输出为低(0)。
软件设计
实现功能:实现8位LED灯从左到右移动,每次移动结束,蜂鸣器发出声音,一段时间后再关闭,即让管脚输出一定频率的脉冲信号(高低电平)控制无源蜂鸣器。(注意:本次用到为无源蜂鸣器)
#include<reg51.h>
#include"intrins.h"
#define LED_PORT P2
sbit BEEP = P2^5;
typedef unsigned char u8;
typedef unsigned int u16;
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void main()
{
u8 i = 0;
while(1)
{
u16 j = 2000;
LED_PORT = 0xfe;
for(i=0;i<7;i++)
{
LED_PORT = _crol_(LED_PORT,1); //循环左移
delay_10us(10000);
}
while(j--)
{
BEEP=!BEEP;
delay_10us(100); //高低电平的时间都为1ms,所以T=2ms,频率f=1/T=0.5KHz
}
}
}
- 汇编实现
ORG 0000H
AJMP MAIN
MAIN:
MOV P0, #00H ; 数码管清零
MOV A, #0FEH
MOV P2.5, #1 ; 给P2.5赋初值,P2.5也是控制LED灯的D6,所以一开始先赋1,为高电平
MOV R3, #8 ; LED灯循环
MOV R4, #5000 ; 蜂鸣器循环
LED: ; LED从左到右移动
MOV P2, A
LCALL DELAY500MS
RL A
DJNZ R3, LED
BEEP:
CPL P2.5
LCALL DELAY200US;高低电平的时间都为200us,所以T=400us,频率f=1/T=2.5kHZ
; 51单片机用的是无源蜂鸣器,脉冲信号的频率通常为1.5kHz~5kHz
DJNZ R4, BEEP ;循环5000次,蜂鸣器响1S
AJMP MAIN
DELAY500MS: ;误差 0us
MOV R7,#0CDH
DL1:
MOV R6,#74H
DL0:
MOV R5,#09H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
DELAY200US: ;误差 0us
MOV R6,#27H
DL2:
MOV R5,#01H
DJNZ R5,$
DJNZ R6,DL2
RET
若想保持音调不变(频率不变),想改变声音的大小,则通过改变占空比的大小即可,也就是增加高电平的时间,减短低电平的时间。
占空比:占空比是指在一个脉冲循环内,通电时间(高电平)相对于总时间所占的比例。
可将其中蜂鸣器的代码块改为如下所示:
while(j--)
{
BEEP = 0;
delay_10us(50);
BEEP=1;
delay_10us(150);
}