tft每日頭條

 > 生活

 > 無源蜂鳴器發聲程序

無源蜂鳴器發聲程序

生活 更新时间:2024-12-21 10:06:36

報警器、電子門鈴、電子音樂賀卡這些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秒後,循環重新開始 }

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved