Keil5 蜂鸣器演奏多首音乐 - 按键切换歌曲
#include <stc8h.h>
#define BUZZER P1_5
// 定义乐曲音符频率 #define NOTE_C4 262 #define NOTE_D4 294 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_G4 392 #define NOTE_A4 440 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_D5 587 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_G5 784 #define NOTE_A5 880 #define NOTE_B5 988
// 定义乐曲时长 #define WHOLE 1600 #define HALF 800 #define QUARTER 400 #define EIGHTH 200 #define SIXTEENTH 100
// 第一首乐曲 int melody1[] = { NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, 0, NOTE_B4, NOTE_C5, 0, NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, 0, NOTE_B4, NOTE_C5, 0, NOTE_D5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_G4, NOTE_G4, 0, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, 0, NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, 0, NOTE_B4, NOTE_C5, 0, NOTE_D5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_G4, NOTE_G4, 0, NOTE_A4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4 };
// 第一首乐曲时长 int noteDurations1[] = { QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH, EIGHTH, QUARTER, EIGHTH };
// 第二首乐曲 int melody2[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4 };
// 第二首乐曲时长 int noteDurations2[] = { QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, WHOLE, QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, WHOLE };
int currentMelody = 1; // 当前播放的乐曲编号
void setup() { P1M1 &= ~0x20; // 将 P1.5 设置为推挽输出模式 P1M0 |= 0x20; }
void loop() { if (currentMelody == 1) { playMelody(melody1, noteDurations1, sizeof(melody1) / sizeof(melody1[0])); } else if (currentMelody == 2) { playMelody(melody2, noteDurations2, sizeof(melody2) / sizeof(melody2[0])); } }
// 播放乐曲 void playMelody(int melody[], int noteDurations[], int length) { for (int i = 0; i < length; i++) { int noteDuration = noteDurations[i]; tone(BUZZER, melody[i], noteDuration); delay(noteDuration * 1.3); // 等待音符结束,增加延时可调整演奏速度 noTone(BUZZER); } }
// 播放音符 void tone(int pin, int frequency, int duration) { long cycles = FOSC / frequency / 2; // 计算周期 long t = cycles / 12; // 计算每个波形周期的时间 long t2 = t * 2; // 计算一个周期的一半时间 for (long i = 0; i < duration * 1000L; i += t2) { // 根据时长循环播放 digitalWrite(pin, HIGH); // 输出高电平 delayMicroseconds(t); // 等待一半时间 digitalWrite(pin, LOW); // 输出低电平 delayMicroseconds(t); // 等待一半时间 } }
// 停止播放音符 void noTone(int pin) { digitalWrite(pin, LOW); }
// 按键中断处理函数 void keyInterrupt() { if (P3 & 0x08) { // 判断是否按下 K2 按键 currentMelody = (currentMelody == 1) ? 2 : 1; // 切换乐曲 delay(100); // 延时消抖 } }
void main() { setup(); while (1) { loop(); }
原文地址: https://www.cveoy.top/t/topic/owLv 著作权归作者所有。请勿转载和采集!