首先給大家講解 51 定時器的兩個特點:自增,三種運行模式(8位,13 位,16 位)。幾個控制的寄存器(也就是我們前面說的編號的問題:TMOD,TH0,TL0,TR0。知道這幾個是什么意思,你就能控制 51 定時器了),下面詳細講解自增和運行模式的問題。
自增:就是51定時器會從 0 到 1 到 2 。。。 就好像我們小時候數數一樣。
運行模式:就是我們小時候最多也就 0 - 9 數一數,你再厲害也就 0 - 100 數一數。而這就是模式的差異,也就是你的上限(max)能達到哪里,當定時器到達上限(max)之后,就會又從 0 開始,循環往復。比如我們選擇 8 位的模式(還記得二進制嗎?0b11111111 = 255)也就是說,他能從 0 數到 255。那16位呢?(0b1111111111111111 = 65535)。
好了,現在我們知道上面這些了,具體怎么設置呢?
TMOD的詳細對照說明(就是告訴單片機,我要使用 16 位的定時器。如果想用其他模式需要對比 51 的說明文檔進行設置)我們只需要關心定時器 0 的 M1 和 M0 的相關設置。他們有如下 4 種組合方式。如果我們選用方式 1,那么 TMOD = 0b0000 0001 = 0x01,這句話就是告訴單片機我們要使用定時器0的工作方式1(也就是 16 位定時器)。其他比如 GATE 和 C/T 暫時不用去糾結是干嘛的。
TH0 和 TL0 就是我們設置的初始時間。就是我們數數的第一個數。這里為什需要兩個呢?因為 TH0 和 TL0 都只能存放8位的數據。再多也放不下了,但是他們兩個人能組合成 16 位的。也就是說 TH0 拼接 TL0 就是 0b (11111111) (11111111)。其中前面是 TH0,后面是 TL0。我們前面說了,16位定時器最大可以設置成 65535。那如果我現在想把它設置成從 10000 開始計時,該怎么寫呢?首先,我們將 10000 換算二進制(10000 = 0b0010011100010000=0x2710 也就是說:TH0=0b00100111=0x27,TL0=0b00010000=0x10。這樣我們就告訴單片機要從 10000 開始數數了。每次這么寫是不是有點麻煩?我們也就簡化一下 TH0 = (10000 >> 8)這就話就是說,把10000的二進制格式向右移動 8 位。(詳細的移動說明如下圖,一個二進制數,右邊有一堵墻,只要整體往右移動,碰到墻的數字就會立刻消失。)
TR0 就是一個開關,當 TR0 = 1 的時候,定時器就工作了,TR0 = 0 的時候,定時器就停止了。這樣你就能使用定時器了。
知道了上面這些,你就能很明顯的知道如下寫法的正確含義了。以及為什么編程的時候需要這么寫程序了。