




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章單片機的定時/計數器單片機原理、接口及應用本章重點★7.1定時計數器基本知識★7.2定時計數器結構和工作原理★7.3定時計數器的控制寄存器★7.4定時器的四種工作方式
★7.5定時計數器的應用編程7.1定時計數器基本知識8051單片機中有兩個計數器T0和T1,這兩個計數器分別是由兩個8位的RAM單元組成的,即每個計數器都是16位的計數器,最大的計數量是65536。8031中的計數器除了能作為計數之用外,還能用作時鐘,時鐘的用途當然很大,如打鈴器,電視機定時關機,空調定時開關等等。定時器和計數器的原理是一樣的,都是進行計數操作,每次加1,加滿溢出后,再從0開始計數,定時器和計數器不同之處是輸入的計數信號來源不同。計數器是記錄的外界發生的事情,而定時器則是由單片機供給一個非常穩定的計數源。
這個計數源就是由單片機的晶體震蕩器經過12分頻后獲得的一個脈沖源。晶體震蕩器的頻率當然很準,所以這個計數脈沖的時間間隔也很準。實現定時功能,比較方便的方法是利用單片機的定時器計數器,也可以采用下面的三種方法:軟件定時:軟件定時不占用硬件資源,但占用了cpu的時間,降低了cpu的利用率。采用時基電路定時:例如采用555電路,外界必要的元器件(電阻和電容),即可構成硬件定時電路。但在硬件連接好以后,定時值與定時范圍不能由軟件進行修改與控制,即不可編程。采用可編程芯片定時:這種定時芯片的定時值及定時范圍很容易用軟件來確定和修改,此種芯片定時功能強,使用靈活,在單片機的定時計數器不夠用時,可以考慮進行擴展。7.28051定時/計數器結構和工作原理★
51系列單片機片內有二個十六位定時/計數器:定時器0(T0)和定時器1(T1)。★兩個定時器都有定時或事件計數的功能,可用于定時控制、延時、對外部事件計數和檢測等場合★定時/計數器實際上是16位加1計數器。
T0由2個8位持殊功能寄存器TH0和TL0構成,
T1由2個8位持殊功能寄存器TH1和TL1構成。★每個定時器都可由軟件設置為定時工作方式或
計數工作方式。★T0和T1受特殊功能寄存器TMOD和TCON控制。
加1計數器輸入的計數脈沖有兩個來源,一個是由系統的時鐘振蕩器輸出脈沖經12分頻后送來;一個是T0或T1引腳輸入的外部脈沖源。每來一個脈沖計數器加1,當加到計數器為全1時,再輸入一個脈沖就使計數器回零,且計數器的溢出使TCON中TF0或TF1置1,向CPU發出中斷請求(定時/計數器中斷允許時)。如果定時/計數器工作于定時模式,則表示定時時間已到;如果工作于計數模式,則表示計數值已滿。可見,由溢出時計數器的值減去計數初值才是加1計數器的計數值。1.定時工作方式
★設置為定時器模式時:加1計數器是對內部機器周期計數(1個機器周期等于12個振蕩周期,即計數頻率為晶振頻率的1/12)。
★每經過一個機器周期定時器(T0或T1)的數值加1直至計數滿產生溢出。★計數值N乘以機器周期Tcy就是定時時間t
。
計數值:N=滿計數值-初始設定值t=計數值N×機器周期T如:當8051采用12MHz晶體時,每個機器周期為1μs,計5個機器周期即為5μs,即定時5μs。2.計數工作方式
★設置為計數工作方式時,通過引腳T0(P3.4)和T1(P3.5)對外部脈沖信號計數。★當輸入脈沖信號產生由1至0的下降沿時,定時器的值加1,在每個機器周期CPU采樣T0和T1的輸入電平。若前一個機器周期采樣值為高,下一個機器周期采樣值為低,則計數器加1。★由于檢測一個1至0的跳變需要二個機器周期,故最高計數頻率為振蕩頻率的二十四分之一。★雖然對輸入信號的占空比無特殊要求,但為了確保某個電平在變化之前至少被采樣一次,要求電平保持時間至少是一個完整的機器周期。由T0或T1引腳輸入計數脈沖。在每個機器周期的S5P2期間,CPU采樣引腳輸入電平。當前一機器周期采樣到高電平,下一周期機器采樣到低電平時,則計數器加1,更新的計數值在下一個機器周期的S3P1期間裝入計數器。由于檢測一個從1到0的下降沿需要2個機器周期,因此要求被采樣的電平至少要維持一個機器周期,最高計數頻率不超過振蕩頻率的1/24,當晶振頻率為12MHz時,計數頻率為1/2MHz,計數脈沖的周期要大于2s。
7.3定時計數器的控制寄存器★定時器共有兩個控制寄存器:定時器控制TCON(88H)
定時器工作模式寄存器TMOD(89H)1.工作模式寄存器TMOD(89H)
TMOD用于控制T0和T1的操作模式。其各位的定義如下:TMODD7D6D5D4D3D2D1D0(89H)GATEC/TM1M0GATEC/TM1M0定時器T0
定時器T1★
GATE:門控選擇位
=0,非門控方式,定時/計數器由內部軟件啟動:
TRx=1,啟動定時器工作;
TRx=0,停止定時器工作。
=1,門控方式,定時/計數器由內、外部啟動:
TRx=1,同時必須引腳INTx=1,才啟動。門控位GATE為1時,TRx=1,INTx=1才能啟動定時器。利用這個特性可以測量外部輸入脈沖的寬度。★
C/T:定時器/計數器選擇位
C/T=1,計數方式,通過引腳T0(P3.4)和T1(P3.5)對外部信號進行計數。
C/T=0,定時方式,對機器周期計數。
★M1、M0——工作模式選擇位。
由于有M1和M0兩位,可以有四種工作方式。T0有4種工作模式,T1有3種工作模式。定時器/計數器T1不能工作在模式3。設置T1的M1M0=11,T1將停止工作。定時器/計數器的工作模式M1M0工作模式功能介紹00模式013位定時器/計數器01模式116位定時器/計數器10模式28位自動重置定時器/計數器11模式3定時器0:TL0可8位定時器/計數器,TH0為8位定時器。定時器1:不工作。TMOD各位定義及具體的意義
TF1TR1TF0TR0IE1IT1IE0IT0T1請求有/無
T1工作啟/停T0請求有/無T0工作啟/停INT1請求有/無INT1方式下沿/低電平
INT0請求有/無INT0方式下沿/低電平2.控制寄存器TCON(88H)
TCON寄存器中定時器控制僅用了其中高四位,其意義如下:
★TF1:T1溢出中斷請求標志。
TF1=1,T1有溢出中斷請求。
TF1=0,T1無溢出中斷請求。
★TR1:T1運行控制位。
TR1=1,啟動T1工作。
TR1=0,停止T1工作。在程序中用指令“SETBTR1”使TR1位置1,定時器T1便開始計數。“CLRTR1”使TR1清0.GATE=0時,用軟件使TR1置1,則啟動定時器1,
用軟件使TR1清0,則停止定時器1。GATE=1時,用軟件TR1置1,如果檢測到引腳INT1(P3.3)輸入高電平時啟動定時器1。
★TF0:T0溢出中斷請求標志。
TF0=1,T0有溢出中斷請求。
TF0=0,T0無溢出中斷請求。
★TR0:T0運行控制位。
TR0=1,啟動T0工作。
TR0=0,停止T0工作。同TR1定時計數器的內部邏輯電路結構
&>1C/TC/T7.4定時器的四種工作方式
對TMOD寄存器的M1、M0位的設置,可選擇四種工作方式,即方式0、方式1、方式2和方式3。下面用THX、TLX(X=1或0)表示TH1TL1TH0TL0。
模式0以及定時器T0、T1模式0下的結構模式1以及定時器T0、T1模式1下的結構模式2以及定時器T0、T1模式2下的結構模式3以及定時器T0、T1模式3下的結構
13位定時/計數器,由TLx的低5位(高3位未用)和THx的8位組成。TLx的低5位溢出時向THx進位,THx溢出時,置位TCON中的TFx標志,向CPU發出中斷請求。1)方式0(M1M0=00)計數外部脈沖個數:1~8192(213)定時時間:T~8192Tfosc=12MHz,T=1us時,最大定時時間:8.19ms初始化定時/計數器時,初值N計算:定時機器周期數:N=t/T-------定時時間/機器周期計數初值:X=213-N
------計數最大值與計數值之差GATE=0時,經反相后使或門輸出為1,此時僅由TRx控制與門的開啟,與門輸出1時,控制開關接通,計數開始;GATE=1時,由INT0引腳信號控制或門的輸出,此時控制與門的開啟由INT0引腳信號和TRx共同控制。
TRx=1時,INT0引腳信號高電平啟動計數,低電平停止計數。常用來測量外中斷引腳上正脈沖的寬度。
2)方式1(16位定時/計數器,M1M0=01
)計數外部脈沖個數范圍:1~65536(216)定時時間范圍:T~65536T初始化定時/計數器時,初值N計算:定時機器周期數:N=t/T-------定時時間/機器周期計數初值:X=216-N
------計數最大值與計數值之差3)方式2(自動再裝入8位定時/計數器,M1M0=00)TLx為8位加1計數器,THx為8位初值暫存器。TLx計數溢出時,一方面將TFx置位,另一方面,將THx的內容重新裝入TLx,但不影響THx中的內容,用于需要重復定時和計數的場合,可實現每隔預定時間發出控制信號。計數外部脈沖個數范圍:1~256(28)定時時間范圍:T~256T初值N計算:定時機器周期數:N=t/T計數初值:X=28-N4)方式3(M1M0=00)T0分成兩個8位定時/計數器TL0和TH0;
TL0:既可計數也可定時,是一個8位定時/計數器。占用了T0
所有控制位:C/T,TR0,GATE,TF0和INT0、T0引腳;
TH0:只能作為定時器,因為T0已被TL0占用,TH0用T1的控制位:TR1、TF1;T0在方式3時T1的工作模式
如果定時/計數器T0工作在方式3,T1只能工作在0、1、2方式。此時由于T1的運行控制位TR1及計數溢出標志位TF1已被定時/計數器T0借用,這時,T1作為串行口的波特率發生器使用。
當作為波特率發生器使用時,只需要設置好工作方式,便可自動運行。如要停止工作,只需送入一個把T1設置為方式3的方式控制字。因為定時/計數器T1不能在方式3下工作,如果硬把它設置為方式3,則停止工作。T0在方式3時T1的工作模式(c)T1方式2定時器/計數器的功能和工作模式的選擇是由工作模式控制寄存器TMOD和定時器控制寄存器TCON來控制的。●
工作模式控制寄存器TMOD示意圖●定時器控制寄存器TCON示意圖●
4種工作模式的特點1.最大定時時間不同(采用12MHz的晶體)模式0(13位)時:TMAX=8192s=8.192ms。模式1(16位)時:TMAX=65536s=65.536ms。模式2和3(兩個8位)時:TMAX=256s=0.256ms。2.加載方式不同模式0和模式1的最大特點是計數溢出后,計數器全為0,因此,循環定時或計數時就要反復設置計數初值;模式2可以自動加載計數初值;模式3適合用于串行口數據傳輸率發生器。小結任意定時以及計數的方法:
我們采用預置數的辦法,我要計100,那我就先放進65436,再來100個脈沖,就到了65536了。定時也是如此,每個脈沖是1微秒,則計滿65536個脈沖需時65.536毫秒,但現在我只要10毫秒就能了,怎么辦?10個毫秒為10000個微秒,所以,只要在計數器里面放進55536就可以了。以定時器T0在方式1下定時0.95ms為例,先將65536μs-950μs=64586μs換成十六進制數FC4AH,然后將此數的高位FC裝入TH0;再將此數的低位4A裝入TL0。再進行計數就可以了。還有一種簡便計算方法,即將設計時初始值直接代入表中所提供的公式里,如使用定時器T0在模式0下定時1000s,設計初始值為1000,將1000分兩次代入公式即可。定時計數器的初始化
在使用定時器/計數器前,應首先對其進行初始化編程。一、定時器的初始化步驟1、設置TMOD。選擇工作模式和工作方式。2、設置定時器的計數初值。將初值寫入TH0和TL0或TH1、TL1。3、如果需要中斷,設置中斷允許寄存器IE。4、設置TCON,啟動定時器。可以使用位操作指令。例如:SETBTRx。使用定時器工作之前,先寫入方式、控制寄存器,確定好定時器工作方式:MOVTMOD,#方式字;啟動方式選擇(內外共同啟動/內啟動) 功能選擇—(計數/定時)位數選擇—
(8/13/16位)MOVTHx,#XH
;計算時間常數X,MOVTLx,#XL;Tx時間常數初值裝入數據寄存器
,(SETBEA ) ;開Tx中斷(SETBETx)SETBTRx
;啟動控制Tx定時器(啟動/停止)定時器初始化編程:在主程序中進行
二、定時器/計數器初值計算
定時器/計數器的模式和方式不同,計數初值也將不同。計數器的長度為n,則計數的最大值為2n
。
1、工作于定時方式計數脈沖由內部的時鐘提供,每個機器周期進行加1。設晶振頻率為fosc,則計數脈沖的頻率為fosc/12,計數脈沖周期T=1/(fosc/12)。如果進行定時時間為t,計數初值為X,則:初值X=2n
-t×fosc/122、工作于計數方式當工作在計數方式時,對外部脈沖計數。利用計數器計數結束產生溢出的特性,來計算初值X。則有:X=2n—計數次數上節練習與回顧1、下面哪一種僅適用于定時器T0()A.方式0B.方式1C.方式2D.方式32、若51單片機的晶振頻率是24MHz,則其內部定時器/計數器利用計數器對外部輸入脈沖的最高計數頻率是()A.1MHzB.6MHzC.12MHzD.24MHz3、8031定時/計數器是否計滿可采用等待中斷的方法進行處理,也可通過對()的查詢方法進行判斷。
A.OV標志B.CY標志C.中斷標志D.奇偶標志4、在下列寄存器中,與定時/計數控制無關的是()A、TCON(定時控制寄存器)B、TMOD(工作方式控制寄存器)C、SCON(串行控制寄存器)D、IE(中斷允許控制寄存器)答:有四種工作模式:模式0,模式1,模式2,模式3
(1)
模式0:選擇定時器的高8位和低5位組成一個13位定時器/計數器。TL低5位溢出時向TH進位,TH溢出時向中斷標志位TF進位,并申請中斷。
定時時間t=(213-初值)×振蕩周期×12;計數長度位213=8192個外部脈沖
(2)
模式1:與模式0的唯一差別是寄存器TH和TL以全部16位參與操作。定時時間t=(216-初值)×振蕩周期×12;計數長度位216=65536個外部脈沖
(3)
模式2:把TL0和TL1配置成一個自動重裝載的8位定時器/計數器。TL用作8位計數器,TH用以保存初值。TL計數溢出時不僅使TF0置1,而且還自動將TH中的內容重新裝載到TL中。
定時時間t=(28-初值)×振蕩周期×12;計數長度位28=256個外部脈沖
(4)
模式3:對T0和T1不大相同
若設T0位模式3,TL0和TH0被分為兩個相互獨立的8位計數器。TL0為8位計數器,功能與模式0和模式1相同,可定時可計數。
TH0僅用作簡單的內部定時功能,它占用了定時器T1的控制位TR1和中斷標志位TF1,啟動和關閉僅受TR1控制。
定時器T1無工作模式3,但T0在工作模式3時T1仍可設置為0~2。
5、89C51定時器有哪幾種工作模式?有何區別?6、根據定時器/計數器0方式1邏輯結構圖,分析門控位GATE取不同值時,啟動定時器的工作過程。
答:當GATE=0:軟件啟動定時器,即用指令使TCON中的TR0置1即可啟動定時器0。GATE=1:軟件和硬件共同啟動定時器,即用指令使TCON中的TR0置1時,只有外部中斷INT0引腳輸入高電平時才能啟動定時器0。7、單片機8031的時鐘頻率為6MHz,若要求定時值分別為0.1ms,1ms,10ms,定時器0工作在模式0、模式1和模式2時,其定時器初值各應是多少?
解:
(1)
0.1ms
模式0:
T0低5位01110B=0EH
T0高8位:11111110B=FEH
模式1:模式2:
(2)
1ms
模式0:
T0低5位01100B=0CH
T0高8位:11110000B=F0H
模式1:
模式2:
在此情況下最長定時為512μs,無法一次實現定時1ms,可用0.1ms循環10次
(3)
10ms
模式0:
T0低5位11000B=18H
T0高8位:01100011B=63H
模式1:
模式2:在此情況下最長定時為512μs,無法一次實現定時10ms,可用0.1ms循環100次8、3、設MCS-51單片機fosc=12MHz,要求T0定時150μs,分別計算采用定時方式0、方式1和方式2時的定時初值。答:方式0的定時初值:IF6AH方式1的定時初值:FF6AH方式2的定時初值:6AH9、
設MCS-51單片機fosc=6MHz,問單片機處于不同的工作方式時,最大定時范圍是多少?
答:方式0的最大定時范圍:131,072μs方式1的最大定時范圍:16,384μs方式2的最大定時范圍:512μs例1
設單片機的振蕩頻率為12MHz,用定時器/計數器0的模式1編程,在P1.0引腳產生一個周期為1000μs的方波,定時器T0采用中斷的處理方式。定時器的分析過程。工作方式選擇需要產生周期信號時,選擇定時方式。定時時間到了對輸出端進行周期性的輸出即可。
工作模式選擇
根據定時時間長短選擇工作模式。
首選模式2,可以省略重裝初值操作。定時器的應用舉例
定時時間計算:周期為1000μs的方波要求定時器的定時時間為500μs,每次溢出時,將P1.0引腳的輸出取反,就可以在P1.0上產生所需要的方波。定時初值計算:振蕩頻率為12MHz,則機器周期為1μs。
設定時初值為X,(65536-X)×1μs=500μs
X=65036=0FE0CH定時器的初值為:TH0=0FEH,TL0=0CH
C語言程序:#include<reg52.h> //包含特殊功能寄存器庫sbit P1_0=P1^0; //進行位定義voidmain() { TMOD=0x01; //T0做定時器,工作在模式1 TL0=0x0c; TH0=0xfe; //設置定時器的初值
ET0=1; //允許T0中斷
EA=1; //開中斷
TR0=1; //啟動定時器
while(1); //等待中斷}
voidtime0_int(void)interrupt1{ //中斷服務程序
TL0=0x0c; TH0=0xfe; //定時器重賦初值
P1_0=~P1_0; //P1.0取反,輸出方波}
匯編語言程序:
ORG 0000H SJMP MAIN ORG 000BH LJMP TIME0MAIN:MOV TMOD,#01H ;T0定時,模式1 MOV TL0,#0CH ;置定時初值
MOV TH0,#0FEH SETB ET0 ;定時器T0開中斷
SETB EA ;CPU開中斷
SETB TR0 ;啟動定時器T0 SJMP $ ;等待定時器溢出TIME0:MOV TL0,#0CH ;中斷服務程序
MOV TH0,#0FEH ;重裝定時初值
CPL P1.0 ;P1.0取反,輸出方波
RETI ;中斷返回
END例2
設單片機的振蕩頻率為12MHz,用定時器/計數器0編程實現從P1.0輸出周期為500μs的方波。分析:定時時間:從P1.0輸出周期為500μs的方波。定時250μs,定時結束對P1.0取反。
模式選擇:當系統時鐘頻率為12MHz,機器周期為1μs,定時器/計數器0可以選擇模式0、模式1和模式2。模式2最大的定時時間為256μs,滿足250μs的定時要求,選擇模式2(1)定時初值計算
(256-X)×1μs=250μs X=6; 則TH0=TL0=6采用中斷處理方式的程序:
C語言程序:#include <reg52.h>//包含特殊功能寄存器庫
sbit P1_0=P1^0;void main(){ TMOD=0x02; //選擇定時器的工作模式
TL0=0x06; TH0=0x06; //為定時器賦初值
ET0=1; //允許定時0中斷
EA=1; TR0=1; //啟動定時器0 while(1); //等待中斷} voidtime0_int(void)interrupt1 { P1_0=~P1_0;} 匯編語言程序:
ORG 0000H LJMP MAIN ORG 000BH ;中斷處理程序 CPL P1.0 RETI
ORG 0030H ;主程序
MAIN: MOV TMOD,#02H MOV TL0,#06H MOV TH0,#06H
SETB ET0 ;允許定時器0中斷
SETB EA ;允許CPU中斷 SETB TR0 ;啟動定時器0 SJMP $ ;等待中斷
END
采用查詢方式處理的程序: C語言程序:#include<reg52.h> //特殊功能寄存器庫sbit P1_0=P1^0;voidmain(){ TMOD=0x02; TL0=0x06; TH0=0x06;TR0=1;
while(1) { while(!TF0); //查詢計數溢出
TF0=0; P1_0=~P1_0; }}
匯編語言程序:MAIN: MOV TMOD,#02H ;主程序
MOV TL0,#06H MOV TH0,#06H SETB TR0LOOP: JNB TF0,$ ;查詢計數溢出
CLR TF0 CPL P1.0
SJMP LOOP END
門控位的應用
門控位GATE為1時,TRx=1,INTx=1才能啟動定時器。利用這個特性可以測量外部輸入脈沖的寬度。例3利用T0門控位測試INT0引腳上出現的正脈沖寬度,已知晶振頻率為12MHz,將所測得值最高位存入片內71H單元,低位存入70H單元。解:設外部脈沖由(P3.2)輸入,T0工作于定時方式1(16位計數),GATE設為1。測試時,應在INT0低電平時,設置TR0為1(16位計數);當INT0變為高電平時,就啟動計數;再次變低時,停止計數。此計數值與機器周期的乘積即為被測正脈沖的寬度。因fosc=12MHZ,機器周期為1us,測試過程如下。源程序如下:
MOVTMOD,#09H;設T0為方式1MOVTL0,#00H;設計初值取最大值
MOVTH0,#00HMOVR0,#70HJBP3.2,$;等P3.2(INT0)變低
SETBTR0;啟動T0準備工作
JNBP3.2,$;等待P3.2(INT0)JBP3.2,$;等待P3.2(INT0)CLRTR0;停止計數T0從0開始計數INT0
09H(TMOD)1TR0
0TR0T0停止計數
MOV@R0,TL0;存放結果
INCR0MOV@R0,TH0SJMP$
讀者不難編出C語言程序。這種方案被測脈沖的寬度最大為65535個機器周期
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論