首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

51 單片機 C 語言實作電子音樂盒:LCD 顯示曲目、按鍵切換功能

     編輯:程式設計綜合問答

專案需求

  • 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 點歌。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved