專案需求
- 51 單片機(如 STC89C52)驅動蜂鳴器播放音樂。
- LCD1602 顯示當前曲目名稱/序號。
- 獨立按鍵控制:上一曲、下一曲、播放/暫停。
核心模組設計
1. 音樂資料結構
typedef struct {
const char *name;
const uint16_t *notes; // 頻率/周期值陣列
const uint16_t *durations; // 持續時間陣列
uint16_t length;
} Song;
Song songs[] = {
{"Happy Birthday", notes1, durs1, 25},
{"Twinkle Star", notes2, durs2, 32},
// ...
};
2. 定時器產生方波
void Timer0_Init() {
TMOD |= 0x01; // 模式 1
TH0 = TL0 = 0;
ET0 = 1; EA = 1; TR0 = 1;
}
void Timer0_ISR() interrupt 1 {
// 翻轉蜂鳴器腳位,根據當前音符頻率重載 TH0/TL0
// 遞減持續時間計數器,歸零則切換下一音符
}
3. LCD 顯示與按鍵掃描
void DisplaySong(uint8_t idx) {
LcdWriteCmd(0x80); // 第一行
LcdWriteStr(songs[idx].name);
LcdWriteCmd(0xC0); // 第二行
LcdWriteStr("Playing...");
}
void KeyScan() {
if (KEY_PREV == 0) { delay(10); if (KEY_PREV==0) { idx=(idx+MAX-1)%MAX; DisplaySong(idx); while(!KEY_PREV); } }
if (KEY_NEXT == 0) { ... }
if (KEY_PLAY == 0) { ... }
}
4. 主迴圈
void main() {
Timer0_Init(); LcdInit(); KeyInit();
DisplaySong(0);
while(1) {
KeyScan();
// 可加入 LED 節奏閃爍等視覺效果
}
}
參考原始碼
51單片機電子音樂盒完整源碼 (PUDN)
擴充想法
- 加入 SD 卡模組讀取 MIDI 檔,突破 Flash 容量限制。
- 用 PWM 輸出改善音質(方波→類正弦波)。
- 藍牙模組實現手機 App 點歌。