首页 » 互联网 » 单片机蜂鸣器的控制轨范与驱动电路图_蜂鸣器_节奏

单片机蜂鸣器的控制轨范与驱动电路图_蜂鸣器_节奏

乖囧猫 2024-12-03 04:14:32 0

扫一扫用手机浏览

文章目录 [+]

按照驱动办法分为有源蜂鸣器和无源蜂鸣器。
这里的有源和无源不是指电源,而是振荡源。
有源蜂鸣器内部带了振荡源,如图1中所示,给了 BUZZ 引脚一个低电平,蜂鸣器就会直接响。
而无源蜂鸣器内部是不带振荡源的,要让他响必须给 500Hz~4.5KHz 之间的脉冲频率旗子暗记来驱动它才会响。
有源蜂鸣器每每比无源蜂鸣器贵一些,由于里边多了振荡电路,驱动发音也大略,靠电平就可以驱动,而无源蜂鸣器价格比较便宜,此外无源蜂鸣器声音频率可以掌握,而音阶与频率又有确定的对应关系,因此就可以做出来“do re mi fa sol la si”的效果,可以用它制作出大略的音乐曲目,比如生日歌、两只老虎等等。

图1 蜂鸣器电路事理图

单片机蜂鸣器的控制轨范与驱动电路图_蜂鸣器_节奏 互联网

我们来看一下图1的电路,蜂鸣器电流依然相对较大,因此须要用三极管驱动,并且加了一个 100 欧的电阻作为限流电阻。
此外还加了一个 D4 二极管,这个二极管叫做续流二极管。
我们的蜂鸣器是感性器件,当三极管导通给蜂鸣器供电时,就会有导通电流流过蜂鸣器。
而我们知道,电感的一个特点便是电流不能突变,导通时电流是逐渐加大的,这点没有问题,但当关断时,经“电源-三极管-蜂鸣器-地”这条回路就截断了,过不了任何电流了,那么储存的电流往哪儿去呢,便是经由这个 D4 和蜂鸣器自身的环路来花费掉了,从而就避免了关断时由于电感电流造成的反向冲击。
接续关断时的电流,这便是续流二极管名称的由来。

蜂鸣器常常用于电脑、打印机、万用表这些设备上做提示音,提示音一样平常也很大略,便是大略发出个声音就行,我们用程序大略做了个 4KHZ 频率下的发声和 1KHZ 频率下的发声程序,同学们可以自己研究下程序,比较下实际效果。

#include

sbit BUZZ = P1^6; //蜂鸣器掌握引脚

unsigned char T0RH = 0; //T0 重载值的高字节

unsigned char T0RL = 0; //T0 重载值的低字节

void OpenBuzz(unsigned int frequ);

void StopBuzz();

void main(){

unsigned int i;

TMOD = 0x01; //配置 T0 事情在模式 1,但先不启动

EA = 1;

while (1){ //使能全局中断

OpenBuzz(4000); //以 4KHz 的频率启动蜂鸣器

for (i=0; i<40000; i++);

StopBuzz(); //停滞蜂鸣器

for (i=0; i<40000; i++);

OpenBuzz(1000); //以 1KHz 的频率启动蜂鸣器

for (i=0; i<40000; i++);

StopBuzz(); //停滞蜂鸣器

for (i=0; i<40000; i++);

}

}

/ 蜂鸣器启动函数,frequ-事情频率 /

void OpenBuzz(unsigned int frequ){

unsigned int reload;//打算所需的定时看重载值

reload = 65536 - (11059200/12)/(frequ2); //由给定频率打算定时看重载值

T0RH = (unsigned char)(reload >> 8); //16 位重载值分解为高低两个字节

T0RL = (unsigned char)reload;

TH0 = 0xFF; //设定一个靠近溢出的初值,以使定时器立时投入事情

TL0 = 0xFE;

ET0 = 1; //使能 T0 中断

TR0 = 1; //启动 T0

}

/ 蜂鸣器停滞函数 /

void StopBuzz(){

ET0 = 0; //禁用 T0 中断

TR0 = 0; //停滞 T0

}

/ T0 中断做事函数,用于掌握蜂鸣器发声 /

