4.1 定時器
4.1.1 51時鐘周期介紹
時鐘周期:時鐘周期T是時序中最小的時間單位,具體計算的方法就是 1/時鐘源頻率,89C51單片機開發板上常用的晶振是11.0592M,對于這個單片機系統來說,時鐘周期=1/11059200 秒。
機器周期:是單片機完成一個操作的最短時間。
機器周期主要針對匯編語言而言,在匯編語言下程序的每一條語句執行所使用的時間都是機器周期的整數倍,而且語句占用的時間是可以計算出來的,而 C 語言一條語句的時間是不確定的,受到諸多因素的影響。
51單片機系列,在其標準架構下一個機器周期是 12 個時鐘周期,也就是 12/11059200 秒。
現在很多的增強型51單片機,其速度都比較塊,有的1個機器周期等于 4 個時鐘周期,有的1個機器周期就等于1個時鐘周期,也就是說大體上其速度可以達到標準 51 架構的 3 倍或 12倍。
定時器和計數器是單片機內部的同一個模塊,通過配置 SFR(特殊功能寄存器)可以實現兩種不同的功能大多數情況下是使用定時器功能。
顧名思義,定時器就是用來進行定時的,定時器內部有一個寄存器,讓它開始計數后,這個寄存器的值每經過一個機器周期就會自動加1,可以把機器周期理解為定時器的計數周期。就像鐘表,每經過一秒,數字自動加 1,而這個定時器就是每過一個機器周期的時間,也就是 12/11059200 秒,數字自動加 1。
4.1.2 定時器功能介紹
標準的51單片機內部有T0和T1兩個定時器,T 就是 Timer 的縮寫。
STC90C51RC/RD+系列單片機的定時器0和定時器1,與傳統8051的定時器完全兼容,當在定時器1做波特率發生器時,定時器0可當兩個8位定時器使用。
STC90C51RC/RD+系列單片機內部設置的兩個16位定時器/計數器T0和T1都具有計數方式和定時方式兩種工作方式。 對每個定時器/計數器(T0和T1),在特殊功能寄存器TMOD中都有一個控制位— C/T來選擇T0或T1為定時器還是計數器。
定時器/計數器的核心部件是一個加法(也有減法)的計數器,其本質是對脈沖進行計數。只是計數脈沖來源不同:如果計數脈沖來自系統時鐘,則為定時方式,此時定時器/計數器每12個時鐘或每6個時鐘得到一個計數脈沖,計數值加1;如果計數脈沖來自單片機外部引腳(T0為P3.4,T1為P3.5),則為計數方式,每來一個脈沖加1。
定時器/計數器0有4種工作模式:
模式0(13位定時器/計數器)
模式1(16位定時器/計數器)
模式2(8位自動重裝模式)
模式3(兩個8位定時器/計數器)
定時器/計數器1除模式3外,其他工作模式與定時器/計數器0相同,T1在模式3時無效,停止計數。
圖4-1-1 定時器的寄存器
定時器的相關寄存器介紹,在STC單片機官方手冊的137頁有詳細講解。
手冊下載地址: http://www.stcmcu.com
上面圖片里就是使用定時器時需要配置的寄存器,其中TL0、TL1、TH0、TH1寄存器用于存放定時器的重裝載值,分為高低位兩個寄存器。
4.1.3 TCON寄存器
TCON寄存器用于控制定時器,比如: 定時器啟動位、定時器溢出標志位等等。
圖4-1-2 TCON寄存器
TCON寄存器支持位尋址,在 TF1和TF0:是定時器1和定時器0的溢出標志位,當定時器計數溢出時(就是定時器超時),該標志位置1。 TR1和TR0:是定時器1和定時器0的控制位。當賦值為1時,就啟動定時器,開始計數。 其他的位是外部中斷相關的控制,目前學習定時器時沒有用到,先暫時不管。 4.1.4 TMOD寄存器 TMOD寄存器用于配置定時器的模式。 圖4-1-3 TMOD寄存器 圖4-1-4 寄存器模式選擇 4.1.5 定時器重裝值計算方法 51單片機標準架構下一個機器周期是12個時鐘周期,如果晶振頻率是11.059200MHZ,那一個機器周期的時間就是12/11.059200 微秒。 也就是說定時器的計數器+1的時間就12/11.059200=1.085069us。 如果定時器工作在16位模式下,最大值可以存放: 0~65535范圍的值,那么最大的定時時間就可以得知: 65535*1.085069=71109.996915us=71.109996915ms ,大約是71毫秒的時間。 如果需要定時1000us,那么公式就是:x*1.085069=1000,得出x的值就是: 1000/1.085069=921 。 計算出定時器需要+921次剛好得到1000us,但是單片機工作在16位模式情況下,需要加滿65535定時器才會溢出,所以需要給定時器賦初值。 65535-921=64614,這樣定時器就可以從64614開始計數,當計數到65535時,定時器就會溢出,TF0就會置1,這時剛好經過1000us時間。 那么定時器的重裝值寄存器就可以這樣賦值: u16 t0_data=64614; TH0=t0_data>>8; //高位 TL0=t0_data; //低位 4.1.6 配置定時器0工作在16位定時器模式 下面代碼里配置51單片機的定時器0工作在16位定時器模式。程序封裝了計算重裝值的函數,方便調用,程序沒有使用中斷,采用輪詢方式檢測定時器是否超時,在主函數里使用了一個計數變量,記錄定時器超時的次數,方便記錄更長的時間。 程序里的功能是,時間到達1秒鐘,就是改變一次LED燈的狀態。 示例代碼: (硬件平臺說明:CPU是STC90C516RD 、晶振頻率12MHZ 、工作在12T模式下、一個機器周期為1us時間) #include 4.1.7 配置定時器1工作在16位定時器模式 下面代碼里配置51單片機的定時器1工作在16位定時器模式。程序封裝了計算重裝值的函數,方便調用,程序沒有使用中斷,采用輪詢方式檢測定時器是否超時,在主函數里使用了一個計數變量,記錄定時器超時的次數,方便記錄更長的時間。 程序里的功能是,時間到達1秒鐘,就是改變一次LED燈的狀態。 示例代碼: (硬件平臺說明:CPU是STC90C516RD 、晶振頻率12MHZ 、工作在12T模式下、一個機器周期為1us時間) #include 4.1.8 配置定時器0工作在8位自動重裝載模式 下面代碼里配置51單片機的定時器0工作在8位定時器自動重裝載模式,在自動重裝載模式下,每次定時器超時之后,就省去了手動賦重裝值的過程,比較方便,但是定時器的每次最大定時時間變短了,計數器到達255就會溢出。 程序里封裝了計算重裝值的函數,方便調用,程序沒有使用中斷,采用輪詢方式檢測定時器是否超時,在主函數里使用了一個計數變量,記錄定時器超時的次數,方便記錄更長的時間。 程序里的功能是,時間到達500毫秒,就是改變一次LED燈的狀態。 示例代碼: (硬件平臺說明:CPU是STC90C516RD 、晶振頻率12MHZ 、工作在12T模式下、一個機器周期為1us時間) #include
上一篇:51單片機程序執行流程(STARTUP.A51)
下一篇:最后一頁
推薦閱讀
史海拾趣
設計資源 培訓 開發板 精華推薦
- 半導體品牌知名度問卷調查
- 上演你的“ADI實驗室電路”DIY!
- 下載有禮|是德科技電子書 《通過了解測試精度的基礎知識, 提高良率并降低風險》,不做“差不多先生”
- 下載《Altera SoC深度體驗》,打分評論贏好禮
- 【已結束】 Qorvo、村田、NI直播【UWB最新技術、方案、市場、應用解析】(13:30開始入場)
- TI 最新CapTIvate™ 觸控微控制器技術直播開始報名嘍!報名參與有禮呦!
- 老T叔的藏書閣——一位老工程師多年的資料積累
- 有獎直播【Keysight World Tech Day 2023分論壇——汽車自動駕駛與新能源】
- #最能打國產芯#能打入汽車電子這片地的國產芯,有多少啦?
- 新年新挑戰:ST藍牙開發板免費申請評測+挑戰賽(littleshrimp帶隊)