-
上面的答案很好。
-
使用定時器方法1時,(65536-x)的計算值超過256,即定時器的16位定時模式,因此需要向th0傳送高8位,向tl0傳送低位,因此要計算(65536-x)的高8位和低8位,(65536-x)256就是計算高8位, 而 (65536-x)%256 是計算低 8 位,所以寫成。
th0 = (65536-x) 256(或 th1)。
tl0 = (65536-x)%256(或 tl1)。
-
這其實很簡單,你只需要知道乙個條件:晶振頻率。
因為51微控制器的機器週期計算公式是12晶振頻率MHz,如果晶體振盪器是12MHz,那麼機器週期是12(12 10 6)=1us,也就是說計數器一次不算1us。
一般來說,在12MHz晶體振盪器下,16位定時器的滿數為65536次,每次1us,最大可以定時,則65536減去多少定時,如(65536-x)256,即定時x微秒。
所以如果晶體振盪器不是12MHz,將上面的x乘以12個晶體振盪器,得到的值就是時序持續時間。 原理是一樣的。
如果您不明白什麼,請隨時回覆我。
-
沒錯。 雖然定時器定時比程式延遲更準確,但這並不意味著沒有錯誤。 無論如何,錯誤總是客觀的。 以下是另外兩點:
1.原始程式有錯誤。 定時器模式0的最大計數值為2 13=8192us,初始安裝值為e018h=57368us,即定時的初始載入值遠大於最大計數值。
如果要在模式 0 下計時 1ms=1000us,初始安裝值應為 8192-1000=7192=1c18h,其他語句的執行可以忽略不計,因為它是 2 3us 級別(因子中斷程式中的三個語句只需要 6us)。 你可能會問:為什麼不把這些時間轉換成計時器的初始值呢?
答案是沒有必要。 無論如何轉換,都有誤差,更不用說機器週期的時間也是估計的。
2.如果要更準確,可以使用方法2(自動重新載入初始值)。
-
你對你的理解是對的。
關於51定時器的重新載入,典型的解決方案是動態重新載入。 也就是說,當您續訂計數的初始值時,您應該從要載入的總數中減去該計數,該計數是從上乙個溢位準備好執行重新載入的初始值的時間開始的。
例如,如果中斷間隔為 1000 次計數,則重新載入的初始值為 -1000。 在中斷中,-1000不能直接重灌,而是-(1000-th tl),即過載值為-1000+th tl。
isr_t0:
push psw
clr tr0
xch a, tl0
add a, #low(-1000+7)
xch a, tl0
xch a, th0
位址 A,高(1000+7) tr0 已暫停 7 個週期,需要新增。
xch a, th0
set tr0
CPL 可以執行使用者想要執行的事件,但持續時間太長。
pop psw
當然,也不能完全說這本書是錯的,只能說書中的例子不嚴謹。