可分为压电蜂鸣器和电磁蜂鸣器。压电发声比较小,而电磁蜂鸣器因为线圈通电会振动,所以体积比较小。

根据驱动方式分为主动蜂鸣器和主动蜂鸣器。这里的主动和被动不是指,而是来源。主动蜂鸣器内部有一个振荡源。如图9-8所示,如果给定一个BUZZ引脚,蜂鸣器将直接鸣响。但无源蜂鸣器内部没有振荡源,必须由500 Hz到4.5 kHz之间的信号驱动才能发声。主动蜂鸣器往往比被动蜂鸣器贵,因为里面很多,驱动发音简单,可以按级别驱动,而被动蜂鸣器价格更便宜。此外,被动蜂鸣器的声音频率可以控制,音阶与频率有一定的对应关系,因此可以产生“do re mi fa sol拉斯”的效果,并可以用它产生简单的音乐曲目,如生日歌、二虎等。

图9-8蜂鸣器

让我们看看图9-8中的电路。蜂鸣器电流还是比较大的,需要驱动,增加一个100欧姆的电阻作为限流电阻。此外,增加了一个D4二极管,称为续流二极管。我们的蜂鸣器是感应装置。当三极管导通给蜂鸣器供电时,会有传导电流流过蜂鸣器。我们知道,其中一个电感是电流不能突变,接通时电流逐渐增大,这是没有问题的。但当它关断时,被“电源-三极管-蜂鸣器-地”的线路切断,不能通任何电流,那么储存的电流去哪里,也就是被D4和蜂鸣器本身的回路消耗掉,从而避免了关断时电感电流造成的反向冲击。断开时继续电流,这是续流二极管名称的由来。

蜂鸣器常用在电脑、打印机、万用表等设备上,发出提示声音。提示音一般都很简单,就是简单的发出声音。我们简单的做了一个4KHZ频率的声音节目和一个1KHZ频率的声音节目。学生可以自己研究该程序,并比较实际结果。

# & ltreg52.h>。

sbit buzz = p1^6;//bee pin

无符号字符T0RH = 0;//T0过载值的高字节

无符号字符T0RL = 0;//T0过载值的低位字节

OpenBuzz;

void StOpBuzz;

void main{

无符号int I;

TMOD = 0x 01;//将T0配置为在模式1下工作,但不要先启动

EA = 1;

{ //启用全局中断

OpenBuzz;//以4千赫兹的频率启动蜂鸣器

for;

stopBuzz;//停止蜂鸣器

for;

OpenBuzz;//启动频率为1KHz的蜂鸣器

for;

stopBuzz;//停止蜂鸣器

for;

}

}

/*蜂鸣器启动功能,频率-工作频率*/

void OpenBuzz{

无符号int reload//计算所需的过载值

reload = 65536-/;//给定计时器的过载值

T0RH =;//16位重载值分解为高字节和低字节

T0RL =重载;

TH0 = 0xFF//设置一个接近溢出的初始值,使定时器立即工作

TL0 = 0xFE

ET0 = 1;//使能T0中断

TR0 = 1;//开始T0

}

/*蜂鸣器停止功能*/

void StopBuzz{

ET0 = 0;//禁用T0中断

TR0 = 0;//停止T0

}

/* T0中断服务功能,控制蜂鸣器鸣响*/

void中断时间0{

TH0 = T0RH//重载重载值

TL0 = T0RL

BUZZ = ~ BUZZ//反向蜂鸣器控制电平

}

另外,用蜂鸣器输出音乐只是好玩,应用很少。里面有音阶和乐谱,程序有点复杂,就不详细解释了。能玩“二虎”的节目只有一个。可以下载到板子上玩,满足好奇心。

纯文本复制

#include <。reg52.h>。

sbit buzz = p1^6;//蜂鸣器控制引脚

无符号int code NoteFrequ = {//对应中音1-7和高音1-7的频率列表

523,587,659,698,784,880,988,// alto 1-7

1047,1175,1319,1397,1568,1760,1976//treble 1-7

};

无符号int code note reload= {//timer reload值对应中音1-7和高音1-7

65536-/,// alto 1

65536 - / , //2

65536 - / , //3

65536 - / , //4

65536 - / , //5

65536 - / , //6

65536 - / , //7

65536-/,//高音1

65536 - / , //2

65536 - / , //3

65536 - / , //4

65536 - / , //5

65536 - / , //6

65536 - / , //7

};

bit = 1;//蜂鸣器鸣响启用标志

位TMR flag = 0;//完成标志

无符号字符T0RH = 0xFF//T0过载值的高字节

无符号字符T0RL = 0x00//T0过载值的低位字节

void PlaytowTiger;

void main{

无符号int I;

EA = 1;//启用全局中断

TMOD = 0x 01;//将T0配置为在模式1下工作

TH0 = T0RH

TL0 = T0RL

ET0 = 1;//使能T0中断

TR0 = 1;//开始T0

while {

playwotiger;//玩音乐——两只老虎

for;//停一会儿

}

}

/*两个老虎音乐播放功能*/

void PlayWorTiger{

无符号字符节拍;//当前节拍索引

无符号字符注释;//当前节拍对应的音符

无符号int e = 0;//当前节拍计时

无符号整数BeatTime = 0;//当前节拍的总时间

无符号int SoundTime = 0;//当前节拍需要发声

//两张虎符表

无符号字符代码TwoTigerNote = {

1, 2, 3, 1, 1, 2, 3, 1, 3, 4, 5, 3, 4, 5,

5,6, 5,4, 3, 1, 5,6, 5,4, 3, 1, 1, 5, 1, 1, 5, 1,

};

//两只老虎拍桌子,4代表一拍,1代表1/4拍,8代表2拍

无符号字符代码TwoTigerBeat = {

4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8,

3,1, 3,1, 4, 4, 3,1, 3,1, 4, 4, 4, 4, 8, 4, 4, 8,

};

//使用节拍索引作为循环变量

for;){

while;//每次定时器中断后,检测并处理节拍

TMR flag = 0;

If { //当前节拍结束时开始新的节拍

note = two tigernote-1;

T0RH =注意重新加载>;>。8;

T0RL = note reload;

//计算总节拍时间。向右移动2位相当于除以4。移位代替除法可以加快执行速度

beat time =>>。2;

//计算发声时间,是总时间的0.75。换挡原理同上

声音时间=节拍时间-;

enable = 1;//指示蜂鸣器开始鸣响

time++;

}e{ //如果当前节拍未结束,则处理当前节拍

//当当前时长达到总拍时间时归零。

//并增加节拍索引,为开始新的节拍做准备

if {

时间= 0;

beat++;

}否则{ //当当前时长未达到总时长时,

time++;//累计时间计数

//到达发声时间后,指示关闭蜂鸣器。

//插入0.25*总时间的静音间隔。

if {

enable = 0;//用于区分两个连续的节拍

}

}

}

}

}

/* T0中断服务功能,控制蜂鸣器鸣响*/

void中断定时器0中断1{

TH0 = T0RH//重载重载值

TL0 = T0RL

TMR flag = 1;

If { //启用时反转蜂鸣器控制电平

BUZZ = ~ BUZZ

}否则{ //当蜂鸣器未启用时将其关闭

BUZZ = 1;

}

}

原始链接:

1.《蜂鸣器程序 单片机蜂鸣器控制程序和驱动电路》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《蜂鸣器程序 单片机蜂鸣器控制程序和驱动电路》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/1780952.html