(1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
(3)实现功能:
① 第一次按下按键,LED点亮,同时蜂鸣器响500ms停止;
② 第二次按下按键,LED熄灭,同时蜂鸣器响500ms停止;
③ 第三次按下按键,重复操作①;
④第四次按下按键,重复操作②,以此类推。
代码实现:
//有源蜂鸣器实验
/*① 第一次按下按键,LED点亮,同时蜂鸣器响500ms停止;
② 第二次按下按键,LED熄灭,同时蜂鸣器响500ms停止;
③ 第三次按下按键,重复操作①;
④第四次按下按键,重复操作②,以此类推*/
#define LED 9
#define KEY 7
#define Buzzer 11
int KEY_NUM = 0; //按键键值变量
void setup()
{
pinMode(LED, OUTPUT); //LED为IO输出
pinMode(KEY, INPUT_PULLUP); //按键为IO带上拉输入
pinMode(Buzzer, OUTPUT); //蜂鸣器为IO输出
digitalWrite(Buzzer, LOW); //蜂鸣器初始为不鸣叫
}
void loop()
{
ScanKey(); //按键扫描
if (KEY_NUM == 1) //当有按键按下时
{
digitalWrite(LED, !digitalRead(LED)); //LED状态翻转
BuzzerDi(); //滴一声
}
}
void ScanKey()
{
KEY_NUM = 0;
if (digitalRead(KEY) == LOW)
{
delay(20); //延时去抖动
if (digitalRead(KEY) == LOW)
{
KEY_NUM = 1; //设置键值
while (digitalRead(KEY) == LOW); //松手检测
}
}
}
void BuzzerDi()
{
digitalWrite(Buzzer, HIGH); //蜂鸣器响
delay(500); //延时500ms
digitalWrite(Buzzer, LOW); //蜂鸣器关闭
}
代码实现:
//无源蜂鸣器实验
//电位器调节蜂鸣器输出频率
#define Pot A0
#define Buzzer 11
int PotBuffer = 0;
void setup()
{
pinMode(Buzzer,OUTPUT); //蜂鸣器引脚设定为输出
}
void loop()
{
PotBuffer = analogRead(Pot); //读取AD值
for(int i = 0 ; i < 100 ; i++) //循环100次
{
digitalWrite(Buzzer,HIGH); //设置输出高电平
delayMicroseconds(PotBuffer); //延时PotBuffer值 us
digitalWrite(Buzzer,LOW); //设置输出低电平
delayMicroseconds(100); //延时100us
}
delay(1000); //延时1000ms
}
(1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
(3)实现功能:按一下按键,触发蜂鸣器报警,蜂鸣器循环播放报警器的声音。
代码实现:
//无源蜂鸣器实验
//按一下按键,触发蜂鸣器报警,蜂鸣器循环播放报警器的声音
#define KEY 7
#define Buzzer 11
int KEY_num = 0; //按键按下标志
void setup()
{
pinMode(KEY, INPUT); //按键为IO输入
pinMode(Buzzer, OUTPUT); //蜂鸣器为IO输出
digitalWrite(Buzzer, LOW); //没有按键按下,蜂鸣器不鸣叫
}
void loop()
{
ScanKey(); //按键扫描
//蜂鸣器发出报警声
if (KEY_num == 1)
{
for (int j = 0; j < 100; j++)
{
for (int i = 200; i <= 800; i++) //频率不断上升
{
tone(Buzzer, i);
delay(5);
}
delay(4000);//保持频率最高的点延迟4秒
for (int i = 800; i >= 200; i--) //频率在不断下降
{
tone(Buzzer, i);
delay(10);
}
}
}
else
{
noTone(Buzzer);//关闭蜂鸣器
}
}
void ScanKey()
{
KEY_num = 0;
if (digitalRead(KEY) == LOW)
{
delay(10); //延时去抖动
if (digitalRead(KEY) == LOW)
{
KEY_num = 1; //按键按下标志
while (digitalRead(KEY) == LOW); //松手检测
}
}
}
代码实现:
//无源蜂鸣器实验
//实现功能:蜂鸣器播放音乐《天空之城》,伴随LED灯闪烁
//定义把每个音符和频率值对应起来
#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
//整首曲子的音符部分,用了一个序列定义为tune,整数
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
};
//整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应)
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
};
int length;//定义一个变量,表示共有多少个音符
int tonePin = 11; //定义蜂鸣器引脚
int led = 10;//定义LED引脚
void setup()
{
pinMode(tonePin, OUTPUT); //设置蜂鸣器的pin为输出模式
pinMode(led, OUTPUT);
length = sizeof(tune) / sizeof(tune[0]); //这里用了一个sizeof函数, 可以查出tone序列里有多少个音符
}
void loop()
{
for (int x = 0; x < length; x++) //循环音符的次数
{
//此函数依次播放tune序列里的数组,即每个音符
tone(tonePin, tune[x]);
//每个音符持续的时间,即节拍duration,调整时间的越大,曲子速度越慢,越小曲子速度越快,节奏可自行调整
digitalWrite(led, HIGH);
delay(300 * duration[x]);
digitalWrite(led, LOW);
delay(200 * duration[x]);
//停止当前音符,进入下一音符
noTone(tonePin);
}
delay(5000);//等待5秒后,循环重新开始
}
参考资料1: 【雕爷学编程】Arduino动手做(49)—有源蜂鸣器模块2
参考资料1: Arduino应用笔记(一)利用蜂鸣器播放天空之城