无源蜂鸣器发声程序(蜂鸣器模块电子设备的发声器官)

报警器、电子门铃、电子音乐贺卡这些DIY小制作中都会用到一个电子模块——蜂鸣器。

无源蜂鸣器发声程序(蜂鸣器模块电子设备的发声器官)(1)

蜂鸣器

蜂鸣器通过电路驱动能发出蜂鸣声,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。

蜂鸣器的分类

按构造方式的不同,可分为:电磁式蜂鸣器和压电式蜂鸣器;

压电式蜂鸣器:

主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出100~500HZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。

电磁式蜂鸣器:

电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

按其驱动方式的原理分,可分为:有源蜂鸣器(a)和无源蜂鸣器(b);

无源蜂鸣器发声程序(蜂鸣器模块电子设备的发声器官)(2)

有源蜂鸣器a和无源蜂鸣器b

注意:这里的“源”不是指电源,而是指震荡源。

有源蜂鸣器内部带震荡源,只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K-5K的方波去驱动它。

有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。

无源蜂鸣器的优点是:

  1. 便宜
  2. 声音频率可控,可以做出“多来米发索拉西”的效果
  3. 在一些特例中,可以和LED复用一个控制口

有源蜂鸣器的优点是:程序控制方便。

驱动方式

常用驱动无源蜂鸣器的方式有两种:

  1. PWM 输出口直接驱动;
  2. 利用I/O 定时翻转电平产生驱动波形对蜂鸣器进行驱动。

PWM 输出口直接驱动是利用PWM 输出口本身可以输出一定的方波来直接驱动蜂鸣器。在单片机的软件设置中有几个系统寄存器是用来设置PWM 口的输出的,可以设置占空比、周期等等,通过设置这些寄存器产生符合蜂鸣器要求的频率的波形之后,只要打开PWM 输出,PWM 输出口就能输出该频率的方波,这个时候利用这个波形就可以驱动蜂鸣器了。比如频率为2000Hz的蜂鸣器的驱动,可以知道周期为500μs,这样只需要把PWM 的周期设置为500μs,占空比电平设置为250μs,就能产生一个频率为2000Hz 的方波,通过这个方波再利用三极管就可以去驱动这个蜂鸣器了。

而利用I/O 定时翻转电平来产生驱动波形的方式会比较麻烦一点,必须利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比如为2500Hz的蜂鸣器的驱动,可以知道周期为400μs,这样只需要驱动蜂鸣器的I/O 口每200μs 翻转一次电平就可以产生一个频率为2500Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动这个蜂鸣器了


蜂鸣器模块介绍

有源蜂鸣器模块电器参数:

  • S8550三极管驱动
  • 工作电压:DC 3.3-5V
  • 触发信号:低电平
  • 规格尺寸:32*13mm

无源蜂鸣器发声程序(蜂鸣器模块电子设备的发声器官)(3)

有源蜂鸣器模块

引脚定义:

  • VCC:接电源正极DC 3.3-5V
  • GND:接电源负极
  • I/O:信号口

无源蜂鸣器模块电器参数:

  • 9012三极管驱动
  • 工作电压:DC 3.3-5V
  • 触发信号:低电平
  • 规格尺寸:20*15mm

无源蜂鸣器发声程序(蜂鸣器模块电子设备的发声器官)(4)

无源蜂鸣器模块

引脚定义:

  • VCC:接电源正极DC 3.3-5V
  • GND:接电源负极
  • I/O:信号口
Arduino实验

下面我们就用Arduino UNO驱动蜂鸣器模块工作吧。

硬件设备:

  • Arduino UNO控制器 × 1
  • 无源蜂鸣器模块 × 1
  • 有源蜂鸣器模块 × 1
  • 电源 × 1
  • 杜邦线 × n

接线图:

无源蜂鸣器发声程序(蜂鸣器模块电子设备的发声器官)(5)

接线图

有源蜂鸣器模块程序:有源蜂鸣器驱动简单,只需给I/O高低点平就可以实现驱动

//蜂鸣器实现间歇性鸣叫 int buzzer=9; //控制蜂鸣器的引脚 void setup() { pinMode(buzzer,OUTPUT); //定义蜂鸣器的引脚为输出 } void loop() { digitalWrite(buzzer,HIGH); //定义蜂鸣器的引脚高电平,静止 delay(1000); //延时1秒 digitalWrite(buzzer,LOW); //定义蜂鸣器的引脚低电平,发声 delay(1000); //延时1秒 }

无源蜂鸣器模块程序:无源蜂鸣器驱动复杂,但是它可以实现更多功能,比如变换发声频率,唱歌等。

