單片機定時器的作用及使用方法詳解
單片機定時器在單片機的功能是很重要的,它一般被用作定時功能,來做定時檢測、定時響應和定時控制,并且可以產生毫秒寬的脈沖信號來驅動步進電機。計時和計數的最終功能是通過計數實現的。如果計數事件源是周期性固定脈沖,則可以實現定時功能,否則只能實現計數功能。因此,定時和計數功能可以由單個組件實現。計時器的結構和工作原理可以通過下面的圖表簡單地分析。
單片機的作用:
首先要為大家解釋的一個問題是,單片機定時器其實跟我們平時常說的計數器,是同一個電子元件,只不過計數器記錄的是51單片機外部情況,所接受的也是外部脈沖,而定時器則是由單片機自身提供的一個非常穩定的計數器,這個穩定的計數器就是單片機上連接的晶振部件。單片機的晶振經過12分頻之后提供給單片機的只有1MHZ的穩定脈沖,晶振的頻率是非常準確的,所以單片機的計數脈沖之間的時間間隔也是非常準確的,這個準確的時間間隔是1微秒。
下面我們來看一下,一個單片機定時器的簡單結構圖,如下圖所示:
單片機定時器的簡單結構圖
而無論是單片機定時器,還是計數器,他們在單片機的工作運行過程中都有定時或事件計數功能,因此常常會被應用于時間控制、程序延時、對外部時間計數和檢測等工作范圍內。而一旦了解了計數器/定時器的應用領域和使用情況,工程師就可以充分利用單片機定時器來完成一些對時間限制要求精準的程序的設定,例如信號檢測或電氣自動化設計,都是比較常用到51單片機計數器進行程序設計的領域。
單片機的使用:
單片機定時器的使用可以說非常簡單,只要掌握原理,有一點的C語言基礎就行了。要點有以下幾個:
1. 一定要知道英文縮寫的原形,這樣寄存器的名字就不用記了。
理解是最好的記憶方法。好的教材一定會給出所有英文縮寫的原形。
2. 盡量用形像的方法記憶。
比如TCON和TMOD兩個寄存器各位上的功能,教程一般有個圖表,你就在學習中不斷回憶那個圖表的形像。
3. TMOD:定時器/計數器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
定時器/計數器模式控制寄存器TMOD是一個逐位定義的8位寄存器,但只能使用字節尋址,其字節地址為89H。其格式為:其中低四位定義定時器/計數器C/T0,高四位定義定時器/計數器C/T1,各位的說明:
(1)GATE——門控制。
GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。
當INT0引腳為高電平時TR0置位,啟動定時器T0;
當INT1引腳為高電平時TR1置位,啟動定時器T1。
GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。
(2)C/T——功能選擇位
C/T=0時為定時功能,C/T=1時為計數功能。
置位時選擇計數功能,清零時選擇定時功能。
(3)M0、M1——方式選擇功能
由于有2位,因此有4種工作方式:
M1M0 工作方式 計數器模式 TMOD(設置定時器模式)
0 0 方式0 13位計數器 TMOD=0x00
0 1 方式1 16位計數器 TMOD=0x01
1 0 方式2 自動重裝8位計數器 TMOD=0x02
1 1 方式3 T0分為2個8位獨立計數器,T1為無中斷重裝8位計數器 TMOD=0x03
單片機定時器0設置為工作方式1為TMOD=0x01
這里我們一定要知道,TMOD的T是TIMER/COUNTER的意思,MOD是MODE的意思。至于每位上的功能,你只要記住圖表,并知道每個英文縮寫的原型就可以了。
在程序中用到TMOD時,先立即回憶圖表,并根據縮寫的單詞原形理出每位的意義,如果意義不是很清楚,就查下手冊,幾次下來,TMOD的圖表就已經在腦子里了。
8位 GATE位,本身是門的意思。
7位 C/T Counter/Timer
6位 M1 Mode 1
5位 M0 Mode 0
4. TCON: 定時器/計數器控制寄存器(TIMER/COUNTER CONTROL REGISTER)
TMOD分成2段,TCON控制更加精細,分成四段,在本文中只要用到高四段。
TF0(TF1)——計數溢出標志位,當計數器計數溢出時,該位置1。
(1)TR0(TR1)——定時器運行控制位
當TR0(TR1)=0 停止定時器/計數器工作
當TR0(TR1)=1 啟動定時器/計數器工作
(2)IE0(IE1)——外中斷請求標志位
當CPU采樣到P3.2(P3.3)出現有效中斷請求時,此位由硬件置1。在中斷響應完成后轉向中斷服務時,再由硬件自動清0。
(3)IT0(IT1)——外中斷請求信號方式控制位
當IT0(IT1)=1 脈沖方式(后沿負跳有效)
當IT0(IT1)=0 電平方式(低電平有效)此位由軟件置1或清0。
(4)TF0(TF1)——計數溢出標志位
當計數器產生計數溢出時,此位由硬件置1。當轉向中斷服務時,再有硬件自動清0。計數溢出的標志位的使用有兩種情況:采用中斷方式時,作中斷請求標志位來使用;采用查詢方式時,作查詢狀態位來使用。注意記憶方法,理解單詞原形,就絕對不會把TF和TR搞混。TF的F也就是溢出Over Flow的F。TR的R就是運行Run。默認是0不運行,當然要置1才運行。
5. STC單片機STC89C52RC定時器延時時間的計算
延時時間要根據晶振頻率計算,不同板子可能有所不同。
時鐘周期:
1/時鐘源,在我現在這塊板子上,晶振頻率是11.0592M,也就是時鐘周期是 1/11059200秒
機器周期:
一般51單片機是12個時鐘周期,我的板子也就是 12/11059200秒
單次定時最長時間:
如果是16位的計數器,16位最大值是65535,共可計數65536次。基本的常數一定要記住,還要記住8位最大值是255,共可計數256次,還要記住8位上每位代表的數值。
12 * 65536/11059200 = 0.0711 s,也就是,71 ms內的定時可以單次定時就完成。如果定時時間超過71 ms,就要循環了。
一次定時需要幾次機器周期:
計算公式:定時秒數/機器周期
比如我要定時1秒, 1/(12/11059200)= 921600次,16位計數器最大可計數65536次,921600次早就益出了。我們可以每次定時10 ms,循環100次就可以定時1秒了,1 s縮小100百倍就是10 ms, 也就是每次需要計數9216次。
確實計數器初始值:
定時10 ms時,如果計數器從0開始計數,我們就不知道什么時候到了9216次。所以應該計數了9216次,16位計數器最多計數95536次,然后就溢出,一溢出TCON的TF位就會置1,我們只要經常檢測TF位就可以知道什么時候完成10ms的定時了。
計算公式:計數器初始值=最大計數次數 - 需要計數次數
如果定時10 ms,計數器的初始值就是 65536 - 9216
計算計數器的高位和低位:
16位的計數器,也就是兩個8位組成,8位的最大計數次數是256。所以:
計數器高位 = 初始值/256
計數器低位 = 初始值%6