//无源蜂鸣器实验 //实现功能:蜂鸣器播放音乐《天空之城》,伴随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, NO
时间: 2025-05-19 22:15:15 浏览: 21
### 使用无源蜂鸣器和LED实现播放《天空之城》音乐及灯光闪烁
为了在Arduino上通过无源蜂鸣器播放《天空之城》的旋律,并让LED灯同步闪烁,可以按照以下方法设计程序。以下是完整的代码示例以及相关说明。
#### Arduino代码实现
下面是一个基于Arduino平台的代码示例,用于控制无源蜂鸣器播放《天空之城》的音符序列,并使连接到指定端口的LED灯随节奏闪烁:
```cpp
// 定义常量和变量
const int buzzPin = 3; // 连接到无源蜂鸣器的引脚编号
const int ledPin = 8; // LED灯连接的引脚编号
int notes[] = {
261, 294, 330, 349, 392, 440, 494, 523 // 音阶频率对应表(C D E F G A B C')
};
int melody[] = { // 天空之城部分旋律对应的音高索引
7, 7, 7, 6, 5, 6, 7,
7, 7, 6, 5, 4, 5, 6,
7, 7, 7, 6, 5, 6, 7,
7, 7, 6, 5, 4, 5, 6
};
int durations[] = { // 对应每一段音符持续时间的比例因子
2, 2, 2, 2, 2, 2, 4,
2, 2, 2, 2, 2, 2, 4,
2, 2, 2, 2, 2, 2, 4,
2, 2, 2, 2, 2, 2, 4
};
void setup() {
pinMode(buzzPin, OUTPUT); // 设置蜂鸣器引脚为输出模式
pinMode(ledPin, OUTPUT); // 设置LED灯引脚为输出模式
}
void loop() {
for (int i = 0; i < sizeof(melody)/sizeof(int); i++) {
int noteDuration = 1000 / durations[i]; // 计算当前音符的实际持续时间
tone(buzzPin, notes[melody[i]-1], noteDuration); // 发出声音
digitalWrite(ledPin, HIGH); // 打开LED灯
delay(noteDuration * 0.9); // 延迟一段时间以匹配音符长度
noTone(buzzPin); // 关闭蜂鸣器发声
digitalWrite(ledPin, LOW); // 关闭LED灯
delay(noteDuration * 0.1); // 添加短暂停顿效果
}
}
```
上述代码实现了以下几个功能:
- `buzzPin` 被定义为无源蜂鸣器所连的数字引脚。
- `melody[]` 数组存储了歌曲《天空之城》的部分旋律,其中每个整数代表一个特定的音调位置。
- `durations[]` 数组决定了各个音符的时间比例关系[^1]。
当执行此代码时,蜂鸣器会依次发出设定好的一系列音符,而LED则会在每次音符响起的同时点亮,在短暂延迟之后熄灭。
#### 技术要点解析
1. **音符映射**:利用数组来表示不同音高的频率值,便于后续操作中快速访问所需的音频数据[^1]。
2. **延时机制**:通过调整`delay()`函数参数中的具体数值,精确控制每一个音节之间的间隔长短,从而形成自然流畅的乐曲演奏过程。
3. **硬件交互逻辑**:结合GPIO接口驱动外部设备完成动作响应,比如这里提到的发光二极管状态切换与声波信号生成相互配合工作流程[^1]。
#### 注意事项
- 确认使用的蜂鸣器类型是否正确;如果是有源蜂鸣器,则无需调用`tone()`命令即可产生固定频率的声音[^1]。
- 如果希望增加更多复杂度或者改变现有配置,请注意修改相应资源分配情况下的兼容性和稳定性测试环节[^2]。
相关问题
阅读全文
相关推荐


















