單片機技術(shù)與項目訓(xùn)練 課件 第5章 定時計數(shù)器_第1頁
單片機技術(shù)與項目訓(xùn)練 課件 第5章 定時計數(shù)器_第2頁
單片機技術(shù)與項目訓(xùn)練 課件 第5章 定時計數(shù)器_第3頁
單片機技術(shù)與項目訓(xùn)練 課件 第5章 定時計數(shù)器_第4頁
單片機技術(shù)與項目訓(xùn)練 課件 第5章 定時計數(shù)器_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

定時/計數(shù)器第5章定時/計數(shù)器是單片機最重要的資源之一,應(yīng)用非常廣泛,凡是涉及計數(shù)、定時有關(guān)的操作,都可以用定時/計數(shù)器來解決,如定時控制、延時、頻率/周期的測量、信號產(chǎn)生、串行通信等。定時/計數(shù)器是單片機的學(xué)習(xí)重點,也是難點之一,使用起來比I/O口應(yīng)用復(fù)雜,只有熟悉其工作原理才能很好地掌握其用法。本章著重介紹定時/計數(shù)器的工作原理與不同工作方式的特點及其應(yīng)用方法。引言目錄定時/計數(shù)器概述1定時/計數(shù)器的基礎(chǔ)應(yīng)用案例2本章小結(jié)5定時/計數(shù)器的高級應(yīng)用3本章習(xí)題6行業(yè)PPT模板/hangye/項目訓(xùn)練數(shù)字電子鐘設(shè)計45.1定時/計數(shù)器概述行業(yè)PPT模板/hangye/定時器/計數(shù)器簡介8051單片機內(nèi)部有兩個16位的定時/計數(shù)器T0和T1,它們本質(zhì)上是計數(shù)器。在它們作為定時器使用時,計數(shù)脈沖來自內(nèi)部的機器周期(振蕩周期的12倍)。當(dāng)它們作為計數(shù)器使用時,用來計引腳上的脈沖信號(下降沿)數(shù)。T0和T1的外部引腳是P3口的第二功能,對應(yīng)的是P3.4和P3.5引腳.定時/計數(shù)器是中斷系統(tǒng)的一部分。5.1.1與定時/計數(shù)器有關(guān)的SFR1.定時/計數(shù)器的控制寄存器TCONTCON的大部分功能在第4章中已經(jīng)介紹過,此外,還有兩位與定時/計數(shù)器的運行有關(guān),即TR0、TR1,如表5-1所示,它們控制定時器的運行。(1)TR0(Timer0Run)——定時/計數(shù)器T0運行控制位。TR0=1,啟動T0運行(與TMOD中的GATE位有關(guān));TR0=0,T0停止運行。(2)TR1(Timer1Run)——定時/計數(shù)器T1運行控制位。它的功能同TR0。TCOND7D6D5D4D3D2D1D0位地址8FH8EH8DH8CH8BH8AH89H88H位定義TF1TR1TF0TR0IE1IT1IE0IT05.1.1與定時/計數(shù)器有關(guān)的SFR2.定時/計數(shù)器的工作方式控制寄存器TMODTMOD用于設(shè)定定時/計數(shù)器的工作方式。它的高4位控制T1,低4位控制T0;其字節(jié)地址是89H,不可位尋址,只能按字節(jié)(8位一起)整體賦值。TMOD的各位如表5-2所示。(1)GATE——門控位。GATE一般情況下設(shè)置為0,此時,定時/計數(shù)器的運行僅受TR0/TR1的控制。如果將GATE設(shè)置為1,則定時/計數(shù)器的運行還受對應(yīng)外部中斷引腳(INT0/INT1)輸入信號的控制。只有在外部中斷引腳輸入高電平,且TR0/TR1=1時,定時/計數(shù)器才運行。有時可以用門控位進行時鐘信號的測量。(2)C/T(Counter/Timer)——定時/計數(shù)選擇位。=0為定時方式,對內(nèi)部的機器周期脈沖進行計數(shù);=1為計數(shù)方式,對引腳上的脈沖信號計數(shù),負(fù)跳變有效。5.1.1與定時/計數(shù)器有關(guān)的SFR2.定時/計數(shù)器的工作方式控制寄存器TMOD(3)M1、M0——工作方式選擇位。M1和M0的組合可以作為定時/計數(shù)器不同的工作方式來使用M1M0位組合方式名稱功能備注00方式013位定時/計數(shù)器—01方式116位定時/計數(shù)器—10方式28位定時/計數(shù)器初值自動重裝11方式3兩個8位定時/計數(shù)器僅適用于T05.1.1與定時/計數(shù)器有關(guān)的SFR3.定時/計數(shù)器的計數(shù)寄存器定時/計數(shù)器內(nèi)部有一個16位計數(shù)器用來計脈沖數(shù),稱為計數(shù)寄存器。它是由由兩個8位寄存器(TH0和TL0)組成的。這兩個8位寄存器可以單獨進行讀/寫操作。它們的定義如下。TH0——T0的高8位。TL0——T0的低8位。TH1——T1的高8位。TL1——T1的低8位。5.1.2定時/計數(shù)器的工作方式1.方式0當(dāng)M1M0=00B時,定時/計數(shù)器工作于方式0,T0和T1的內(nèi)部結(jié)構(gòu)類似,以T0為例,其邏輯結(jié)構(gòu)如圖5-1所示(以T0為例),它是一個13位的計數(shù)器。5.1.2定時/計數(shù)器的工作方式1.方式0定時/計數(shù)器一般都是利用其計滿產(chǎn)生溢出標(biāo)志產(chǎn)生中斷的特性來工作的,通過要定時的時間來計算定時器初始值:

定時時間=(最大計數(shù)值?計數(shù)初值)×脈沖周期

計數(shù)初值=2N-定時時間/脈沖周期

=2N-t/T方式0中,N=13,t為定時時間,T為機器周期計算得出的13位的二進制數(shù)的初值,低5位存放在TL0(TL1)中,高8位存放在TH0(TH1)中。定時/計數(shù)器的工作方式2.方式1當(dāng)M1M0=01B時,定時/計數(shù)器工作于方式1方式1的結(jié)構(gòu)和方式0相同,唯一不同的是它的位數(shù)是16位,計算初值時得出的16位的二進制數(shù)的初值,低8位存放在TL0(TL1)中,高8位存放在TH0(TH1)中。5.1.2定時/計數(shù)器的工作方式3.方式2當(dāng)M1M0=10B時,定時/計數(shù)器工作于方式2,其邏輯結(jié)構(gòu)如圖所示。方式2是一個8位定時/計數(shù)器,其工作原理和方式0類似。只是它內(nèi)部結(jié)構(gòu)有所改變,它具有初值自動重裝功能。TL0為計數(shù)寄存器,TH0中存放重裝值。當(dāng)TL0計滿產(chǎn)生溢出標(biāo)志時,將TH0中的值傳送到TL0中。其他功能與方式0、方式1一樣。方式2的特點是可以自動反復(fù)地定時,溢出時自動重裝初值。而其它方式都不具備重裝功能,當(dāng)定時器溢出時,如果想再次定時,就需要人為給它裝入初值。4.方式3當(dāng)M1M0=11B時,定時/計數(shù)器T0工作于方式3,其邏輯結(jié)構(gòu)如圖所示。單片機內(nèi)部的兩個定時器中只有T0可以工作于方式3。T0工作于方式3時將16位定時/計數(shù)器拆成兩個8位定時/計數(shù)器。TL0作為一個8位的計數(shù)單元與T0的其他資源構(gòu)成一個8位定時/計數(shù)器,其結(jié)構(gòu)原理與其他工作方式類似。TH0作為另外一個8位的計數(shù)單元,用定時/計數(shù)器T1的TR1控制計數(shù)的啟停,用TF1作為TH0計滿溢出的標(biāo)志,構(gòu)成一個8位定時器。因其啟動控制和溢出標(biāo)志均使用了定時器的啟動位(TR1)與溢出位(TF1),因此,T1在此方式下就不能作為定時/計數(shù)器來使用了,但T1仍可以工作在其他方式下。5.1.2定時/計數(shù)器的工作方式5.1.3定時/計數(shù)器的使用方法1.硬件定時/計數(shù)器在對外部信息或事件進行計數(shù)時,需要通過適當(dāng)?shù)碾娐穼⑵滢D(zhuǎn)換成脈沖信號后加到定時/計數(shù)器的引腳上。外部被測脈沖信號的周期不能小于兩個機器周期,即最高頻率不能超過系統(tǒng)時鐘頻率的1/24。例如,對于晶振為12MHz的單片機系統(tǒng),其機器周期是1μs,對應(yīng)的頻率是1MHz,此時檢測外部脈沖的頻率就不能超過500kHz。5.1.3定時/計數(shù)器的使用方法1.硬件定時/計數(shù)器在對外部信息或事件進行計數(shù)時,需要通過適當(dāng)?shù)碾娐穼⑵滢D(zhuǎn)換成脈沖信號后加到定時/計數(shù)器的引腳上。外部被測脈沖信號的周期不能小于兩個機器周期,即最高頻率不能超過系統(tǒng)時鐘頻率的1/24。例如,對于晶振為12MHz的單片機系統(tǒng),其機器周期是1μs,對應(yīng)的頻率是1MHz,此時檢測外部脈沖的頻率就不能超過500kHz。5.1.3定時/計數(shù)器的使用方法2.軟件(1)初始化。初始化一般包括4部分。一是通過對TMOD進行設(shè)置來選擇定時/計數(shù)器及其工作方式。二是根據(jù)設(shè)置的工作方式計算計數(shù)初值三是啟動定時/計數(shù)器(TR0、TR1),在有些情況下,其啟動/停止受其他程序控制。四是開通有關(guān)的中斷允許控制位(ET0、ET1、EA)。(2)入口地址。單片機工作在中斷方式時,在程序結(jié)構(gòu)上,需要用偽指令定義中斷的入口地址,其形式與外部中斷一樣。例如,T0的入口地址可用下面的匯編指令定義:ORG000BHLJMPINTET0; //轉(zhuǎn)移到T0服務(wù)程序如果使用C語言編程,則無須設(shè)置入口地址,只需在中斷服務(wù)程序中指定中斷編號即可。5.1.3定時/計數(shù)器的使用方法【例5-2】

已知系統(tǒng)晶振是12MHz,在P1.0引腳上輸出2ms的方波,編寫程序?qū)崿F(xiàn)。實現(xiàn)方法分析:從例5-1中得知,定時器需要反復(fù)產(chǎn)生1ms的定時,機器周期為1μs,計數(shù)1000個機器周期即1ms,選擇T0,工作于方式1,定時1ms的初值計算見前面部分。方波的實現(xiàn)方法:在中斷程序中重新給定時器賦初值,并把P1.0引腳的電平取反后輸出。#include<reg51.h>sbitP1_0=P1^0;

//定義方波輸出引腳位變量

voidsetup(void)//初始化設(shè)置子函數(shù)

{TMOD=0x01; //T0,方式1,定時

TH0=0xFC;

//計數(shù)初值高位TL0=0x18;

//計數(shù)初值低位TR0=1;

//啟動運行ET0=1;

//開通定時器0中斷允許控制位EA=1;

//開通總的允許位}voidmain(void){setup();//調(diào)用設(shè)置子程序while(1)

//等待中斷{};}voidINTET0(void)interrupt1using1//中斷子程序{TH0=0xFC; //重裝計數(shù)初值TL0=0x18;P1_0=!P1_0;//輸出取反}5.1.3定時/計數(shù)器的使用方法【例5-2】

已知系統(tǒng)晶振是12MHz,在P1.0引腳上輸出2ms的方波,編寫程序?qū)崿F(xiàn)。實現(xiàn)方法分析:從例5-1中得知,定時器需要反復(fù)產(chǎn)生1ms的定時,機器周期為1μs,計數(shù)1000個機器周期即1ms,選擇T0,工作于方式1。方波的實現(xiàn)方法:在中斷程序中重新給定時器賦初值,并把P1.0引腳的電平取反后輸出。//初始化設(shè)置子函數(shù)

voidsetup(void) {TMOD=0x01; //T0,方式1,定時

TH0=0xFC;

//計數(shù)初值高位TL0=0x18;

//計數(shù)初值低位TR0=1;

//啟動運行ET0=1;

//開通定時器0中斷允許控制位EA=1;

//開通總的允許位}初值計算:定時時間=(最大計數(shù)值?計數(shù)初值)×脈沖周期工作方式1,最大計數(shù)值為216計數(shù)初值=2N-定時時間/脈沖周期

=2N-t/T

=216-1000/1us

=

65536-1000

=

64536=0xFC18因此,TH0=0xFC,TL0=0x18;5.1.3定時/計數(shù)器的使用方法#include<reg51.h>sbitP1_0=P1^0; //定義方波輸出引腳位變量voidmain(void){setup();//調(diào)用設(shè)置子程序while(1)//等待中斷{};}voidINTET0(void)interrupt1using1//中斷子程序{TH0=0xFC; //重裝計數(shù)初值TL0=0x18;P1_0=!P1_0;//輸出取反}仿真視頻5.1.3定時/計數(shù)器的使用方法【例5-3】在例3-4的基礎(chǔ)上設(shè)計一個時鐘,數(shù)碼管高2位顯示分,低2位顯示秒,系統(tǒng)晶振頻率為12MHz。時鐘實現(xiàn)的方法:首先要產(chǎn)生秒信號,系統(tǒng)機器周期是1μs,能產(chǎn)生的最大定時時間是65536μs,約66ms。可以將定時器的定時時間設(shè)置為50ms,通過重復(fù)定時來累計定時器中斷的次數(shù),20次就是1s。計數(shù)初值計算如下: 初值=216-50ms/1μs=65536-50000=15536TH0=15536/256=60,TL0=15536%256=1765.1.3定時/計數(shù)器的使用方法主要程序:voidsetup(void) //初始化設(shè)置函數(shù)聲明{TMOD=0x01;

//T0方式1定時

TH0=60; //50ms初值高位TL0=176; //50ms初值低位TR0=1; //啟動運行ET0=1;

//開通允許位EA=1; //開通總的允許位

}voidmain(void){

setup(); //調(diào)用設(shè)置子程序while(1) //等待中斷{display();

//顯示函數(shù)(略)}}voidINTET0(void)interrupt1using1//中斷服務(wù)子程序{

TH0=60;

//重裝計數(shù)初值TL0=176;counter++;

//計數(shù)加1if(counter!=20)

//判斷是否計到1sreturn;

//不到1s退出,繼續(xù)計時else

//否則1s后,計數(shù)清零,秒變量加1{counter=0;second++;

if(second==60)

//判斷是否計到60s

{ second=0; //秒清零 minute++; //代表分的值加1 if(minute==60) //判斷是否計到60

minute=0; //代表分的值清零

} }}

5.2

定時/計數(shù)器

的基礎(chǔ)應(yīng)用案例5.2.1輸出矩形波【例5-4】已知系統(tǒng)晶振是12MHz,在P1.0引腳上輸出如圖5-6所示的矩形波。方法一:用T0反復(fù)產(chǎn)生5ms的定時、T1反復(fù)產(chǎn)生2ms的定時,如圖5-7所示。當(dāng)T1定時時間到時,使P1.0引腳輸出低電平,并停止定時;當(dāng)T0定時時間到時,使P1.0引腳輸出高電平,啟動T1,一起開始下一個周期波的定時。

