『壹』 51單片機的定時器初值到底是TH0 = (65536-x) /256;還是TH0 = (65535-x) /256;
51單片機的定時器初值確定時,我們通常使用65536減去定時脈沖個數來計算。這是因為16位計數器的最大可寫入數值為65535。假設定時周期為1微秒,且頻率為12MHz,即一個脈沖到來即溢出,此時應寫入65535,即65536-1。
因此,(65536-x)/256是正確的計算方法。考慮到定時時間不可能為零,(65536-x)/256的結果不會是256,小於256的數都可以裝入。同樣地,對於TL0來說,也不會是256,因為256的倍數除以256後余數為0。
實際上,不管是65535還是65536,對TH0寫入的結果是一樣的。但對於TL0(或整個計數器來說),理論上存在一個脈沖的差別。假設定時周期為1微秒,寫入65535時,定時器一打開,脈沖立即到來,可能不到1微秒。而寫入65534,則需兩個脈沖才會溢出,時間肯定大於1微秒。
這種方法用於實現這么小的定時,顯然是不準確的。還有中斷響應時間、主程序響應時間等都需要考慮。對於長時間定時,這個誤差是可以忽略的。要想減小誤差,可以提高晶振或系統時鍾的頻率。當定時脈沖個數較多時,就不必糾結這一個脈沖的誤差了,同時中斷響應時間和中斷程序處理的時間也減小了,大多數情況下是可以忽略的。