本篇介绍电子产品中的发声器件—蜂鸣器,通过控制蜂鸣器播放「葫芦娃」,带你回归美好童年。
1. 了解蜂鸣器
蜂鸣器是一种电子发声元器件,可以发出"beep"的声音。采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器分为有源蜂鸣器和无源蜂鸣器两种。
有源蜂鸣器: 内部带有震荡源,只要一通电就会发出固定频率的声音。
有源蜂鸣器
无源蜂鸣器:内部不带震荡源,需要使用2KHz到5KHz的脉冲信号驱动发声,声音频率可变。
无源蜂鸣器
从外观上来看两种蜂鸣器形状相似,有源蜂鸣器底部有密封,无源蜂鸣器底部可看到电路板。两种蜂鸣器都标注有正负极。
2. 实验材料
Uno R3开发板
配套USB数据线
面包板及配套连接线
有源蜂鸣器
无源蜂鸣器
3. 实验步骤
根据原理图搭建电路。
蜂鸣器正极接开发板数字引脚8,负极接开发板GND,连接非常简单。
电路原理图如下图所示:
电路原理图
实物连接图如下图所示:
实物连接图
新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
/* * BUZZER1 * 有源蜂鸣器控制 */ int buzzer = 8;//设置控制蜂鸣器的数字IO脚 void setup() { pinMode(buzzer, OUTPUT); //设置数字IO脚模式,OUTPUT为输出 } void loop() { digitalWrite(buzzer, HIGH); //发声音 delay(300);//延时300ms digitalWrite(buzzer, LOW); //不发声音 delay(300);//延时300ms }
连接开发板,设置好对应端口号和开发板类型,进行程序下载。
程序下载
下载后有源蜂鸣器发出声音频率固定的声音。
将有源蜂鸣器替换成无源蜂鸣器,拷贝如下代码进行保存并下载。
/* BUZZER2 使用无源蜂鸣器播放《葫芦娃》 */ //对应音符和频率值 #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_DH1, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0, NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0, NOTE_D6, NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0, NOTE_D1, NOTE_D1, NOTE_D3, NOTE_D1, NOTE_D1, NOTE_D3, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0, NOTE_DH1, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0, NOTE_D7, NOTE_D7, NOTE_D5, NOTE_D3, NOTE_D5, NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6, NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0, NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6, NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0, NOTE_D3, NOTE_D3, NOTE_D1, NOTE_DL6, NOTE_D1, NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6, NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6, NOTE_DH1, NOTE_D0, NOTE_D7, NOTE_D5, NOTE_D6, }; //曲子的节拍,即音符持续时间 float duration[] = { 1, 1, 0.5, 0.5, 1, 0.5, 0.5, 0.5, 0.5, 1, 0.5, 0.5, 0.5, 1, 0.5, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 1, 1, 1 + 1, 0.5, 1, 1 + 0.5, 1, 1, 1, 0.5, 0.5, 1, 0.5, 1, 1 + 0.5, 1, 0.5, 0.5, 0.5, 0.5, 1 + 1, 0.5, 1, 1 + 0.5, 1, 1 + 1, 0.5, 0.5, 1, 1 + 1 + 1 + 1, 0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5, 1, 0.5, 1, 1, 0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5, 1, 0.5, 1, 1, 1 + 1, 0.5, 0.5, 1, 1 + 1 + 1 + 1, 0.5, 1, 0.5, 1 + 1, 0.5, 1, 0.5, 1 + 1, 1 + 1, 0.5, 0.5, 1, 1 + 1 + 1 + 1 }; int length;//定义一个变量用来表示共有多少个音符 int tonePin = 8; //蜂鸣器的pin void setup() { pinMode(tonePin, OUTPUT); //设置蜂鸣器的pin为输出模式 length = sizeof(tune) / sizeof(tune[0]); //这里用了一个sizeof函数,查出数组里有多少个音符 } void loop() { for (int x = 0; x < length; x++) //循环音符的次数 { tone(tonePin, tune[x]); //依次播放tune数组元素,即每个音符 delay(400 * duration[x]); //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快 noTone(tonePin);//停止当前音符,进入下一音符 } delay(5000);//等待5秒后,循环重新开始 }
作者:TonyCode
链接:https://www.jianshu.com/p/eae823cc343a
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