單片機(jī)原理及應(yīng)用設(shè)計(jì) 課件 第7章 定時器計(jì)數(shù)器 23.9.27_第1頁
單片機(jī)原理及應(yīng)用設(shè)計(jì) 課件 第7章 定時器計(jì)數(shù)器 23.9.27_第2頁
單片機(jī)原理及應(yīng)用設(shè)計(jì) 課件 第7章 定時器計(jì)數(shù)器 23.9.27_第3頁
單片機(jī)原理及應(yīng)用設(shè)計(jì) 課件 第7章 定時器計(jì)數(shù)器 23.9.27_第4頁
單片機(jī)原理及應(yīng)用設(shè)計(jì) 課件 第7章 定時器計(jì)數(shù)器 23.9.27_第5頁
已閱讀5頁,還剩108頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章定時器/計(jì)數(shù)器的

工作原理及應(yīng)用

1第7章定時器/計(jì)數(shù)器的

工作原理及應(yīng)用7.1定時器/計(jì)數(shù)器的結(jié)構(gòu)7.2定時器/計(jì)數(shù)器的4種工作方式7.4定時器/計(jì)數(shù)器T0、T1的編程應(yīng)用7.1定時器/計(jì)數(shù)器的結(jié)構(gòu)定時器/計(jì)數(shù)器T0由特殊功能寄存器TH0、TL0構(gòu)成;T1由特殊功能寄存器TH1、TL1構(gòu)成。3圖7-1

定時器/計(jì)數(shù)器結(jié)構(gòu)框圖溢出標(biāo)志位TF0=1計(jì)數(shù)初值TH0/TL0加1計(jì)數(shù)器加1TcyTcyTcyTcy計(jì)滿溢出.....1111111111111111TL0TH0T0、T1都有定時器和計(jì)數(shù)器兩種工作模式,兩種模式實(shí)質(zhì)都是對脈沖信號進(jìn)行計(jì)數(shù),只不過計(jì)數(shù)信號來源不同。

計(jì)數(shù)器起始計(jì)數(shù)從初值開始。單片機(jī)復(fù)位時計(jì)數(shù)器初值為0,也可給計(jì)數(shù)器裝入1個新的初值。計(jì)數(shù)器模式是對加在T0(P3.4)和T1(P3.5)兩個引腳上的外部脈沖進(jìn)行計(jì)數(shù)(見圖7-1);定時器模式是對系統(tǒng)時鐘信號經(jīng)12分頻后的內(nèi)部脈沖信號(機(jī)器周期)計(jì)數(shù)。由于系統(tǒng)時鐘頻率是定值,可根據(jù)計(jì)數(shù)值計(jì)算出定時時間。兩個定時器/計(jì)數(shù)器屬于增1計(jì)數(shù)器,即每計(jì)一個脈沖,計(jì)數(shù)器增1。

T0、T1具有4種工作方式(方式0、1、2和3)。

7.1.1工作方式控制寄存器TMODTMOD:字節(jié)地址為89H,不能位尋址,格式見下圖。

TMOD各位說明如下:(1)GATE—門控位GATE=0,定時器是否計(jì)數(shù),由控制位TRx(x

=

0,1)來控制。GATE=1,定時器是否計(jì)數(shù),由外中斷引腳INTx*上的電平與運(yùn)行控制位TRx共同控制。7

定時/計(jì)數(shù)器原理圖(GATE=0)8011111X

定時/計(jì)數(shù)器原理圖(GATE=1)91011111

(2)M1、M0—工作方式選擇位

10M1M0工

式00方式0,為13位定時器/計(jì)數(shù)器01方式1,為16位定時器/計(jì)數(shù)器10方式2,為8位的常數(shù)自動重新裝載的定時器/計(jì)數(shù)器11方式3,僅適用于T0,此時T0分成2個8位計(jì)數(shù)器,T1停止計(jì)數(shù)

117.1.2定時器/計(jì)數(shù)器控制寄存器TCON

TCON字節(jié)地址88H,位地址為88H~8FH。格式見下圖。

12(1)TF1、TF0—計(jì)數(shù)溢出標(biāo)志位

當(dāng)計(jì)數(shù)器計(jì)數(shù)溢出時,該位置“1”。使用查詢方式時,此位可供CPU查詢,但應(yīng)注意查詢后,用軟件及時將該位清“0”。使用中斷方式時,作為中斷請求標(biāo)志位,進(jìn)入中斷服務(wù)程序后由硬件自動清“0”。(2)TR1、TR0—計(jì)數(shù)運(yùn)行控制位TR1位(或TR0)=1,啟動計(jì)數(shù)器計(jì)數(shù)的必要條件。TR1位(或TR0)=0,停止計(jì)數(shù)器計(jì)數(shù)。

該位可由軟件置“1”或清“0”。7.2定時器/計(jì)數(shù)器的4種工作方式4種工作方式,分別介紹如下。137.2.1方式0當(dāng)M1、M0=00,設(shè)置為方式0,定時器/計(jì)數(shù)器等效邏輯結(jié)構(gòu)見圖7-4(以T1為例,TMOD.5、TMOD.4

=

00)。14圖7-4

定時器/計(jì)數(shù)器方式0的邏輯結(jié)構(gòu)框圖

15

17圖7-5

方式1的邏輯結(jié)構(gòu)框圖7.2.2方式1

當(dāng)M1M0=01時,工作于方式1,等效電路邏輯結(jié)構(gòu)見圖7-5。7.2.3方式2工作方式2為自動恢復(fù)初值(初值自動裝入)的8位定時器/計(jì)數(shù)器,TLx(x=0,1)作為常數(shù)緩沖器,當(dāng)TLx計(jì)數(shù)溢出時,在溢出標(biāo)志TFx置“1”的同時,還自動將THx中的初值送至TLx,使TLx從初值開始重新計(jì)數(shù)。定時器/計(jì)數(shù)器方式2工作過程見圖7-7。1819圖7-6

方式2邏輯結(jié)構(gòu)框圖20圖7-7

方式2工作過程方式2可省去用戶軟件中重裝初值的指令執(zhí)行時間,簡化定時初值的計(jì)算方法,可相當(dāng)精確地定時。7.2.4方式3方式3只適用于T0,T1不能工作在方式3。T1方式3時相當(dāng)于TR1

=

0,停止計(jì)數(shù)(此時T1可作為串口波特率產(chǎn)生器)。TH0:定時TL0:定時、計(jì)數(shù)T1:串行口波特率發(fā)生器21

圖7-8T0方式3的邏輯結(jié)構(gòu)框圖補(bǔ):定時計(jì)數(shù)器T0/T1中斷申請過程:按片內(nèi)機(jī)器周期定時,或由外部引腳輸入一個負(fù)脈沖進(jìn)行加法計(jì)數(shù);在已經(jīng)開放T0/T1中斷允許且已被啟動的前提下:T0/T1加滿溢出時,TF0/TF1標(biāo)志位自動置1;檢測到TCON中的TF0/TF1變1后,將產(chǎn)生指令:LCALL000BH/LCALL001BH執(zhí)行中斷服務(wù)程序;TF0/TF1標(biāo)志位自動清0,以備下次中斷申請。補(bǔ):初值計(jì)算1.定時初值計(jì)算:設(shè)T表示定時時間,初值用X表示,所用計(jì)數(shù)器位數(shù)為N,設(shè)系統(tǒng)時鐘頻率為fosc,則它們滿足:(2N-X)×12/fosc=TX=2N-fosc/12×T2.計(jì)數(shù)初值計(jì)算N是所用計(jì)數(shù)器的位數(shù),設(shè)X為計(jì)數(shù)初值,則計(jì)數(shù)值滿足:

X=2N-計(jì)數(shù)值

257.4定時器/計(jì)數(shù)器的編程和應(yīng)用方式0與方式1基本相同,只是計(jì)數(shù)位數(shù)不同。方式0為13位,方式1為16位。由于方式0是為兼容MCS-48而設(shè),計(jì)數(shù)初值計(jì)算復(fù)雜,所以在實(shí)際應(yīng)用中,一般不用方式0,常采用方式1。7.4.1P1口控制8只LED每0.5s閃亮一次【例7-1】在AT89S51的P1口上接有8只LED,原理電路見圖7-13。采用T0方式1的定時中斷方式,使P1口外接的8只LED每0.5s閃亮一次。26

圖7-13

方式1定時中斷控制LED閃亮

27

定時時間=(216?X)×12/晶振頻率

5

000=(216

?X)×12/11.059

2

X=60

928

轉(zhuǎn)換成十六進(jìn)制:0xee00,其中0xee裝入TH0,0x00裝入TL0。(3)設(shè)置IE寄存器

本例由于采用定時器T0中斷,因此需將IE寄存器中的EA、ET0位置1。(4)啟動和停止定時器T0

將定時器控制寄存器TCON中的TR0=1,則啟動定時器T0;TR0=0,則停止定時器T0定時。29#include<reg51.h>chari=100;voidmain(){

TMOD=0x01; //定時器T0為方式1

TH0=0xee; //設(shè)置定時器初值

TL0=0x00; P1=0x00; //P1口8個LED點(diǎn)亮 EA=1; //總中斷開 ET0=1; //開T0中斷 TR0=1; //啟動T0 while(1); //循環(huán)等待

}30voidtimer0()interrupt1 //T0中斷程序{

TH0=0xee; //重新賦初值

TL0=0x00; i--; //循環(huán)次數(shù)減1 if(i<=0) {

P1=~P1; //P1口按位取反

i=100;

//重置循環(huán)次數(shù) }}7.4.2計(jì)數(shù)器的應(yīng)用【例7-2】如圖7-14,T1采用計(jì)數(shù)模式,方式1中斷,計(jì)數(shù)輸入引腳T1(P3.5)上外接按鈕開關(guān),作為計(jì)數(shù)信號輸入。按4次按鈕開關(guān)后,P1口的8只LED閃爍不停。32

圖7-14

由外部計(jì)數(shù)輸入信號控制LED的閃爍(1)設(shè)置TMOD寄存器T1工作在方式1,應(yīng)使TMOD的M1、M0=01;設(shè)置C/T*=1,為計(jì)數(shù)器模式;對T0運(yùn)行控制僅由TR0來控制,應(yīng)使GATE0=0。定時器T0不使用,各相關(guān)位均設(shè)為0。所以,TMOD寄存器應(yīng)初始化為0x50。(2)計(jì)算定時器T1的計(jì)數(shù)初值由于每按1次按鈕開關(guān),計(jì)數(shù)1次,按4次后,P1口的8只LED閃爍不停。因此計(jì)數(shù)器初值為65

536?4=65

532,將其轉(zhuǎn)換成十六進(jìn)制后為0xfffc,所以,TH0=0xff,TL0=0xfc。34(3)設(shè)置IE寄存器

本例由于采用T1中斷,因此需將IE寄存器的EA、ET1位置1。(4)啟動和停止定時器T1

將寄存器TCON中TR1=1,則啟動T1計(jì)數(shù);TR1=0,則停止T1計(jì)數(shù)。參考程序如下:#include<reg51.h>

voidDelay(unsignedinti) //定義延時函數(shù){ unsignedintj; for(;i>0;i--) for(j=0;j<125;j++) {;} }3637voidmain() //主函數(shù){

TMOD=0x50; //設(shè)置定時器T1為方式1計(jì)數(shù)

TH1=0xff; //向TH1寫入初值的高8位

TL1=0xfc; //向TL1寫入初值的低8位

EA=1; //總中斷允許

ET1=1; //定時器T1中斷允許

TR1=1; //啟動定時器T1

while(1);

//無窮循環(huán),等待計(jì)數(shù)中斷}38voidT1_int(void)interrupt3 //T1中斷函數(shù){ for(;;) //無限循環(huán) {

P1=0xff; //8位LED全滅 Delay(500); //延時500ms

P1=0; //8位LED全亮 Delay(500); //延時500ms } }397.4.3控制P1.0產(chǎn)生周期為2ms的方波【例7-3】假設(shè)系統(tǒng)時鐘為12MHz,設(shè)計(jì)電路并編寫程序?qū)崿F(xiàn)從P1.0引腳上輸出一個周期為2ms的方波,見圖7-15。

分析:要在P1.0上產(chǎn)生周期為2ms的方波,定時器應(yīng)產(chǎn)生1ms的定時中斷,定時時間到則在中斷服務(wù)程序中對P1.0求反。使用定時器T0,方式1定時中斷,GATE不起作用。

本例的原理電路見圖7-16。其中在P1.0引腳接有虛擬示波器,用來觀察產(chǎn)生的周期2ms的方波。

圖7-15

定時器控制P1.0輸出一個周期2ms方波41圖7-16

定時器控制P1.0輸出周期2ms的方波的原理電路設(shè)T0的初值為X,則(216

?

X)

1

10?6

=

1

10?3=

65536?X

=1000則初值為:65536?1000=64536如何將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制傳送給TH0、TL0?方法1:直接將64536轉(zhuǎn)換成十六進(jìn)制即可傳送:64536=0xFC18TH0=0xFC;TL0=0x18;方法2:利用求余取整進(jìn)行賦值,即TH0=(65536

?1000)

/256;

TL0=(65536

?1000)

%256;利用十進(jìn)制數(shù)來舉例說明,如何實(shí)現(xiàn)求一個數(shù)(比如1234)的高2位和低2位只需求1234/102商和余數(shù)。同理,(65536

?1000)轉(zhuǎn)換成二進(jìn)制后的低八位即是(65536

?1000)

%28,進(jìn)行求余運(yùn)算的結(jié)果。高八位就是(65536

?1000)

/28,進(jìn)行取整運(yùn)算的結(jié)果#include<reg51.h>sbitP1_0=P1^0;voidmain(void){TMOD=0x01; /*設(shè)置定時器T0為方式1計(jì)數(shù)*/P1_0=0;TH0=(65536

?1000)

/256;/*給T0裝入初值*/TL0=(65536

?1000)

%256;/*給T0裝入初值*/ET0=1; /*允許T0中斷*/EA=1;/*總中斷開*/TR0=1; /*接通T0計(jì)數(shù)*/do{}while(1); /*無限循環(huán)等待*/}voidT0_int(void)interrupt1{P1_0=!P1_0;TH0=(65536

?1000)

/256;TL0=(65536

?1000)

%256;}思考題:能不能使用不斷查詢TF0位的狀態(tài)來判斷定時時間結(jié)束,然后執(zhí)行取反操作?注意TF0軟件清0!#include<reg51.h>sbitP1_0=P1^0;voidmain(void){ TMOD=0x01; /*設(shè)置定時器T0為方式2計(jì)數(shù)*/ P1_0=0;TH0=(65536-1000)/256;/*給T0裝入初值*/TL0=(65536-1000)%256;/*給T0裝入初值*/TR0=1; /*啟動T0計(jì)數(shù)*/while(1){if(TF0==1) {P1_0=!P1_0; TF0=0;/*每次計(jì)數(shù)時間結(jié)束,均要進(jìn)行軟件清0,為下次查詢做準(zhǔn)備*/ TH0=(65536-1000)/256; TL0=(65536-1000)%256;}}}50#include<reg51.h> //頭文件reg51.hsbitP1_0=P1^0; //定義特殊功能寄存器P1的位變量P1_0voidmain(void) //主程序{ TMOD=0x01; //設(shè)置T0為方式1 TR0=1; //接通T0

