現象描述
使用 STC51 單片機驅動蜂鳴器播放音樂作為報警聲,發現播放期間溫度顯示極其緩慢,懷疑音樂播放佔用過多 CPU 資源。
根本原因
51 單片機無硬件線程支持,音樂播放通常通過 阻塞式延時(如 delay_ms())控制音符時長,導致主循環無法及時執行 DS18B20 溫度讀取與顯示邏輯。
優化策略
1. 狀態機 + 定時器中斷(推薦)
- 使用定時器(如 Timer0)產生固定頻率中斷(如 1kHz)。
- 在中斷服務程序中維護音樂播放狀態機:音符索引、持續時間計數、音頻翻轉。
- 主循環僅負責溫度采集、顯示、按鍵掃描等非實時任務。
2. 非阻塞延時(簡易版)
- 主循環使用
millis() 風格的時間戳判斷,避免 while(delay); 死等。
- 缺點:音頻精度受主循環執行時間波動影響,可能有雜音。
3. 降低音樂複雜度
- 簡化樂譜,減少音符數量與變調頻率。
- 優先使用單一頻率蜂鳴,僅在報警瞬間播放短促旋律。
參考資源
詳細實現可參考:單片機蜂鳴器播放音樂資源佔用優化討論