51单片机——定时器/计数器
目錄
1.概述
2.定時器/計數器
2.1 定時功能
2.2.1 定時功能的用法
2.1.2 任意定時方法
2.2 計數功能
2.2.1 計數功能的用法
2.2.2 任意計數方法
2.3?定時器/計數器的結構原理
2.3.1 定時器/計數器的結構
2.3.2 定時器/計數器的工作原理
2.4 定時器/計數器的控制寄存器與四種工作方式
2.4.1 定時器/計數器的控制寄存器TCON
2.4.2 定時器/計數器工作方式控制寄存器TMOD
2.4.3?定時器/計數器的工作方式
1.概述
????????8051單片機內部有T0和T1兩個定時器/計數器。它們既可用作定時器,也可用作計數器,可以通過編程來設置其使用方法。
2.定時器/計數器
2.1 定時功能
2.2.1 定時功能的用法
????????當定時器/計數器用作定時器時,可以用來計算時間。如果要求單片機在一定的時間后產生某種控制,可將定時器/計數器設為定時器。單片機定時器/計數器的定時功能用法如圖1所示。
圖1 定時器/計數器的定時功能用法??
????????要將定時器/計數器 T0設為定時器,實際上就是將定時器/計數器與外部輸入斷開,而與內部信號接通,對內部信號計數來定時。單片機的時鐘振蕩器可產生12MHz的時鐘脈沖信號,經12分頻后得到1MHz的脈沖信號,1MHz信號每個脈沖的持續時間為1μs,如果定時器T0對1MHz的信號進行計數,若從0計到65536,將需要65536μs,也即65.536ms。65.536ms后定時器計數達到最大值,會溢出而輸出一個中斷請求信號去中斷系統,中斷系統接受中斷請求后,執行中斷子程序,子程序的運行結果將P1.0端口置“0”,該端口外接的發光二極管點亮。
2.1.2 任意定時方法
????????在圖1中,定時器只有在65.536ms 后計數達到最大值時才會溢出,如果需要不到65.536ms定時器就產生溢出,比如1ms后產生溢出,可以對定時器預先進行置數。將定時器初始值設為64536,這樣定時器就會從64536開始計數,當計到65536時,定時器定時時間就為1ms而產生一個溢出信號。
2.2 計數功能
2.2.1 計數功能的用法
????????當定時器/計數器用作計數器時,可以用來計數。如果要求單片機計數達到一定值時產生某種控制,可將定時器/計數器設為計數器。單片機定時器/計數器的計數功能用法如圖2所示。
?圖2?定時器/計數器的計數功能用法
????????用編程的方法將定時器/計數器T0設為一個16位計數器,它的最大計數值為216=65536。T0端(即P3.4引腳)用來輸入脈沖信號。當脈沖信號輸入時,計數器對脈沖進行計數,當計到最大值65536時,計數器溢出,會輸出一個中斷請求信號到中斷系統,中斷系統接受中斷請求后,執行中斷子程序,子程序的運行結果將P1.0端口置“0”,該端口外接的發光二極管點亮。
2.2.2 任意計數方法
????????在圖2中,只有在T0端輸入65536個脈沖時,計數器計數達到最大值才會溢出,如果希望輸入100個脈沖時計數器就能溢出,可以在計數前對計數器預先進行置數,將計數器初始值設為65436,這樣計數器就會從65436開始計數,當輸入100個脈沖時,計數器的計數值就達到65536而產生一個溢出信號。
2.3?定時器/計數器的結構原理
2.3.1 定時器/計數器的結構
????????8051單片機內部定時器/計數器的結構如圖3所示。單片機內部與定時器/計數器有關的部件主要有以下幾種:
????????① 兩個定時器/計數器(T0和 T1)。每個定時器/計數器都是由兩個8位計數器構成的16位計數器。
????????② TCON寄存器。TCON為控制寄存器,用來控制兩個定時器/計數器的啟動/停止。
????????③ TMOD寄存器。TMOD為工作方式控制寄存器,用來設置定時器/計數器的工作方式。兩個定時器/計數器在內部還通過總線與CPU連接,CPU可以通過總線對它們進行控制。
?圖3?定時器/計數器的結構
2.3.2 定時器/計數器的工作原理
????????由于定時器/計數器是在寄存器TCON和TMOD的控制下工作的,要讓定時器/計數器工作,必須先設置寄存器 TCON 和 TMOD(可編寫程序來設置)。單片機內部有2個定時器/計數器,它們的工作原理是一樣的,這里以定時器/計數器T0為例進行說明。
1.定時器/計數器T0用作計數器
????????要將定時器/計數器T0當作計數器使用,須設置寄存器TCON和TMOD,讓它們對定時器/計數器T0進行相應的控制,然后定時器/計數器T0才開始以計數器的形式工作。
????????(1)寄存器TCON和TMOD的設置將T0用作計數器時TCON、TMOD寄存器的設置內容主要有:
????????① 將寄存器TMOD的C/T位置“1”,如圖8-3所示,該位發出控制信號讓開關S0置“1”,定時器/計數器T0與外部輸入端T0(P3.4)接通。
????????② 設置寄存器TMOD的M0、M1位,讓它控制定時器/計數器T0的工作方式,比如讓M0=1、M1=0,可以將定時器/計數器T0設為16位計數器。
????????③ 將寄存器TCON的TR0位置“1”,啟動定時器/計數器T0開始工作。
????????(2)定時器/計數器T0的工作過程定時器/計數器T0用作計數器的工作過程有以下幾步:
????????① 計數。定時器/計數器T0啟動后,開始對外部T0端(P3.4)輸入的脈沖進行計數。
????????② 計數溢出,發出中斷請求信號。當定時器/計數器T0計數達到最大值65536時,會溢出產生一個信號,該信號將寄存器TCON的TF0位置“1”,寄存器TCON立刻向CPU發出中斷請求信號,CPU便執行中斷子程序。
2.定時器/計數器T0用作定時器
????????要將定時器/計數器T0當作定時器使用,同樣也要設置寄存器TCON和TMOD,然后定時器/計數器T0才開始以定時器形式工作。
????????(1)寄存器TCON和TMOD的設置將T0用作定時器時TCON、TMOD寄存器的設置內容主要有:
????????① 將寄存器TMOD的C/T位置“0”,如圖8-3所示,該位發出控制信號讓開關S0置“2”,定時器/計數器T0與內部振蕩器接通。
????????② 設置寄存器 TMOD 的 M0、M1位,讓它控制定時器/計數器 T0的工作方式,如讓M0=0、M1=0,可以將定時器/計數器T0設為13位計數器。
????????③ 將寄存器TCON的TR0位置“1”,啟動定時器/計數器T0開始工作。
????????(2)定時器/計數器T0的工作過程定時器/計數器T0用作定時器的工作過程有以下幾步:
????????① 計數。定時器/計數器T0啟動后,開始對內部振蕩器產生的信號(要經12分頻)輸入的脈沖進行計數。
????????② 計數溢出,發出中斷請求信號。定時器/計數器T0對內部脈沖進行計數,由0計到最大值8192(213)時需要8.192ms的時間,8.192ms后定時器/計數器T0會溢出而產生一個信號,該信號將TCON寄存器的TF0位置“1”,TCON寄存器馬上向CPU發出中斷請求信號,CPU便執行中斷子程序。
2.4 定時器/計數器的控制寄存器與四種工作方式
????????定時器/計數器是在TCON寄存器和TMOD寄存器的控制下工作的,設置這兩個寄存器相應位的值,可以對定時器/計數器進行各種控制。
2.4.1 定時器/計數器的控制寄存器TCON
????????TCON寄存器的功能主要是接收外部中斷源(INT0、INT1)和定時器/計數器(T0、T1)送來的中斷請求信號,并對定時器/計數器進行啟動/停止控制。TCON的字節地址是88H,它有8位,每位均可直接訪問(即可位尋址)。TCON的字節地址、各位的位地址和名稱功能如圖4所示。
圖4?TCON寄存器的字節地址、各位的位地址和名稱功能
????????TCON寄存器的各位功能在前面已介紹過,這里僅對與定時器/計數器有關的位進行說明。
????????① TF0位和TF1位:分別為定時器/計數器0和定時器/計數器1的中斷請求標志位。當定時器/計數器工作產生溢出時,會將TF0或TF1位置“1”,表示定時器/計數器T0或T1有中斷請求。
????????② TR0和TR1:分別為定時器/計數器0和定時器/計數器1的啟動/停止位。在編寫程序時,若將TR0或TR1設為“1”,那么T0或T1定時器/計數器開始工作;若設置為“0”,T0或T1定時器/計數器則會停止工作。?
2.4.2 定時器/計數器工作方式控制寄存器TMOD
????????TMOD寄存器的功能是控制定時器/計數器T0、T1的功能和工作方式。TMOD寄存器的字節地址是89H,不能進行位操作。在上電(給單片機通電)復位時,TMOD寄存器的初始值為00H。TMOD的字節地址和各位名稱功能如圖5所示。
?圖5 TMOD的字節地址和各位名稱功能
????????在TMOD寄存器中,高4位用來控制定時器/計數器T1,低4位用來控制定時器/計數器T0,兩者對定時器/計數器的控制功能一樣,下面以TMOD寄存器高4位為例進行說明。
????????① GATE位:門控位,用來控制定時器/計數器的啟動模式。當GATE=0時,只要TCON寄存器的TR1位置“1”,就可啟動T1開始工作;當GATE=1時,除了需要將 TCON 寄存器的 TR1 位置“1”外,還要使引腳為高電平,才能啟動T1工作。
????????② 位:定時、計數功能設置位。當時,將定時器/計數器設置為定時器工作模式;當時,將定時器/計數器設置為計數器工作方式。
????????③ M1、M0位:定時器/計數器工作方式設置位。M1、M0位取不同值,可以將定時器/計數器設置為不同的工作方式。TMOD寄存器高4位中的M1、M0用來控制T1的工作方式,低4位中的M1、M0用來控制T0的工作方式。M1、M0位不同取值與定時器/計數器工作方式的關系見表1。
表1 TMOD寄存器的M1、M0位值與定時器/計數器工作方式
2.4.3?定時器/計數器的工作方式
????????在TMOD寄存器的M1、M0位的控制下,定時器/計數器可以工作在4種不同的方式下,不同的工作方式適用于不同的場合。
1.方式0
????????當M1=0、M0=0時,定時器/計數器工作在方式0,它被設成13位計數器。在方式0時,定時器/計數器由TH、TL兩個8位計數器組成,使用TH的8位和TL的低5位。
????????(1)定時器/計數器工作在方式0時的電路結構與工作原理
????????定時器/計數器T0、T1工作在方式0時的電路結構與工作原理相同。以T0為例,將TMOD寄存器的低4位中的M1、M0位均設為“0”,T0工作在方式0。定時器/計數器T0工作在方式0時的電路結構如圖6所示。
圖6 定時器/計數器T0工作在方式0時的電路結構?
????????當T0工作在方式0時,T0是一個13位計數器(TH0的8位+TL0的低5位)。位通過控制開關S1來選擇計數器的計數脈沖來源。當時,計數脈沖來自單片機內部振蕩器(經12分頻);當時,計數脈沖來自單片機T0引腳(P3.4引腳)。GATE位控制T0的啟動方式。GATE位與引腳、TR0位一起經邏輯電路后形成CON電平,再由CON電平來控制開關S2的通斷。當CON=1時,S2閉合,T0工作;當CON=0時,S2斷開,T0停止工作(S2斷開后無信號送給T0)。
????????當GATE=0時,CON的值與TR0的值一致,TR0可直接控制T0的啟動/停止。
????????當GATE=1時,CON 的值由 TR0、兩個值決定,其中TR0的值由編程來控制(軟件控制),而的值由外部引腳的電平控制,只有當它們的值都為“1”時,CON的值才為“1”,定時器/計數器T0才能啟動。?
????????(2)定時器/計數器初值的計算若定時器/計數器工作在方式0,當其與外部輸入端(T0引腳)連接時,可以用作13位計數器;當與內部振蕩器連接時,可以用作定時器。
????????① 計數初值的計算。
????????當定時器/計數器用作13位計數器時,它的最大計數值為8192(),當T0引腳輸入8192個脈沖時,計數器就會產生溢出而發出中斷請求信號。如果希望不需要輸入8192個脈沖,計數器就能產生溢出,可以給計數器預先設置數值,這個預先設置的數值稱為計數初值。
???????在方式0時,定時器/計數器的計數初值可用下式計算:
????????計數初值=?計數值
????????比如希望輸入1000個脈沖計數器就能產生溢出,計數器的計數初值應設置為7192 (8192?1000)。
????????② 定時初值的計算。
????????當定時器/計數器用作定時器時,它對內部振蕩器產生的脈沖(經12分頻)進行計數,該脈沖的頻率為fosc/12,脈沖周期為12/fosc,定時器的最大定時時間為·12/fosc,若振蕩器的頻率fosc為12MHz,定時器的最大定時時間為8192μs。如果不希望定時這么長,定時器就能產生溢出,可以給定時器預先設置數值,這個預先設置的數值稱為定時初值。
????????在方式0時,定時器/計數器的定時初值可用下式計算:
????????定時初值=?定時值=?t·fosc/12
????????比如單片機時鐘振蕩器的頻率為12MHz(即12×106Hz),現要求定時1000μs(即1000 ×10?6s)就能產生溢出,定時器的定時初值應為
定時初值=?t·fosc/12=8192?1000×10?6×12×106/12=7192
2.方式1
????????當M1=0、M0=1時,定時器/計數器工作在方式1,它為16位計數器。除了計數位數不同外,定時器/計數器在方式1的電路結構與工作原理與方式0完全相同。定時器/計數器工作在方式1時的電路結構(以定時器/計數器T0為例)如圖7所示。
????????定時器/計數器工作在方式1時的計數初值和定時初值的計算公式分別如下:
計數初值=?計數值
定時初值=?定時值=?t·fosc/12
?圖7 定時器/計數器在方式1時的電路結構
3.方式2
????????定時器/計數器工作方式0和方式1時適合進行一次計數或定時,若要進行多次計數或定時,可讓定時器/計數器工作在方式2。當M1=1、M0=0時,定時器/計數器工作在方式2,它為8位自動重裝計數器。定時器/計數器工作在方式2時的電路結構(以定時器/計數器T0為例)如圖8所示。
圖8?定時器/計數器T0在方式2時的電路結構
????????工作在方式2時,16位定時器/計數器T0分成TH0、TL0兩個8位計數器,其中TL0用來對脈沖計數,TH0用來存放計數器初值。在計數時,當TL0計數溢出時會將TCON寄存器的TF0位置“1”,同時也控制TH0重裝開始,將TH0中的初值重新裝入TL0中,然后TL0又開始在初值的基礎上對輸入脈沖進行計數。
????????定時器/計數器工作在方式2時的計數初值和定時初值的計算分別如下:
計數初值=?計數值
定時初值=?定時值=?t·fosc/12?
4.方式3
????????定時器/計數器T0有方式3,而T1沒有(T1只有方式0~2)。當TMOD寄存器低4位中的M1=1、M0=1時,T0工作在方式3。
????????在方式3時,T0用作計數器或定時器。
????????(1)T0工作在方式3時的電路結構與工作原理
????????在方式3時,定時器/計數器T0用作計數器或定時器,在該方式下T0的電路結構如圖9所示。
圖9 T0工作在方式3時的電路結構
????????在方式3時,T0被分成TL0、TH0兩個獨立的8位計數器,其中TL0受T0的全部控制位控制(即原本控制整個T0的各個控制位,在該方式下全部用來控制T0的TL0計數器),而TH0受T1的部分控制位(TCON的TR1位和TF1位)控制。
????????在方式3時,TL0既可用作8位計數器(對外部信號計數),也可用作8位定時器(對內部信號計數);TH0只能用作8位定時器,它的啟動受TR1的控制(TCON的TR1位原本用來控制定時器/計數器T1)。當TR1=1時,TH0開始工作,當TR1=0時,TH0停止工作,當TH0計數產生溢出時會向TF1置位。
????????(2)T0工作在方式3時T1的電路結構與工作原理
????????當T0工作在方式3時,它占用了T1的一些控制位,此時T1還可以工作在方式0~2(可通過設置TMOD寄存器高4位中的M1、M0的值來設置),T1在這種情況下一般用作波特率發生器。當T0工作在方式3時,T1工作在方式1和方式2的電路結構分別如圖10(a)、(b)所示。
?圖10 T0在方式3時T1工作在方式1和方式2的電路結構
????????圖10(a)是T0在方式3時T1工作在方式1(或方式0)時的電路結構。在該方式下,T1是一個16位計數器,由于TR1控制位已被借用來控制T0的高8位計數器TH0,所以T1在該方式下無法停止,一直處于工作狀態,另外由于TF1位也借給了TH0,所以T1溢出后也不能對TF1進行置位產生中斷請求信號,T1溢出的信號只能輸出到串行通信口,此方式下的T1為波特率發生器。
????????圖10(b)是T0在方式3時T1工作在方式2時的電路結構。在該方式下,T1是一個8位自動重裝計數器,除了具有自動重裝載功能外,其他與方式1相同。?
總結
以上是生活随笔為你收集整理的51单片机——定时器/计数器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: csv追加写入的时候报错Permissi
- 下一篇: SecondaryNameNode工作原