while(1) //無限循環(huán) {51 TH0=0xfc; //置T0高8位初值

TL0=0x18; //置T0低8位初值

do{}while(!TF0);

//TF0為0原地循環(huán),為1則T0溢

//出,往下執(zhí)行 P1_0=!P1_0; //P1.0狀態(tài)求反 TF0=0; //TF0標(biāo)志清零 }}52

圖7-17

虛擬數(shù)字示波器顯示的2ms的方波波形▼

【補(bǔ)例】假設(shè)系統(tǒng)時鐘為12MHz,編程實(shí)現(xiàn)從P1.1引腳上輸出一個周期為1s的方波。▼基本思想:要在P1.1上產(chǎn)生周期為1s的方波,定時器應(yīng)產(chǎn)生500ms的周期性定時,定時到則對P1.1求反。由于定時時間較長,用定時器不能直接實(shí)現(xiàn),直接定時時間最長的就是方式1,僅為65ms(系統(tǒng)時鐘12MHz)多一點(diǎn)。▼實(shí)現(xiàn):T0定時為10ms定時,每10ms對P1.0求反一次,P1.0輸出的脈沖加到定時器T1的計(jì)數(shù)輸入腳P3.5(T1腳),作為計(jì)數(shù)輸入,定時500ms需計(jì)數(shù)25次。T1設(shè)為方式2計(jì)數(shù),初值X為:28?X=25,則X=231,所以TH1=TL1=231。T0設(shè)為方式1定時,則TMOD控制字為61H(01100001)。定時器T0和T1均采用中斷方式工作。▼#include<reg51.h>sbitP1_0=P1^0;sbitP1_1=P1^1;voidmain(void){TMOD=0x61; /*設(shè)置定時器T0為方式1定時,T1為方式2計(jì)數(shù)*/P1_0=0;▼TH0=(65536

?10000)

/256; /*給T0裝初值*/TL0=(65536

?10000)

%256;TH1=231;

/*給T1裝初值*/TL1=231;EA=1; /*總中斷開*/ET0=1; /*允許T0中斷*/ET1=1; /*允許T1中斷*/▼TR0=1;TR1=1;while(1); }voidT0_int(void)interrupt1{ TH0=(65536

?10000)

/256;TL0=(65536

?10000)

%256;▼P1_0=!P1_0;}voidT1_int(void)interrupt3{P1_1=!P1_1; }; /*P1.1腳產(chǎn)生1s的方波*/。7.4.4利用T1控制發(fā)出1kHz的音頻信號

【例7-4】利用T1的中斷控制P1.7引腳輸出頻率為1kHz方波音頻信號,驅(qū)動蜂鳴器發(fā)聲。系統(tǒng)時鐘為12MHz。方波音頻信號周期1ms,因此T1定時中斷時間為0.5ms,進(jìn)入中斷服務(wù)程序后,對P1.7求反。電路見圖7-18。分析:先計(jì)算T1初值,系統(tǒng)時鐘為12MHz,則機(jī)器周期為1μs。1kHz信號周期為1ms,要定時計(jì)數(shù)的脈沖數(shù)為a。則T1初值:

TH1=(65

536

?a)

/256;

TL1=(65

536

?a)

%2566061圖7-18

控制蜂鳴器發(fā)出1kHz的音頻信號參考程序如下:#include<reg51.h> //包含頭文件sbitsound=P1^7; //將sound位定義為P1.7腳#definef1(a)

(65536-a)/256

//定義裝入定時器高8位時間常數(shù)#definef2(a)

(65536-a)%256//定義裝入定時器低8位時間常數(shù)unsignedinti=500;unsignedintj=0;voidmain(void){ EA=1;//開總中斷.ET1=1;//允許定時器T1中斷

TMOD=0x10; //TMOD=0001000B,使用T1的方式1定時63TH1=f1(i); //給T1高8位賦初值.

TL1=f2(i); //給T1低8位賦初值.TR1=1;//啟動T1while(1){

//循環(huán)等待

i=500; while(j<2000); j=0;

i=500; while(j<2000); j=0;

}}64voidT_1(void)interrupt3using0 //定時器T1中斷函數(shù){ TR1=0; //關(guān)閉T1

sound=~sound; //P1.7輸出求反

TH1=f1(i); //T1的高8位重新賦初值.

TL1=f2(i); //T1的低8位重新賦初值. j++; TR1=1; //啟動定時器T1}657.4.5LED數(shù)碼管秒表的制作

【例7-5】用2位數(shù)碼管顯示計(jì)時時間,最小計(jì)時單位為“百毫秒”,計(jì)時范圍0.1~9.9s。當(dāng)?shù)?次按一下計(jì)時功能鍵時,秒表開始計(jì)時并顯示;第2次按一下計(jì)時功能鍵時,停止計(jì)時,將計(jì)時的時間值送到數(shù)碼管顯示;如果計(jì)時到9.9s,將重新開始從0計(jì)時;第3次按一下計(jì)時功能鍵,秒表清0。再次按一下計(jì)時功能鍵,則重復(fù)上述計(jì)時過程。

本秒表應(yīng)用定時器模式,計(jì)時范圍0.1~9.9s。此外還涉及如何編寫控制LED數(shù)碼管顯示的程序。

原理電路見圖7-19。66圖7-19LED數(shù)碼管顯示的秒表原理電路及仿真67#include<reg51.h> //頭文件unsignedcharcodediscode1[]=

{0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

//數(shù)碼管顯示0~9的段碼表,帶小數(shù)點(diǎn)unsignedcharcodediscode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//數(shù)碼管顯示0~9的段碼表,不帶小數(shù)點(diǎn)unsignedchartimer=0; //timer記錄中斷次數(shù)unsignedcharsecond; //second儲存秒unsignedcharkey=0; //key記錄按鍵次數(shù)68voidmain() //主函數(shù){

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

ET0=1; //允許定時器T0中斷

EA=1; //總中斷允許second=0; //設(shè)初始值P0=discode1[second/10]; //顯示秒位0P2=discode2[second%10]; //顯示0.1s位0while(1) //循環(huán){ if((P3&0x80)==0x00) //當(dāng)按鍵被按下時 { key++; //按鍵次數(shù)加1 switch(key) //根據(jù)按鍵次數(shù)分三種情況 {

69case1://第一次按下為啟動秒表計(jì)時

TH0=0xee; //向TH0寫入初值的高8位TL0=0x00; //向TL0寫入初值的低8位,定時5ms TR0=1;//啟動定時器T0 break; case2://按下兩次暫定秒表 TR0=0;//關(guān)閉定時器T0 break; case3://按下3次秒表清0 key=0;//按鍵次數(shù)清0 second=0;//秒表清0

P0=discode1[second/10]; //顯示秒位0 P2=discode2[second%10]; //顯示0.1s位0 break;}

while((P3&0x80)==0x00);//如果按鍵時間過長在此循環(huán)

}}}70voidint_T0()interrupt1using0 //定時器T0中斷函數(shù){ TR0=0; //停止計(jì)時,執(zhí)行以下操作(會帶來計(jì)時誤差)

TH0=0xee; //向TH0寫入初值的高8位

TL0=0x00; //向TL0寫入初值的低8位,定時5ms timer++; //記錄中斷次數(shù) if(timer==20) //中斷20次,共計(jì)時20*5ms=100ms=0.1s { timer=0; //中斷次數(shù)清0 second++; //加0.1s

P0=discode1[second/10]; //根據(jù)計(jì)時,即時顯示秒位

P2=discode2[second%10];//根據(jù)計(jì)時,即時顯示0.1s位}7172if(second==99)

//當(dāng)計(jì)時到9.9s時{ TR0=0; //停止計(jì)時 second=0; //秒數(shù)清0 key=2; //按鍵數(shù)置2,當(dāng)再次按下按鍵時,

//key++,即key=3,秒表清0復(fù)原

}else //計(jì)時不到9.9s時{ TR0=1; //啟動定時器繼續(xù)計(jì)時}}7.4.6測量脈沖寬度—門控位GATEx的應(yīng)用門控位GATE應(yīng)用。利用GATE測量INT1*腳上正脈沖寬度?!纠?-6】門控位GATE1可使T1啟動計(jì)數(shù)受INT1*控制,當(dāng)GATE1=1,TR1=1時,只有INT1*引腳輸入高電平時,T1才被允許計(jì)數(shù)。利用該功能,可測量INT1*腳正脈沖寬度,方法見圖7-20。

原理電路見圖7-21,圖中省略復(fù)位電路和時鐘電路。利用門控位GATE1來測量INT1*腳上正脈沖寬度,并在6位數(shù)碼管上以機(jī)器周期數(shù)顯示。對被測量脈沖信號寬度,要求能通過旋轉(zhuǎn)信號源旋鈕可調(diào)。73圖7-20利用GATE位測量正脈沖的寬度75

圖7-21

利用GATE位測量INT1*引腳上正脈沖的寬度的原理電路參考程序如下:#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharsbitP3_3=P3^3; //位變量定義ucharcount_high; //定義計(jì)數(shù)變量,用來讀取TH0ucharcount_low; //定義計(jì)數(shù)變量,用來讀取TL0uintnum;ucharshiwan,wan,qian,bai,shi,ge;ucharflag;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極數(shù)碼管段碼表76voiddelay(uintz) //延時函數(shù){ uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}voiddisplay(uinta,uintb,uintc,uintd,uinte,uintf)//數(shù)碼管顯示函數(shù){

P2=0xfe;

P0=table[f]; delay(2);

P2=0xfd;

P0=table[e]; delay(2);

P2=0xfb; P0=table[d];77 delay(2);

P2=0xf7;

P0=table[c];

delay(2);

P2=0xef;

P0=table[b]; delay(2);

P2=0xdf;

P0=table[a]; delay(2);}7879voidread_count()

//讀取計(jì)數(shù)寄存器的內(nèi)容{do { count_high=TH1; //讀高字節(jié) count_low=TL1; //讀低字節(jié) }while(count_high!=TH1);

num=count_high*256+count_low;

/*可將兩字節(jié)的機(jī)器周期數(shù)進(jìn)行顯示處理*/

}voidmain(){ while(1) { flag=0;

TMOD=0x90; //設(shè)置定時器T1為方式1定時TH1=0; //向定時器T1寫入計(jì)數(shù)初值TL1=0;while(P3_3==1); //等待INT1*變低TR1=1; //如果INT1*為低,啟動T1(未真正開始計(jì)數(shù))while(P3_3==0); //等待INT1*變高,變高后T1真正開始計(jì)數(shù)while(P3_3==1); //等待INT1*變低,變低后T1停止計(jì)數(shù)TR1=0;read_count(); //讀計(jì)數(shù)寄存器內(nèi)容的函數(shù)shiwan=num/100000;wan=num%100000/10000;qian=num%10000/1000;bai=num%1000/100;shi=num%100/10;80ge=num%10;while(flag!=100) //減小刷新頻率 { flag++; display(ge,shi,bai,qian,wan,shiwan); }}}

81827.4.7LCD時鐘的設(shè)計(jì)

【例7-7】使用定時器實(shí)現(xiàn)一個LCD顯示時鐘。采用LCD1602,具體見第5章的紹。LCD時鐘的原理電路見圖7-22。

最小計(jì)時單位是秒,如何獲得1s的定時?可將T0定時時間定為50ms,采用中斷方式進(jìn)行溢出次數(shù)累計(jì),滿20次,則秒計(jì)數(shù)變量second加1;若秒計(jì)滿60,則分計(jì)數(shù)變量minute加1,同時將秒計(jì)數(shù)變量second清0;若分鐘計(jì)滿60,則小時計(jì)數(shù)變量hour加1;若小時計(jì)數(shù)變量滿24,則將小時計(jì)數(shù)變量hour清0。

圖7-22LCD時鐘的原理電路參考程序如下:#include<reg51.h>#include<lcd1602.h>#defineucharunsignedchar#defineuintunsignedintucharint_time; //定義中斷次數(shù)計(jì)數(shù)變量ucharsecond; //秒計(jì)數(shù)變量ucharminute; //分鐘計(jì)數(shù)變量ucharhour; //小時計(jì)數(shù)變量ucharcodedate[]="H.I.T.CHINA"; //LCD第1行顯示的內(nèi)容ucharcodetime[]="TIME23:59:55"; //LCD第2行顯示的內(nèi)容ucharsecond=55,minute=59,hour=23;84voidclock_init(){ uchari,j; for(i=0;i<16;i++) { write_data(date[i]); }write_com(0x80+0x40);for(j=0;j<16;j++) { write_data(time[j]); }}voidclock_write(uints,uintm,uinth){ write_sfm(0x47,h); write_sfm(0x4a,m); write_sfm(0x4d,s);}voidmain(){

init1602();

//LCD初始化

clock_init(); //時鐘初始化TMOD=0x01; //設(shè)置定時器T0為方式1定時EA=1; //總中斷開

ET0=1; //允許T0中斷

TH0=(65536-46483)/256; //給T0裝初值TL0=(65536-46483)%256;TR0=1;int_time=0; //中斷次數(shù)、秒、分、時單元清0second=55;minute=59;hour=23;while(1){

clock_write(second,minute,hour);}}voidT0_interserve(void)interrupt1using1 //T0中斷服務(wù)子程序{ int_time++; //中斷次數(shù)加1

if(int_time==20)

//若中斷次數(shù)計(jì)滿20次 { int_time=0; //中斷次數(shù)變量清0 second++; //秒計(jì)數(shù)變量加1 }

if(second==60)

//若計(jì)滿60s { second=0; //秒計(jì)數(shù)變量清0 minute++; //分計(jì)數(shù)變量加1 }

if(minute==60) //若計(jì)滿60分{ minute=0; //分計(jì)數(shù)變量清0 hour++; //小時計(jì)數(shù)變量加1}if(hour==24){ hour=0; //小時計(jì)數(shù)計(jì)滿24,將小時計(jì)數(shù)變量清0}TH0=(65536-46083)/256; //定時器T0重新賦值TL0=(65536-46083)%256;}本次課結(jié)束THANKS907.5AT89S52新增定時器/計(jì)數(shù)器T2簡介AT89S52與AT89S51單片機(jī)相比,新增加了一個16位定時器/計(jì)數(shù)器T2(可簡寫為T2)。與T2相關(guān)的特殊功能寄存器共有2個:T2CON和T2MOD。7.5.1T2的特殊功能寄存器T2CON和T2MOD1.特殊功能寄存器T2CONT2有3種工作方式:自動重裝載(遞增或遞減計(jì)數(shù))、捕捉和波特率發(fā)生器,由特殊功能寄存器中的控制寄存器T2CON中的相關(guān)位來進(jìn)行選擇。T2CON的字節(jié)地址為C8H,可位尋址,位地址為C8H~CFH,格式見圖7-23。圖7-23TCON格式T2CON寄存器各位的定義如下:TF2(D7):T2計(jì)數(shù)溢出中斷請求標(biāo)志位。當(dāng)T2計(jì)數(shù)溢出時,由內(nèi)部硬件置位TF2,向CPU發(fā)出中斷請求。但是當(dāng)RCLK位或TCLK位為1時將不予置位。本標(biāo)志位必須由軟件清0。EXF2(D6):T2外部中斷請求標(biāo)志位。當(dāng)由引腳T2EX上的負(fù)跳變引起“捕捉”或“自動重裝載”且EXEN2位為1,則置位EXF2標(biāo)志位,并向CPU發(fā)出中斷請求。該標(biāo)志位必須由軟件清0。RCLK(D5):串行口接收時鐘標(biāo)志位。當(dāng)RCLK位為1時,串行通信端使用T2的溢出信號作為串行通信方式1和方式3的接收時鐘;當(dāng)RCLK位為0時,使用T1的溢出信號作為串行通信方式1和方式3的接收時鐘。TCLK(D4):串行發(fā)送時鐘標(biāo)志位。當(dāng)TCLK位為1時,串行通信端使用T2的溢出信號作為串行通信方式1和方式3的發(fā)送時鐘;當(dāng)TCLK位為0時,串行通信端使用T1的溢出信號作為串行通信方式1和方式3的發(fā)送時鐘;EXEN2(D3):T2外部采樣允許標(biāo)志位。當(dāng)EXEN2位=1時,如果T2不是正工作在串行口的時鐘,則在T2EX引腳(P1.1)上的負(fù)跳變將觸發(fā)“捕捉”或“自動重裝載”操作;當(dāng)EXEN2位=0時,在T2EX引腳(P1.1)上的負(fù)跳變對T2不起作用。TR2(D2):T2啟動/停止控制位。當(dāng)軟件置位TR2時,即TR2=1,則啟動T2開始計(jì)數(shù),當(dāng)軟件清TR2位時,即TR2=0,則T2停止計(jì)數(shù)。C/(D1):T2的計(jì)數(shù)或定時方式選擇位,當(dāng)設(shè)置C/=1時,為對外部事件計(jì)數(shù)方式;C/=0時,為定時方式。CP/RL2(D0):T2捕捉/自動重裝載選擇位。當(dāng)設(shè)置CP/RL2=1時,如果EXEN2為1,則在T2EX引腳(P1.1)上的負(fù)跳變將觸發(fā)“捕捉”操作;當(dāng)設(shè)置CP/RL2=0時,如果EXEN2為1,則T2計(jì)數(shù)溢出或T2EX引腳上的負(fù)跳變都將引起自動重裝載操作;當(dāng)RCLK位為1或TCLK位為1,CP/RL2標(biāo)志位不起作用。T2計(jì)數(shù)溢出時,將迫使T2進(jìn)行自動重裝載操作。通過軟件編程對T2CON中的相關(guān)位進(jìn)行設(shè)置來選擇T2的3種工作方式:16位自動重裝載(遞增或遞減計(jì)數(shù))、捕捉和波特率發(fā)生器,如表7-2所示。2.特殊功能寄存器T2MOD與T2相關(guān)的另一個特殊功能寄存器為T2MOD。T2MOD寄存器的格式見圖7-24。T2MOD寄存器各位的定義如下:T2OE(D1):T2輸出的啟動位。

DCEN(D0):置位為1時允許T2增1/減1計(jì)數(shù),并由T2EX引腳(P1.1)上的邏輯電平?jīng)Q定是增1還是減1計(jì)數(shù)?!罕A粑弧.?dāng)單片機(jī)復(fù)位時,DCEN為0,默認(rèn)T2為增1計(jì)數(shù)方式;當(dāng)把DCEN置1時,將由T2EX引腳(P1.1)上的邏輯電平?jīng)Q定T2是增1還是減1計(jì)數(shù)。圖7-24T2MOD的格式7.5.2T2的16位自動重裝載方式T2的16位自動重裝載工作方式見圖7-25。圖中RCAP2L為陷阱寄存器低字節(jié),字節(jié)地址為CAH;RCAP2H為陷阱寄存器高字節(jié),字節(jié)地址為CBH。T2引腳為P1.0,T2EX引腳為P1.1,因此當(dāng)使用T2時,P1.0和P1.1就不能作I/O口用了。另外有兩個中斷請求,通過一個“或”門輸出。因此當(dāng)單片機(jī)響應(yīng)中斷后,在中斷服務(wù)程序中應(yīng)該用軟件識別是哪一個中斷請求,分別進(jìn)行處理,該中斷請求標(biāo)志位必須用軟件清“0”。(1)當(dāng)設(shè)置T2MOD寄存器的DCEN位為0(或上電復(fù)位為0)時,T2為增1型自動重新裝載方式,此時根據(jù)T2CON寄存器中的EXEN2位的狀態(tài),可選擇兩種操作方式:圖7-25T2的自動重裝載方式的工作示意圖①當(dāng)EXEN2標(biāo)志位清0,T2計(jì)滿溢出回0,一方面使中斷請求標(biāo)志位TF2置1,同時又將陷阱寄存器RCAP2L、RCAP2H中預(yù)置的16位計(jì)數(shù)初值自動重裝入計(jì)數(shù)器TL2、TH2中,自動進(jìn)行下一輪的計(jì)數(shù)操作,其功能與T0、T1的方式2(自動裝載)相同,只是本計(jì)數(shù)方式為16位,計(jì)數(shù)范圍大。RCAP2L、RCAP2H寄存器的計(jì)數(shù)初值由軟件預(yù)置。②當(dāng)設(shè)置EXEN2標(biāo)志位為1,T2仍具有上述①的功能,并增加了新的特性。當(dāng)外部輸入引腳T2EX(P1.1)產(chǎn)生負(fù)跳變時,能觸發(fā)三態(tài)門將RCAP2L、RCAP2H陷阱寄存器中的計(jì)數(shù)初值自動裝載到TH2和TL2中,重新開始計(jì)數(shù),并置位EXF2為1,發(fā)出中斷請求。(2)當(dāng)T2MOD寄存器的DCEN位置為1時,可以使T2既可以增1計(jì)數(shù),也可實(shí)現(xiàn)減1計(jì)數(shù),增1還是減1取決于T2EX引腳上的邏輯電平。圖7-26為T2增1/減1計(jì)數(shù)方式的結(jié)構(gòu)示意圖。圖7-26T2的增1/減1計(jì)數(shù)的工作示意圖由圖7-26可見,當(dāng)設(shè)置DCEN位為1時,可以使T2具有增1/減1計(jì)數(shù)功能。當(dāng)T2EX(P1.1)引腳為“1”時,T2執(zhí)行增1計(jì)數(shù)功能。當(dāng)不斷加1計(jì)滿溢出回0時,一方面置位TF2為1,發(fā)出中斷請求,另一方面,溢出信號觸發(fā)三態(tài)門,將存放在陷阱寄存器RCAP2L、RCAP2H中的計(jì)數(shù)初值自動裝載到TL2和TH2計(jì)數(shù)器中繼續(xù)進(jìn)行加1計(jì)數(shù)。當(dāng)T2EX(P1.1)引腳為“0”時,T2執(zhí)行減1計(jì)數(shù)功能。當(dāng)TL2和TH2計(jì)數(shù)器中的值等于陷阱寄存器RCAP2L、RCAP2H中的值時,產(chǎn)生向下溢出,一方面置位TF2為1,發(fā)出中斷請求,另一方面,下溢信號觸發(fā)三態(tài)門,將0FFFFH裝入TL2和TH2計(jì)數(shù)器中,繼續(xù)進(jìn)行減1計(jì)數(shù)。中斷請求標(biāo)志位TF2和EXF2位必須用軟件清0?!纠?-8】利用T2實(shí)現(xiàn)1秒定時并控制P1.0引腳上的LED1秒閃滅1次,晶振頻率為12MHz。編程思想:將T2設(shè)置為1/16秒的定時,定時中斷16次,即為1秒,1秒時間到后,把P1.0的狀態(tài)求反。定時初值x計(jì)算:每秒中斷16次,則每次溢出為1000000/16=62500個機(jī)器周期。因此:65536-x=62500,初值x=3036=0BDCH。說明:在中斷函數(shù)中用到了靜態(tài)變量“staticuinti”。靜態(tài)變量的特點(diǎn)是語句執(zhí)行后,其占用的的存儲單元不釋放,在下一次執(zhí)行該語句時,該變量仍為上一次的值,它只需賦一次初值。也就是說,只有在第一次進(jìn)中斷時“uinti=0”,才對i賦值,以后再進(jìn)入中斷時,不會再對i賦值。7.5.3T2的捕捉方式捕捉方式就是及時“捕捉”住輸入信號發(fā)生的跳變及有關(guān)信息。常用于精確測量輸入信號的變化如脈寬等等。捕捉方式的工作示意結(jié)構(gòu)見圖7-27。根據(jù)T2CON寄存器中EXEN2位的不同設(shè)置,“捕捉”方式有兩種選擇。(1)當(dāng)EXEN2位=0時,T2是一個16位的定時器/計(jì)數(shù)器。當(dāng)設(shè)置C/位為1時,選擇外部計(jì)數(shù)方式,即對T2引腳(P1.0)上的負(fù)跳變信號進(jìn)行計(jì)數(shù)。計(jì)數(shù)器計(jì)滿溢出時置1中斷請求標(biāo)志TF2,發(fā)出中斷請求信號。CPU響應(yīng)中斷進(jìn)入該中斷服務(wù)程序后,必須用軟件將標(biāo)志位TF2清0。其他操作均與T0和T1的工作方式1相同。(2)當(dāng)EXEN2位=1時,T2除上述功能外,還可增加“捕捉”功能。當(dāng)外部T2EX引腳(P1.1)上的信號發(fā)生負(fù)跳變,將選通三態(tài)門控制端(見圖7-27“捕捉”處),把計(jì)數(shù)器TH2和TL2中的當(dāng)前計(jì)數(shù)值分別“捕捉”進(jìn)RCAP2L和RCAP2H中,同時T2EX引腳(P1.1)上的信號負(fù)跳變將置位T2CON的的EXF2標(biāo)志位,向CPU請求中斷。圖7-27T2的捕捉方式結(jié)構(gòu)示意圖7.5.4T2的波特率發(fā)生器方式及可編程時鐘輸出T2可工作于波特率發(fā)生器方式,還可作為可編程時鐘輸出。1.波特率發(fā)生器方式T2具有專用的“波特率發(fā)生器”(波特率發(fā)生器就是控制串行口接收/發(fā)送數(shù)字信號的時鐘發(fā)生器)的工作方式。通過軟件置位T2CON寄存器中的RCLK和/或TCLK,可將T2設(shè)置為波特率發(fā)生器。需要注意的是,如果T2用于波特率發(fā)生器和T1用于別的功能,則這個接收/發(fā)送

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論