//蜂鸣器实现不同频率声音 int buzzer=9; //设置控制蜂鸣器IO脚 void setup() { pinMode(buzzer,OUTPUT); //设置数字IO脚模式,OUTPUT为辒出 } void loop() { unsigned char i,j;//定义变量 while(1) { for(i=0; i<80 ;i ) //输出一个频率的声音 { digitalWrite(buzzer,HIGH); //发声 delay(1); //延时1ms digitalWrite(buzzer,LOW); //不发声 delay(1); //延时ms } for(i=0;i<100 ; i ) //输出另一个频率的声音 { digitalWrite(buzzer,HIGH); //发声 delay(2); //延时2ms digitalWrite(buzzer,LOW); //不发声 delay(2); //延时2ms } } }

//无源蜂鸣器,播放音乐《葫芦娃》 #define NOTE_D0 -1 #define NOTE_D1 294 #define NOTE_D2 330 #define NOTE_D3 350 #define NOTE_D4 393 #define NOTE_D5 441 #define NOTE_D6 495 #define NOTE_D7 556 #define NOTE_DL1 147 #define NOTE_DL2 165 #define NOTE_DL3 175 #define NOTE_DL4 196 #define NOTE_DL5 221 #define NOTE_DL6 248 #define NOTE_DL7 278 #define NOTE_DH1 589 #define NOTE_DH2 661 #define NOTE_DH3 700 #define NOTE_DH4 786 #define NOTE_DH5 882 #define NOTE_DH6 990 #define NOTE_DH7 112 //以上部分是定义是把每个音符和频率值 #define WHOLE 1 #define HALF 0.5 #define QUARTER 0.25 #define EIGHTH 0.25 #define SIXTEENTH 0.625 //这部分是用英文对应了拍子 int tune[] = { NOTE_D0,NOTE_D0,NOTE_D0,NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3, NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D4,NOTE_DH1, NOTE_D3,NOTE_D3,NOTE_D0,NOTE_DH1,NOTE_DH1,NOTE_DH1,NOTE_D7,NOTE_D4,NOTE_D4,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D0,NOTE_D6,NOTE_D7, NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1, NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D2,NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D7,NOTE_D7,NOTE_DH1,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH3,NOTE_DH1,NOTE_DH1,NOTE_DH1, NOTE_DH1,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D7,NOTE_D5,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_DH1,NOTE_DH2,NOTE_DH3,NOTE_DH2,NOTE_DH3,NOTE_DH5, NOTE_DH2,NOTE_DH2,NOTE_DH2,NOTE_D5,NOTE_D5,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3, NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH2,NOTE_DH2,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_DH4,NOTE_DH3,NOTE_DH2,NOTE_DH1, NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1, NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH5,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5, NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D7 }; //这部分就是整首葫芦娃曲子的音符部分,用了一个序列定义为tune,整数 float duration[]= { 1,1,1,0.5,0.5, 1 0.5,0.5,1,1, 1,1,1,0.5,0.5, 1 0.5,0.5,1,1, 1,1,1,1, 1 0.5,0.5,1,1, 1,1,0.5,0.5,0.5,0.5, 1 0.5,0.5,1,1, 1,1,1,0.5,0.5, 1 0.5,0.5,1,1, 1,1,1,0.5,0.5, 1 0.5,0.5,1,1, 1,1,1,0.5,0.5, 1,0.5,0.25,0.25,0.25,0.5, 0.5,0.5,0.5,0.25,0.5,1, 0.5,0.5,0.5,0.5,1,1, 1,1,1,0.5,0.5, 1 0.5,0.5,1,1, 1,1,1,0.5,0.5, 1.5,0.5,1,1, 1,1,1,1, 0.5,0.5,1,1,0.5,0.5, 1.5,0.25,0.5,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 0.5,0.5,1,1,0.5,0.5, 1,0.5,0.5,1,1, 1,1,1,1, 1,1,1,1, 0.5,0.5,1,1,0.5,0.5, 1,0.5,0.25,0.5,1, 1,1,1,0.5,0.5 };//这部分是整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应) int length;//这里定义一个变量,后面用来表示共有多少个音符 int tonePin=9; //蜂鸣器的pin void setup() { pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式 length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数, 可以查出tone序列里有多少个音符 } void loop() { for(int x=0;x<length;x )//循环音符的次数 { tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符 delay(400*duration[x]);//每个音符持续的时间,即节拍duration,是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧 noTone(tonePin);//停止当前音符,进入下一音符 } delay(5000);//等待5秒后,循环重新开始 }

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页