T0中斷子程序voidINTET0(void)interrupt1using0{TH0=0xEC; //T0中斷服務(wù)程序TL0=0x78; //重裝5ms初值P1_0=1; //P1.0引腳輸出高電平TR1=1; //啟動T1}

T1中斷子程序voidINTET1(void)interrupt3using1{TR1=0;

//T1停止運行TH1=0xF8;TL1=0x30; //重裝2ms初值P1_0=0; //P1.0引腳輸出低電平}5.2.1輸出矩形波【例5-4】已知系統(tǒng)晶振是12MHz,在P1.0引腳上輸出如圖5-6所示的矩形波。方法二:用T1產(chǎn)生2ms的定時、T0產(chǎn)生3ms的定時,如圖5-8所示。開始時,T1定時、T0不定時,當(dāng)T1定時時間到時,使P1.0引腳輸出低電平,自己停止定時,同時啟動T0;當(dāng)T0定時時間到時,使P1.0引腳輸出高電平,自己停止定時,同時啟動T1。這樣反復(fù)進行,可實現(xiàn)要輸出的波形。

T0中斷子程序voidINTET0(void)interrupt1using1{TR0=0; //T0停止運行TH0=0xF4;TL0=0x48;//重裝3ms初值P1_0=1; //P1.0引腳輸出高電平TR1=1; //啟動T1}

T1中斷子程序

voidINTET1(void)interrupt3using2{ TR1=0; //T1停止運行 TH1=0xF8; TL1=0x30; //重裝2ms初值 P1_0=0; //P1.0引腳輸出低電平 TR0=1; //啟動T0}5.2.1輸出矩形波【例5-4】已知系統(tǒng)晶振是12MHz,在P1.0引腳上輸出如圖5-6所示的矩形波。方法三:前面兩種方法都用到了兩個定時器,本方法只用一個定時器。本方法用T0代替方法二中的T1,即用T0交替產(chǎn)生2ms和3ms的定時,如圖所示,用一個位變量a來表示2ms和3ms的狀態(tài),如a=0表示2ms定時、a=1表示3ms定時。

T0中斷子程序

voidINTET0(void)interrupt1using0{ P1_0=!P1_0; //對P1.0引腳的輸出取反 a=!a; //定時狀態(tài)取反 if(a==0) //如果a=0,則2ms初值重裝 {

TH0=0xF8;

TL0=0x30; //重裝2ms初值 } else {

TH0=0xF4; //a=1

TL0=0x48; //重裝3ms初值 }}5.2.2頻率測量【例5-5】如圖5-10所示,用定時/計數(shù)器測量脈沖信號的頻率,系統(tǒng)晶振頻率為6MHz。

voidINTET1(void)interrupt3using1//T1中斷子程序{ TR0=0;

//停止計數(shù) TR1=0;

//停止定時 freq=TH0;/

//讀取計數(shù)寄存器的高位值

freq=(freq<<8|TL0)*10;//將高位值和低位值組合后換算為頻率 TH1=0x3C; TL1=0xB0;

//重裝定時初值 TH0=0; TL0=0;

//計數(shù)初值為0 TR1=1;

//啟動下一輪定時 TR0=1;

//啟動下一輪計數(shù)}實現(xiàn)方法分析:頻率是指周期信號1s內(nèi)重復(fù)的次數(shù)。用單片機測量頻率需要用兩個定時/計數(shù)器,一個用于定時,一個用于計外部脈沖數(shù)。選擇的閘門(定時)時間為0.1s,T1用于定時,T0用于計數(shù)。5.2.3脈沖寬度及周期測量在測量較低的頻率時,通常是通過測量信號周期的方法來實現(xiàn)的,由周期計算出頻率。圖

5-11所示為測量周期示意圖。

【例5-6】用定時/計數(shù)器測量脈沖信號的周期,系統(tǒng)晶振頻率為6MHz。實現(xiàn)方法分析:將脈沖信號加到外部中斷引腳上,脈沖的下降沿作為中斷的觸發(fā)信號。定時/計數(shù)器工作在計數(shù)模式下,在外部中斷的服務(wù)程序中啟動計數(shù)器,計內(nèi)部的機器周期數(shù)。外部中斷再次觸發(fā)時停止計數(shù),在兩次中斷觸發(fā)的期間內(nèi)計得的機器周期數(shù)就是被測信號的周期。voidINTEX0(void)interrupt0using1//外部中斷0子程序{ TR0=1; //啟動定時器,開始計數(shù) n++; //中斷次數(shù)加1 if(n==2)

//判斷是否2次中斷 {

TR0=0;

//停止計數(shù)機器周期

Tp=TH0;

//讀取計數(shù)寄存器的高位值

Tp=(Tp<<8|TL0)*2;//將高位值和低位值組合后換算為周期(機器周期為2μs)

TH0=0;

//計數(shù)值清零

TL0=0;

//為下一輪測量做準(zhǔn)備

n=0;

//中斷次數(shù)清零 }}5.2.3脈沖寬度及周期測量【例5-7】用定時/計數(shù)器測量脈沖的寬度,系統(tǒng)晶振頻率為6MHz。

將定時器T0的TMOD的GATE位設(shè)置為1,即定時器的啟動控制除了受到TR0的控制,還受到INT引腳的控制。此時的定時器只有在引腳是高電平期間內(nèi)才計數(shù),在低電平期間內(nèi)不計數(shù),故測出的是高電平的寬度。5.2.3脈沖寬度及周期測量【例5-7】用定時/計數(shù)器測量脈沖的寬度,系統(tǒng)晶振頻率為6MHz。

實現(xiàn)方法:在例5-6的程序上進行修改,即將TMOD設(shè)置改為:TMOD=0x09;并修改周期的計算方法,因測得的是半個周期,故整個周期的數(shù)值要乘2(僅針對方波信號)。voidINTEX0(void)interrupt0using1

//外部中斷0子程序{ TR0=1; //啟動定時器,開始計數(shù) n++; //中斷次數(shù)加1 if(n==2)

//判斷是否2次中斷 {

TR0=0;

//停止計數(shù)機器周期

Tp=TH0;

//讀取計數(shù)寄存器的高位值

Tp=(Tp<<8|TL0)*2*2;//計算周期

TH0=0;

//計數(shù)值清零

TL0=0;

//為下一輪測量做準(zhǔn)備

n=0; //中斷次數(shù)清零 }}5.2.4超聲波測距應(yīng)用

把40kHz的脈沖輸入超聲波發(fā)射器中,超聲波元件將脈沖信號轉(zhuǎn)換為超聲波信號,以聲速(340m/s)向前傳播。超聲波在遇到障礙物時會被反彈回來,最終被超聲波傳感器接收。通過記錄從發(fā)射到接收所經(jīng)歷的時間,就可以計算出超聲波到障礙物的距離:距離=340×(t/2)(t是超聲波從發(fā)射到接收所經(jīng)歷的時間,單程時間要除以2)。圖5-12超聲波測距原理超聲波模塊5.2.4超聲波測距應(yīng)用

HC-SR04超聲波模塊的時序圖如圖所示。給超聲波模塊的觸發(fā)引腳(Trig)一個啟動觸發(fā)信號,模塊收到啟動信號之后便產(chǎn)生8個連續(xù)的40kHz的脈沖信號,通過超聲波發(fā)射器(T)發(fā)射出超聲波信號;超聲波遇到障礙物后反彈回來被超聲波接收器(R)接收,在模塊的Echo引腳上產(chǎn)生與距離成正比的高電平回響信號,通過測量此高電平的寬度就可以測得超聲波到障礙物的距離。5.2.4超聲波測距應(yīng)用

【例5-8】利用單片機和超聲波測距模塊進行距離的測量,編寫程序?qū)崿F(xiàn)。實現(xiàn)方法分析:通過超聲波測距的原理可知,超聲波測距通過一個10μs的脈沖來啟動,接收的回響信號由Echo引腳產(chǎn)生高電平指示。測量該高電平信號的寬度就可以獲得距離。參考例5-7可以測量高電平的寬度。主要程序:T0中斷服務(wù)子程序,用來計定時器計滿溢出次數(shù)voidINTET0(void)interrupt1using1{ Time_Count++; //定時器計滿溢出次數(shù)加1 TL0=0x00; //設(shè)置定時初值低8位 TH0=0x00; //設(shè)置定時初值高8位}INT0中斷服務(wù)子程序,用來停止定時器計數(shù)voidINTEX0(void)interrupt0using2{ TR0=0;

//停止計數(shù) END=1;

//置完成標(biāo)識}//程序功能:測距計算voidmeasure(void){ StartModule(); TR0=1;//開啟定時器,等待高電平到來 while(!END);

//等待回響信號結(jié)束 END=0; time=TH0; time=time<<8|TL0;

time=time+(Time_Count*65535);

//計算總時長 TH0=0;

//定時/計數(shù)器清零 TL0=0; Time_Count=0; //溢出次數(shù)清零

S=time/58;//按照給定的公式計算距離,得到以cm為單位的距離}

5.3定時/計數(shù)器

的高級應(yīng)用5.3.1多個時間的延時要實現(xiàn)多個延時也可以借鑒時鐘產(chǎn)生的方法,其基本的思想如下。(1)根據(jù)給定的定時設(shè)置多個時間的最小定時單位。(如50ms)(2)給每個定時時間設(shè)置一個啟動標(biāo)識(start_flag)和一個結(jié)束標(biāo)識(end_flag)。(3)通過查看定時的結(jié)束標(biāo)識是否為1(end_flag==1)來判斷定時時間到達與否。5.3.2無阻塞延時要實現(xiàn)無阻塞延時,可以參考5.3.1節(jié)中介紹的多個時間的定時方法,采用定時器方式來延時,同時配以相關(guān)的標(biāo)識來指示延時結(jié)束。如例3-5中的按鍵掃描程序,給按鍵掃描設(shè)定一個周期,如每5ms掃描一次,用定時器實現(xiàn)定時。設(shè)定按鍵相關(guān)標(biāo)識如下:

key_count=0;

//按鍵按下計數(shù)變量

key_release=0;

//按鍵釋放標(biāo)識實現(xiàn)延時消抖功能,通過定時器定時5ms中斷次數(shù)的計數(shù)來實現(xiàn)。按鍵的釋放判斷通過定義按鍵釋放標(biāo)識變量key_release來標(biāo)示是否有按鍵被按下,以及按鍵是否被釋放。當(dāng)有按鍵被按下時,key_release=1,當(dāng)檢測到?jīng)]有按鍵被按下時,把按鍵按下計數(shù)變量和按鍵釋放標(biāo)識清零,表示一次按鍵動作結(jié)束。5.3.3多任務(wù)的管理、調(diào)度時間片輪詢調(diào)度算法的程序框架(1)任務(wù)結(jié)構(gòu)體。任務(wù)結(jié)構(gòu)體包含了一個任務(wù)需要的所有信息,包括運行狀態(tài)標(biāo)志、計時器、任務(wù)運行間隔時間,以及這個任務(wù)對應(yīng)的函數(shù)指針。typedefstructTask{unsignedcharRun;//程序運行標(biāo)志:0表示不運行,1表示運行

unsignedintTimer;//計時器

uinsignedintItvTime;//任務(wù)運行間隔時間

void(*TaskHook)(void);//要運行的任務(wù)函數(shù)}Task_TypeDef;(2)任務(wù)數(shù)組。任務(wù)數(shù)組其實就是任務(wù)的結(jié)構(gòu)體數(shù)組,包含各個任務(wù)的參數(shù)。當(dāng)需要添加一個任務(wù)到時間片輪詢隊列中時,只需在任務(wù)數(shù)組中添加函數(shù)指針,并設(shè)置好相關(guān)參數(shù)即可。staticTask_TypeDefTaskComps[]={{0,0,20,Task_DisplayClock}, //顯示時鐘{0,0,50,Task_KeyScan}, //按鍵掃描{0,0,100,Task_DispStatus}, //顯示工作狀態(tài) ...... //在這里添加新的任務(wù)};5.3.3多任務(wù)的管理、調(diào)度時間片輪詢調(diào)度算法的程序框架(1)任務(wù)結(jié)構(gòu)體。任務(wù)結(jié)構(gòu)體包含了一個任務(wù)需要的所有信息,包括運行狀態(tài)標(biāo)志、計時器、任務(wù)運行間隔時間,以及這個任務(wù)對應(yīng)的函數(shù)指針。typedefstructTask{unsignedcharRun;//程序運行標(biāo)志:0表示不運行,1表示運行unsignedintTimer;//計時器uinsignedintItvTime;//任務(wù)運行間隔時間void(*TaskHook)(void);//要運行的任務(wù)函數(shù)}Task_TypeDef;(2)任務(wù)數(shù)組。任務(wù)數(shù)組其實就是任務(wù)的結(jié)構(gòu)體數(shù)組,包含各個任務(wù)的參數(shù)。當(dāng)需要添加一個任務(wù)到時間片輪詢隊列中時,只需在任務(wù)數(shù)組中添加函數(shù)指針,并設(shè)置好相關(guān)參數(shù)即可。staticTask_TypeDefTaskComps[]={{0,0,20,Task_DisplayClock}, //顯示時鐘{0,0,50,Task_KeyScan}, //按鍵掃描{0,0,100,Task_DispStatus}, //顯示工作狀態(tài) ......

//在這里添加新的任務(wù)};5.3.3多任務(wù)的管理、調(diào)度(3)任務(wù)列表。任務(wù)列表的作用主要是給任務(wù)數(shù)組的元素標(biāo)注名稱,用到了C語言的枚舉變量enum。枚舉變量的元素編號是從0開始的,依次遞增。typedefenumTASK_LIST{TAST_DISP_CLOCK,//0,顯示時鐘TAST_KEY_SAN,//1,按鍵掃描TASK_DISP_WKST,//2,工作狀態(tài)顯示...... //在這里添加新的任務(wù)TASKS_MAX //任務(wù)最大值,表明可供分配的定時任務(wù)的數(shù)目}TASK_LIST_TypeDef;5.3.3多任務(wù)的管理、調(diào)度(4)標(biāo)志位處理函數(shù)。標(biāo)志位處理函數(shù)是用來更新每個任務(wù)的計時器及其運行標(biāo)志位的,在單片機的定時器中斷服務(wù)函數(shù)中調(diào)用它。voidTaskRemarks(void){uint8i;for(i=0;i<TASKS_MAX;i++) //對每個任務(wù)的計時時間進行處理{if(TaskComps[i].Timer) //時間不為0{TaskComps[i].Timer--; //采用遞減計數(shù)方式,減去一個節(jié)拍if(TaskComps[i].Timer==0) //計時結(jié)束{TaskComps[i].Timer=TaskComps[i].ItvTime;//恢復(fù)計時初值TaskComps[i].Run=1; //任務(wù)可以運行}}}}5.3.3多任務(wù)的管理、調(diào)度(5)各個任務(wù)函數(shù)(略)整個程序的執(zhí)行流程:定時中斷服務(wù)函數(shù)不斷檢查并刷新每個任務(wù)的狀態(tài),實時更新任務(wù)數(shù)組的數(shù)據(jù)(時間和標(biāo)志)。任務(wù)處理函數(shù)根據(jù)這些狀態(tài)來判斷要執(zhí)行哪些函數(shù),如果條件滿足,就調(diào)用相應(yīng)的任務(wù)函數(shù)執(zhí)行。時間片輪詢調(diào)度算法的程序的框架流程圖如圖所示。5.4

項目訓(xùn)練:

數(shù)字電子鐘設(shè)計5.4.1項目要求本項目的具體任務(wù)是用單片機設(shè)計一個簡單的數(shù)字電子鐘,能顯示時、分、秒,并能進行調(diào)整。具體要求如下。(1)開機時,顯示12:00:00,開始計時。(2)按鍵1控制“秒”的調(diào)整,每按一次加1s。(3)按鍵2控制“分”的調(diào)整

溫馨提示

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

評論

0/150

提交評論