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

51 單片機軟件延時函數精度分析:指令周期影響與硬件定時器替代方案

     編輯:程式設計綜合問答

代碼分析

void delay_n_ms(uchar num) {
    uchar time;
    while (num) {
        time = 250; // fosc=11.0592MHz
        while (time) time--;
        num--;
    }
}

精度問題

  • 指令周期不固定:while(time) time--; 編譯為多條汇編指令 (載入、減一、跳轉),每條指令耗時不同 (1-2 機器周期)。
  • 編譯器優化:不同優化等級 (-O1/-O2) 生成代碼差異大,延時誤差不可控。
  • 中斷干擾:中斷服務程序插入會拉長實際延時。

結論

**軟件延時無法獲得精確的 1ms**,僅適合粗略延時 (如 LED 閃爍)。

標準替代:硬件定時器

// 定時器 0 模式 1 (16位) 定時 1ms @ 11.0592MHz
TMOD = 0x01;
TH0 = 0xFC; // (65536 - 1000) / 256
TL0 = 0x66; // (65536 - 1000) % 256
ET0 = 1; EA = 1; TR0 = 1;

// 中斷服務
void timer0() interrupt 1 {
    TH0 = 0xFC; TL0 = 0x66; // 重裝
    ms_counter++; // 全局毫秒計數
}

優勢

  • 精度由晶振決定,誤差 < 0.01%。
  • 不佔用 CPU,主循環可執行其他任務。
  • 易於實現多任務定時、PWM 等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved