|
我開始看單片機的書籍比較早,只有C語言基礎而沒有數電基礎(不知道要學),所以我在很多地方概念都是模模糊糊的。尤其是什么控制位什么寄存器什么邏輯電路都不懂,只純粹的想寫C語言操作單片機就行了。現在有了一定的基礎,發現了很多以前知其然不知其所以然的東西,所以在這里稍微的總結一下,同時我想可能對基礎不扎實的同學有一定的幫助(其實我基礎也不扎實~嘻嘻)。
對硬件(單片機)的操作,從本質上將就是對寄存器的操作。一個寄存器通常是1字節,即8位。每一位(bit)可以聯想成一個開關,打開這個開關就能做一件事,關閉這個開關就能停止做一件事。
8051系列的單片機中定時器由兩個寄存器控制,這兩個寄存器名稱分別是TMOD(Time Mode,工作方式寄存器)和TCON(Time Configuration,控制寄存器)。因為這些寄存器是操作單片機中定時器的,有特殊功能作用,所以屬于特殊功能寄存器而不是通用寄存器。另外想要記住這兩個寄存器的名稱也很簡單,用英文全稱來記憶。
下面先對兩個控制寄存器各個位進行總結:
2.1 工作方式寄存器(TMOD)TCOM | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||
位名稱 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 | ||
功能 | 門控位 | 定時/計數方式選擇 | 工作方式選擇 | 門控位 | 定時/計數方式選擇 | 工作方式選擇 | ||||
說明 | 高4位控制T1 | 低4位控制T0 |
51單片機有兩個定時器,其中TMOD的高四位控制定時器1,低四位控制定時器0。
2.1.1 門控位(GATE)我初學的時候沒有用到這個位,不過我還是簡單對它總結一下吧:
可以通過編程對這個位置1或清零。
當GATE = 0時,只要使TCON中的TR0或TR1置1,就可以啟動定時器了。
當GATE = 1時,除了使TCON中的TR0和TR1置1以外,還需要外部中斷INT0或INT1為高電平,才能啟動定時器。即比GATE = 0時多一個啟動條件。
2.1.2 定時/計數模式選擇位(C/T)其中C的英文全稱是Count,意思是計數器。T是Timer,定時器。置1為選擇計數器工作模式,置0為選擇定時器工作模式。(T上面應該畫一橫的,表示低電平有效)。
當C/T = 0時,為定時模式。此時定時器計數的時間是一個機器周期,一個機器周期的時間長度和晶振頻率有關。大家都知道周期T和頻率f是互為倒數的關系。而知道了晶振頻率fosc后,還要除以12(硬件內部結構12分頻的結果),它的倒數就是一個機器周期。即如果單片機采用12MHz的晶振,那么機器周期就是1微秒。
每經過一個機器周期,定時器的數值就會加1,直到計數器產生溢出,最后產生中斷執行自己寫的程序,這個程序就是你想讓單片機計數結束后做什么的程序。
當C/T = 1時,為計數模式,這里不詳細總結了。
另外上電復位后,這里的控制位默認是0,即定時模式。
2.1.3 工作方式選擇(M1和M2)M1M0 | 工作方式 | 說明 | ||||
00 | 方式0 | 13位定時器 | ||||
01 | 方式1 | 16位定時器 | ||||
10 | 方式2 | 8位自動重裝定時器 | ||||
11 | 方式3 | T0分成兩個獨立的8位定時器;T1停止使用 |
TMOD不能單獨對一個位置1或清零。只能一個字節的寫入TCOM設置定時器。
另外,CPU復位時TCOM所有的位都清零。
2.2 控制寄存器(TCON)TCON | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位名稱 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
功能 | T1中斷標志 | T1運行開關 | T0中斷標志位 | T0運行開關 | - | - | - | - |
這里主要關注TCON高四位,低四位是和外部中斷有關的控制位。
2.2.1 溢出中斷請求標志位(TFn)標題上的TFn中的n表示0或1,即溢出中斷請求標志位分別有TF0和TF1。TF的英文全稱是Timer overflow Flag,即定時器溢出標志位。
當定時器Tn(n=0、1)計數溢出后,相應的TFn由硬件自動置1,然后向CPU申請中斷,執行中斷程序。
CPU響應中斷后,硬件自動對TFn清零。
另外,TFn也可以在程序中置1或清零。
2.2.2 定時器運行控制位(TRn)TR的英文全稱是Timer Run,即定時器運行(控制位)。
當TRn = 1時,定時器n運行;
當TRn = 0是,定時器n停止。
知道了如何控制定時器之后,現在再來看一下定時器的結構。
定時器的實質是加一計數器(16位),由高8位和低8位兩個寄存器組成(THn和TLn)。
不同工作方式(M1M0控制),THn和TLn也有不同的功能。我最常用的是使用工作方式1——16位定時器。所以也只是稍微總結一下,因為足夠用了,能做很多事情了。
在這個工作方式下,THn和TLn合起來作為16位計數器。由TLn作為低8位,THn作為高8位(因為L是low,H為High)。當16位計數器溢出時,TFn置1。然后產生中斷,進入并執行中斷程序。
若使用12MHZ的晶振,定時器每加1則需要1微秒時間,如果把THn和THn都置為00H,當定時器溢出并產生中斷的時候,就已經過了65536微秒(2^13次方微秒)。