章定時計數(shù)器_第1頁
章定時計數(shù)器_第2頁
章定時計數(shù)器_第3頁
章定時計數(shù)器_第4頁
章定時計數(shù)器_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第七章單片機的定時計數(shù)器===

本章的主要內(nèi)容★定時計數(shù)器結構和工作原理;★定時計數(shù)器的控制寄存器;★定時計數(shù)器的應用編程.

測量控制系統(tǒng)中,常常要求有一些實時時鐘,以實現(xiàn)定時控制、定時測量或延時動作,也往往要求有計數(shù)功能,對外部事件計數(shù),如測電機轉速、測頻率、測工件個數(shù)等。單片機內(nèi)部定時計數(shù)器是用得非常多的一個功能部件。通常實現(xiàn)定時/計數(shù)有3種主要方法:軟件定時:

即讓機器執(zhí)行一個程序段,只是為了磨時間。這種方法定時占用CPU執(zhí)行時間,降低了CPU利用率。數(shù)字電路硬件定時:采用小規(guī)模集成電路器件如555,外接定時部件構成。這樣的定時電路簡單,但要改變定時范圍,必須改變電阻和電容,這種定時電路在硬件連接好以后,修改不方便。可編程定時/計數(shù)器:

為方便51微機系統(tǒng)的設計和應用而研制的,它是硬件定時,通過初始化編程,能夠滿足各種不同的定時和計數(shù)要求,因而在嵌入式系統(tǒng)的設計和應用中得到廣泛的應用。

兩個定時器都有(軟件選擇)定時/事件計數(shù)的功能;

單片機片內(nèi)有定時器0(T0)和定時器1(T1)

二個十六位硬件(可編程)定時/計數(shù)器;T0由2個8位SFR:TH0和TL0構成;T1由2個8位SFR:TH1和TL1構成;★定時/計數(shù)器實際上是16位加1計數(shù)器;

T0,T1軟件可編程

:

工作方式0(13位方式);

工作方式1(16位方式);

工作方式2(8位自動再裝入方式);

工作方式3(T0為2個8位方式)。7·18XX51定時/計數(shù)器結構和工作原理1、定時器/計數(shù)器的計數(shù)器

定時/計數(shù)器實際上是16位加1計數(shù)器;T0計數(shù)器由2個8位-----TH0和TL0構成;T1計數(shù)器由2個8----TH1和TL1構成。7·2定時計數(shù)器的控制寄存器★★

計數(shù)器是定時器的核心,假定8位計數(shù)器,要求計10個外部事件,產(chǎn)生溢出(TF0=1),計數(shù)器預置的計數(shù)初值是多少?C(計數(shù)初值)=M-X=256-10=246定時器的計數(shù)初值C的計算和裝入問題TF1TR1TF0TR0IE1IT1IE0IT02.定時器控制寄存器TCON(88H)

(MSB)(LSB)中斷源要有請求;觸發(fā)方式選擇鎖存中斷請求標志TR1(TR0):T1運行控制位。TR1=1,啟動T1工作。

TR1=0,停止T1工作。3.工作模式寄存器TMOD(89H)

TMOD各位的定義如下:TMODD7D6D5D4D3D2D1D0

(89H)GATEC/TM1M0GATEC/TM1M0定時器T0

定時器T1★

C/T:定時器/計數(shù)器選擇位

C/T=1,為計數(shù)器方式;

C/T=0,為定時器方式。&>1C/TC/TGATE:門控信號

GATE=0,TRx=1時,即可啟動Tx

工作;(x=1或0)

GATE=1,TRx=1INTx=1才可啟動Tx

工作。

M1M0工作方式選擇

M1M0

方式說明00013位定時器(TH的8位和TL的低5位)01116位定時器/計數(shù)器102自動重裝入初值的8位計數(shù)器113

T0分成兩個獨立的8位計數(shù)器,T1在方式3時停止工作

設置為定時工作方式時,定時器計數(shù)的脈沖是由51機片內(nèi)振蕩器經(jīng)12分頻后產(chǎn)生的。

★每經(jīng)過一個機器周期T0或T1的數(shù)值加1直至計數(shù)滿產(chǎn)生溢出。如:當51采用12MHz晶體時,每個機器周期為1μs,采用6MHz晶體時,每個機器周期為2μs1.定時工作方式

★雖然對輸入信號的占空比無特殊要求,要求電平保持時間至少是一個完整的機器周期,由于檢測一個1至0的跳變需要二個機器周期,故最高計數(shù)頻率為振蕩頻率的二十四分之一。設單片機晶振頻率為12MHZ;故:外部脈沖信號最高計數(shù)頻率為<500KHZ

2.計數(shù)工作方式

★設置為計數(shù)工作方式時,定時/計數(shù)器對引腳

P3.4(T0)和P3.5(T1)輸入的外部脈沖信號計數(shù)。★當輸入脈沖信號產(chǎn)生由1至0的下降沿時,定時器的值加1。當晶振頻率為6MHZ,最高計數(shù)頻率為

?

無論是定時/計數(shù),當軟件設定了定時/計數(shù)器的工作方式,啟動以后,定時/計數(shù)器就按規(guī)定的方式工作,不占用CPU的操作時間,此時CPU可執(zhí)行其他程序,到了計滿規(guī)定的時間或規(guī)定的個數(shù)(定時/計數(shù)器溢出),定時/計數(shù)器會給出溢出標志,你可以通過查詢或中斷方式了解是否溢出。7.3定時器的四種工作方式

下面用THx、TLx(x=1或0)表示TH1TL1TH0TL0。

1.方式

0★T0或T1工作于13位定時、計數(shù)方式。用于計數(shù)方式時最大計數(shù)值為

213=

8192個脈沖1.工作方式0(13位方式):M1M0=00方式0(13位計數(shù)器)

C=M-X=

-10=模-X定時器的計數(shù)初值C的計算和裝入問題要求計10個外部事件;計數(shù)初值C=M-X用于定時工作時,定時時間為t(已知):t=(一T初值

)×MC要求計X個外部事件;

C=8192-100=8092=1F9CH1F9CH=0001

1111

10011100B

把13位中的高八位11111100B裝入TH0,而把13位中的低五位xxx11100B裝入TLTH0=0xFC;TL0=0x1C;例要求計100個脈沖,產(chǎn)生溢出(TF0=1),計數(shù)器預置的計數(shù)初值是多少?方式0(13位方式):2、方式1M1M0=01方式1(16位計數(shù)器)

2.方式1

★該模式是一個16位定時/計數(shù)方式;計數(shù)方式時最大計數(shù):216=65536(個外部脈沖)

用于定時工作方式時,定時時間為:

t=(216一T初值)×MC

★16寄存器(THx和TLx)中THx提供高8位、TLx提供低8位計數(shù)初值C=65536-100

=FF9CH

用指令裝入計數(shù)初值:

TH0=0x0FFHTL0=0x9CH例:要求計100個脈沖,產(chǎn)生溢出(TF0=1),計數(shù)器預置的計數(shù)初值是多少?方式1:3、方式2方式2(初始常數(shù)自動重裝載)

M1M0=10方式2(8位自動再裝入方式)

C=256-100(10進制)=9CH(16進制)

初值既要裝入TH0,也要裝入TL0:TH0=0x9CHTL0=0x9CH例要求計100個脈沖,產(chǎn)生溢出(TF0=1),計數(shù)器預置的計數(shù)初值是多少?方式2(8位方式):

3.方式2M1M0=10方式2是8位的可自動重裝載的定時計數(shù)方式?!?6位的計數(shù)器被拆成兩個8位,其中TL0用作8位計數(shù)器,TH0用以保持計數(shù)初值。當TL0計數(shù)溢出,置TF0,TH0中的初值自動裝入TL0,繼續(xù)計數(shù),循環(huán)重復計數(shù)。★用于計數(shù)工作方式時,最大計數(shù)值為:

28=256(個外部脈沖)。

用于定時工作方式時,其定時時間為;

t=(28—TH0初值)×時鐘周期×12★這種工作方式可省去用戶重裝常數(shù)的程序,并可產(chǎn)生精確的定時時間,特別適用作串行口波待率發(fā)生器。

4、方式3方式3(兩個8位獨立計數(shù)器)

4.方式3

當TMOD中M1M0=11時,定時器工作在方式3。★若將T0設置為模式3,TL0和TH0被分成為兩個互相獨立的8位計數(shù)器TH0和

TL0

?!?/p>

TL0可工作為定時方式或計數(shù)方式。占用原T0的各控制位、引腳和中斷源。即C/T、GATE、TR0、TF0和T0(P3.4)引腳、INT0(P3.2)引腳。

TH0只可用作定時功能,占用定時器T1的控制位TR1和T1的中斷標志位TF1,其啟動和關閉僅受TRl的控制。★定時器T1無模式3,可工作于方式0、1、2,但不能使用中斷方式?!?/p>

只有將T1用做串行口的波特率發(fā)生器時,T0才工作在方式3,以便增加一個定時器。定時器/計數(shù)器的結構及工作原理7.4定時計數(shù)器的應用程序設計

7.4.1定時器的計數(shù)初值C的計算和裝入如前所述,89c51定時器/計數(shù)器不同工作方式的模值不同,由于采用加1計數(shù),因此計數(shù)初值應為負值,計算機中用有符號數(shù)采用補碼表示。計數(shù)初值(C)的求法如下?!?/p>

計數(shù)方式:

計數(shù)初值C=模-X(其中X為要計的脈沖個數(shù))★定時方式:

計時時間=(模-初值)*MC

其中t為欲定時時間,MC為89c51的機器周MC=12/fosc

當采用12MHZ晶振時,MC=1μs;

當采用6MHZ晶振時,MC=2μs。7.4.2定時計數(shù)器的初始化編程

定時計數(shù)器的初始化編程步驟:1)根據(jù)定時時間要求或計數(shù)要求計算計數(shù)器初值;2)工作方式控制字送TMOD寄存器;3)送計數(shù)初值的高八位和低八位到THX和TLX寄存器中;4)啟動定時(或計數(shù)),即將TRX置位。如果工作于中斷方式,需要置位EA(中斷總開關)及ETX(允許定時/計數(shù)器中斷)。并編中斷服務程序。例7-1如圖7-2所示;P1中接有八個發(fā)光二極管,編程使八個管輪流點亮,每個管亮100ms,設晶振為6MHz。7.4.3應用編程舉例同向分析:

利用T1完成100ms的定時,當P1口線輸出“0”時,發(fā)光二極管亮,每隔100ms”1”左移一次,采用定時方式1,先計算計數(shù)初值:

MC==2μs(6MHz)100ms/2μs=50000=C350H計數(shù)初值=65536-50000H=15536=3CB0H

For(;;){TH1=0x3c;TL1=0xb0;/*裝載計數(shù)初值*/do{}while(!TF1);/*查詢等待TF1置位*/P1<<=1;P1=P1∣0x01

/*定時時間到,下一只LED亮*/

TF1=0;

/*軟件清TF1*/}}①查詢方式:#include<reg51.h>voidmain(void){P1=0xfe;/*第一只LED亮*/TMOD=0x10;/*定時器1方式1*/TR1=1;/*啟動T*/voidmain(void){TMOD=0x10;/*T1工作在定時方式1*/P1=0xfe;/*第一只LED亮*/TH1=0x3c;TL1=0xb0;/*預置計數(shù)初值*/EA=1;ET1=1;/*CPU開中斷,允許T1中*/TR1=1;/*啟動T1開始定時*/do{}while(1);}/*等待中斷*/②中斷方式:#include<reg51.h>

Timer1()interrupt3using1/*T1中斷服務程序*/{P1<<=1;P1=P1∣0x01;/*下一只LED亮*/TH1=0x3c;TL1=0xb0;/*計數(shù)初值重載*/}例7-2在P1.7端接一個發(fā)光二極管LED,要求利用定時控制使LED亮一秒滅一秒周而復始,設fosc=6MHZ。解:16位定時最大為*2us=131.072ms,顯然不能滿足要求,可用以下兩種方法解決。方法1:采用T0產(chǎn)生周期為200ms脈沖,即P1.0每100ms取反一次作為T1的計數(shù)脈沖,T1對下降沿計數(shù),因此T1計5個脈沖正好一秒。T0采用方式1,定時100ms;X=-得X=3CB0H.T1采用方式2,計數(shù)初值X=-5=FBH均采用查詢方式,流程圖和程序如下:

下面用C語言完成本例的方式1,并介紹用C語言程序計算計數(shù)初值的方法。

T0定時100ms初值=100×1000/2=50000,即初值為

-50000。T1計數(shù)5個脈沖工作于方式2,計數(shù)初值為-5,T0和T1均采用中斷方式。程序如下:#include<reg51.h>

sbitP1_0=P1^0;

sbitP1_7=P1^7;timer0()interrupt1using1/*T0中斷服務程序*/{P1_0=!P1_0;/*100ms到P1.0反向*/TH0=-50000/256;/*重載計數(shù)初值高8位*/TL0=-50000%256;/*重載計數(shù)初值低8位*/

}timer1()interrupt3using2/*T1中斷服務*/{P1_7=!P1_7;}

/*1s到,燈變狀態(tài)*/main(){P1_7=0;/*置燈初始滅*/P1_0=1;

/*保證第一次反向便開始計數(shù)

TMOD=0x61;/*T0方式1定時,T1方式2計數(shù)*/

TH0=-50000/256;/*預置T0計數(shù)初值*/

TL0=-50000%256;TH1=-5;TL1=-5;/*預置T1計數(shù)初值*/

IP=0x08;/*置優(yōu)先級寄存器*/EA=1;ET0=1;ET1=1/*開中斷*/TR0=1;TR1=1;/*啟動定時計數(shù)器*/for(;;){}/*等待中斷*/}

7.4.4門控位的應用

門控位GATE為1時,TRx=1,INTx=1才能啟動定時器。利用這個特性可以測量外部輸入脈沖的寬度。例7-4

利用T0門控位測試INT0引腳上出現(xiàn)的正脈沖寬度,已知晶振頻率為12MHz,將所測得值最高位存入片內(nèi)71H單元,低位存入70H單元。解:設外部脈沖由(P3.2)輸入,T0工作于定時方式1(16位計數(shù)),GATE設為1。測試時,應在INT0處于低電平時,設置TR0為1;當INT0變?yōu)楦唠娖綍r,就啟動計數(shù);再次變低時,停止計數(shù)。此計數(shù)值與機器周期的乘積即為被測正脈沖的寬度。因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;停止計數(shù)T0從0開始計數(shù)INT0

09H(TMOD)1TR0

0TR0T0停止計數(shù)

MOV@R0,TL0;存放結果

INCR0MOV@R0,TH0SJMP$

讀者不難編出C語言程序。這種方案被測脈沖的寬度最大為65535個機器周期。由于靠軟件啟動和停止計數(shù),有一定的測量誤差。其可能的最大誤差與指令的執(zhí)行時間有關。此例中,在讀取定時器的計數(shù)之前,已把它停住。但在某些情況下,不希望在讀計數(shù)值時打斷定時的過程,由于我們不可能在同一時刻讀取THX和TLX

的內(nèi)容。讀取一個時恰好另一個產(chǎn)生溢出,在這種情況下,讀取的計數(shù)值有可能是錯的??梢越鉀Q錯讀的方法是:

先讀THX后讀TLX,若兩次讀得的THx

沒有發(fā)生變化,則可確定讀到的內(nèi)容是正確的。若前后兩次讀到的THx有變化,則再重復上述過程,重復讀到的內(nèi)容就應該是正確的了。下面是按此思路編寫的程序段,讀到的TH0和TL0放在R1和R0內(nèi):RP:MOVA,TH0;

MOVR0,TL0;

CJNEA,TH0,RP;

MOVR1,A…………7·6小結定時計數(shù)器應用非常廣泛,如定時采樣、時間測量、產(chǎn)生音響、作脈沖源、制作日歷時鐘、測量波形的頻率和占空比、檢測電機轉速、測量汽車速度等。因此應很好掌握。

51系列單片機既有兩個16位的定時計數(shù)器,有四種不同的工作方式,歸納于下表:28=256=100H28=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論