void InterruptTimer0() interrupt 1{

TH0 = T0RH; //重新加载重载值

TL0 = T0RL;

BUZZ = ~BUZZ; //反转蜂鸣器掌握电平

}

其余用蜂鸣器来输出音乐,仅仅是好玩而已,运用很少,里边包含了音阶、乐谱的干系内容,程序也有一点繁芜,以是就不详细给大家去讲解了。
仅供应一个可以播放《两只老虎》的程序,大家可以下载到板子上玩玩,知足一下好奇心。

纯文本复制

#include

sbit BUZZ = P1^6; //蜂鸣器掌握引脚

unsigned int code NoteFrequ[] = { //中音 1-7 和高音 1-7 对应频率列表

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

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

};

unsigned int code NoteReload[] = { //中音 1-7 和高音 1-7 对应的定时看重载值

65536 - (11059200/12) / (5232), //中音 1

65536 - (11059200/12) / (5872), //2

65536 - (11059200/12) / (6592), //3

65536 - (11059200/12) / (6982), //4

65536 - (11059200/12) / (7842), //5

65536 - (11059200/12) / (8802), //6

65536 - (11059200/12) / (9882), //7

65536 - (11059200/12) / (10472), //高音 1

65536 - (11059200/12) / (11752), //2

65536 - (11059200/12) / (13192), //3

65536 - (11059200/12) / (13972), //4

65536 - (11059200/12) / (15682), //5

65536 - (11059200/12) / (17602), //6

65536 - (11059200/12) / (19762), //7

};

bit enable = 1; //蜂鸣器发声使能标志

bit tmrflag = 0; //定时器中断完成标志

unsigned char T0RH = 0xFF; //T0 重载值的高字节

unsigned char T0RL = 0x00; //T0 重载值的低字节

void PlayTwoTiger();

void main(){

unsigned int i;

EA = 1; //使能全局中断

TMOD = 0x01; //配置 T0 事情在模式 1

TH0 = T0RH;

TL0 = T0RL;

ET0 = 1; //使能 T0 中断

TR0 = 1; //启动 T0

while (1){

PlayTwoTiger(); //播放乐曲--两支老虎

for (i=0; i<40000; i++); //停滞一段韶光

}

}

/ 两支老虎乐曲播放函数 /

void PlayTwoTiger(){

unsigned char beat; //当前节拍索引

unsigned char note; //当前节拍对应的音符

unsigned int time = 0; //当前节拍计时

unsigned int beatTime = 0; //当前节拍总韶光

unsigned int soundTime = 0; //当前节拍需发声韶光

//两只老虎音符表

unsigned char code 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 拍

unsigned char code 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 (beat=0; beat

while (!tmrflag); //每次定时器中断完成后,检测并处理节拍

tmrflag = 0;

if (time == 0){ //当前节拍播完则启动一个新节拍

note = TwoTigerNote[beat] - 1;

T0RH = NoteReload[note] >> 8;

T0RL = NoteReload[note];

//打算节拍总韶光,右移 2 位相称于除 4,移位代替除法可以加快实行速率

beatTime = (TwoTigerBeat[beat] NoteFrequ[note]) >> 2;

//打算发声韶光,为总韶光的 0.75,移位事理同上

soundTime = beatTime - (beatTime >> 2);

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

time++;

}else{ //当前节拍未播完则处理当前节拍

//当前持续韶光到达节拍总韶光时归零,

//并递增节拍索引,以准备启动新节拍

if (time >= beatTime){

time = 0;

beat++;

}else{ //当前持续韶光未达到总韶光时,

time++; //累加韶光计数

//到达发声韶光后,指示关闭蜂鸣器,

//插入 0.25总韶光的静音间隔,

if (time == soundTime){

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

}

}

}

}

}

/ T0 中断做事函数,用于掌握蜂鸣器发声 /

void InterruptTimer0() interrupt 1{

TH0 = T0RH; //重新加载重载值

TL0 = T0RL;

tmrflag = 1;

if (enable){ //使能时反转蜂鸣器掌握电平

BUZZ = ~BUZZ;

}else{ //未使能时关闭蜂鸣器

BUZZ = 1;

}

}

相关文章