在學習定時器/計數器之前需要明白的
51單片機有兩組定時器/計數器,因為既可以定時,又可以計數,故稱之為定時器/計數器。
定時器/計數器和單片機的CPU是互相獨立的,定時器/計數器工作的過程是自動完成的,不需要CPU參與。
51單片機中的定時器/計數器是根據機器內部的時鍾或者是外部的脈沖信號對寄存器中的數據加1.
有了定時器/計數器之后,可以增加單片機的效率,一些簡單的重復加1的工作可以交給定時器/計數器處理。CPU轉而處理一些復雜的事情。同時可以實現精確定時作用。
定時器/計數器的工作原理
定時器/計數器實質上是一個加1計數器。它隨着計數器輸入脈沖進行自加1,也就是每來一個脈沖,計數器就自動加1,當加到計數器全1時,再輸入一個脈沖就使計數器回零,且計數器的溢出使相應的中斷標志位置1,向CPU發出中斷請求(定時/計數器中斷允許時)。如果定時器/計數器工作與定時模式,則表示定時時間已到;如果工作與計數模式,則表示計數值已滿。
可見,由溢出時計數器的值減去計數初值才是加1 計數器的計數值。
51單片機定時器結構
定時/計數器的實質時加1計數器(16位),由高8位和低8位兩個寄存器THx和TLx組成。
TMOD是定時/計數器的工作方式寄存器,確定工作方式和功能
TCON是控制寄存器,控制T0、T1的啟動和停止及設置溢出標志
控制寄存器TCON
TCON的低4位用於控制外部中斷,在中斷系統中介紹。TCON的高4位用於控制定時/計數器的啟動和中斷申請
TF1(TCON.7):T1溢出中斷請求標志位。T1計數溢出時由硬件自動置TF為1.CPU響應中斷后TF1由硬件自動清0.T1工作時,CPU可隨時查詢TF1的狀態。所以,TF1可用作查詢測試的標志。TF1也可以用軟件置1或清0,同硬件置1或清0的效果一樣
TR1(TCON.6):T1運行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟件置1或清0。所以,用軟件可控制定時/計數器的啟動與停止。
工作方式寄存器TMOD
工作方式寄存器TMOD用於設置定時/計數器的工作方式,低四位用於T0,高四位用於T1。
GATE是門控位,GATE=0時,用於控制定時器的啟動是否受外部中斷源信號的影響。只要用軟件使TCON中TR0或TR1為1,就可以啟動定時/計數器工作;GATE=1時,要用軟件使TR0或TR1為1,同時外部中斷引腳INT0/1也為高電平時,才能啟動定時/計數器工作。即此時定時器的啟動條件,加上INT0/1引腳為高電平這一條。
C/T:定時/計數模式選擇位。C/T=0為定時模式,;C/T=1為計數模式。
M1M0:工作方式設置位。定時/計數器有四種工作方式。
定時/計數器的工作方式
方式0
方式0為13為計數,由TL0的低5位(高3位未用)和TH0的8位組成。TL0的低5位溢出時間向TH0的低5位溢出時向TH0進位,TH0溢出時,置位TCON中的TF0標志,向CPU發出中斷請求。
定時器模式時由N=t/Tcy
計數初值計算的公式為:X=2^13-N
定時器的初值還可以采用計數個數取補法獲得
計數模式時,計數脈沖是T0引腳上的外部脈沖
門控位GATE具有特殊的作用。
當GATE=0時,經反相后使或門輸出為1,此時僅由TR0控制與門的開啟,與門輸出1時,控制開關接通,計數開始;
當GATE=1時,由外中斷引腳信號控制或門的輸出,此時控制與門的開啟由外中斷引腳信號和TR0共同控制。
當TR0=1時,外中斷引腳信號引腳的高電平啟動計數,外中斷引腳信號引腳的低電平停止計數。這種方式常用來測量外中斷引腳上正脈沖的寬度。
方式1
方式1的計數位數是16位,由TL0作為低8位,TH0作為高8位,組成了16位加1計數器
計數個數與計數初值的關系為:X=2^16-N
方式2
方式2為自動重裝初值的8位計數方式
計數個數與計數初值的關系為:X=2^8-N
工作方式2特別適合於用作較精准的脈沖信號發生器
方式3
方式3只適用於定時/計數器T0,定時器T1處於方式3時相當於TR1=0,停止計數
工作方式3將T0分成為兩個獨立的8位計數器TL0和TH0
初始化程序應完成如下工作:
對TMOD賦值,以確定T0和T1的工作方式
計算初值,並將其寫入TH0、TL0或TH1、TL1
中斷方式時,則對EA賦值,開放定時器中斷
使TR0或TR1置位,啟動定時/計數器定時或計數
計數器初值的計算
機器周期也就是CPU完成一個基本操作所需要的時間
機器周期=1/單片機的時鍾頻率
51單片機內部時鍾頻率是外部時鍾的12分頻,也就是說當外部晶振的頻率輸入到單片機里面的時候要進行12分頻,比如說你用的是12MHZ的晶振,那么單片機內部的時鍾頻率就是12/12MHZ,當你使用12MHZ的外部晶振的時候。機器周期12MHZ/12=1uS
而我們定時1mS的初值是多少呢
1mS/1uS=1000,也就是要計數1000個數,初值=65535-1000+1(因為實際上計數器計數到65536才溢出)=64536=FC18