8051單片機(jī)內(nèi)部有兩個定時/計(jì)數(shù)器T0及T1,具有定時和計(jì)數(shù)兩種功能。T0及T1在計(jì)數(shù)過程中不需要CPU參與,也不影響CPU的其他工作。當(dāng)計(jì)數(shù)溢出后,定時/計(jì)數(shù)器給出中斷信號,申請CPU停止當(dāng)前的工作,去處理預(yù)先設(shè)定的中斷事件。
一、T1內(nèi)部結(jié)構(gòu)
定時器工作模式:對內(nèi)部時鐘信號計(jì)數(shù)。由于時鐘頻率是定值,所以可根據(jù)計(jì)數(shù)值計(jì)算出定時時間。
計(jì)數(shù)器工作模式:是對加在T1(P3.5)引腳上的外部脈沖進(jìn)行計(jì)數(shù)。
二、計(jì)數(shù)功能
計(jì)數(shù)器用于統(tǒng)計(jì)從TO(P3.4)和Tl(P3.5)兩個引腳輸入脈沖的負(fù)跳變數(shù)量。負(fù)跳變是指前一個機(jī)器周期采樣為高電平,后一個機(jī)器周期為低電平。每輸入一個脈沖負(fù)跳變,計(jì)數(shù)器加1。
輸入脈沖的高電平與低電平至少應(yīng)保持一個機(jī)器周期時間,以確保正確采樣,因此輸入脈沖的頻率最高為單片機(jī)內(nèi)部脈沖頻率的一半。如果內(nèi)部脈沖頻率為1 MHZ,則最高計(jì)數(shù)頻率為0.5 MHz。
三、定時功能
定時功能是單片機(jī)通過對內(nèi)部機(jī)器脈沖信號計(jì)數(shù)實(shí)現(xiàn)的,計(jì)數(shù)值乘以機(jī)器周期就是相應(yīng)的時間。例如,如果單片機(jī)采用12 MHz的晶振,則機(jī)器內(nèi)部脈沖頻率為1 MHz,則機(jī)器周期為1us,若共計(jì)數(shù)1000,則用時為1ms時間。
四、工作方式
工作方式寄存器TMOD
工作方式寄存器TMOD用于控制定時/計(jì)數(shù)器的工作方式和工作模式,長度為一個字節(jié),只能按字節(jié)整體賦值。
(1)Ml和M0用于設(shè)置TO(T1)的工作方式。
(2)C/T用于設(shè)置TRO(TR1)是工作于計(jì)數(shù)器或定時器模式。
C/T—計(jì)數(shù)器模式和定時器模式選擇位
0:定時器工作模式,對單片機(jī)的晶體振蕩器12分頻后的脈沖進(jìn)行計(jì)數(shù)。
1:計(jì)數(shù)器工作模式,計(jì)數(shù)器對外部輸入引腳T0(P3.4)或T1(P3.5)的外部脈沖(負(fù)跳變)計(jì)數(shù)。
(3)GATE(門控制位)用于設(shè)置TO(T1)的啟動方式。
GATE—門控位。
0:僅由運(yùn)行控制位TRx(x =0,1)來控制定時器/計(jì)數(shù)器運(yùn)行。
1:用外中斷引腳INT0(或INT1 )上的電平與運(yùn)行控制位TRx共同來控制定時器/計(jì)數(shù)器運(yùn)行。
例:設(shè)定時器1為定時工作方式,按方式2工作,定時器0為計(jì)數(shù)方式,按方式1工作,均由程序單獨(dú)控制啟動和停止,請給出TMOD控制字。
解:
定時器1做定時器使用則D6=0;按方式2工作則D5=1,D4=0;
由程序單獨(dú)控制啟停則D7=0 。
定時器0做計(jì)數(shù)器使用則D2=1;按方式1工作則D0=0,D1=1;
由程序單獨(dú)控制啟停則D3=0。
因此命令字TMOD的值應(yīng)為00100101B,即25H。
定時器控制寄存器TCON (Timer controller)
TCON也是8位寄存器,與TMOD不同的是它可按位單獨(dú)賦值,其各位的意義見下表。
1、TF1、TF0—計(jì)數(shù)溢出標(biāo)志位。
當(dāng)計(jì)數(shù)器計(jì)數(shù)溢出時,該位置“1”。
使用中斷方式時,此位作為中斷請求標(biāo)志位,標(biāo)志位由硬件自動清“0”。使用查詢方式時,應(yīng)注意查詢有效后使用軟件及時將該位清“0”。
2、TR1、TR0—計(jì)數(shù)運(yùn)行控制位。
TR1位(或TR0位)=1,啟動定時器/計(jì)數(shù)器工作的必要條件。
TR1位(或TR0位)=0,停止定時器/計(jì)數(shù)器工作。
4.1、工作方式0
方式0是13位的定時/計(jì)數(shù)器,它由TL的低5位和TH的8位構(gòu)成。
4.2、工作方式1
方式1是16位的定時/計(jì)數(shù)器,由TH的8位和TL的8位構(gòu)成。方式0和方式1的工作原理基本相同。
方式0和方式1的特點(diǎn):
T1啟動后,在TL1和TH1中存儲的計(jì)數(shù)初值基礎(chǔ)上進(jìn)行加“1”計(jì)數(shù),直至溢出。溢出時T1寄存器被清零,TF1被置位,并申請中斷。此后,若T1重新啟動,則從零重新開始計(jì)數(shù)。若希望T1從某一數(shù)值開始計(jì)數(shù),則應(yīng)給計(jì)數(shù)器賦初值。
若所需計(jì)數(shù)長度為N,則計(jì)數(shù)初值X=2M-N(1≤N≤2M),其中當(dāng)工作于方式0時,M=13,當(dāng)工作于方式1時,M=16。在為計(jì)數(shù)器賦初值時,應(yīng)將初值拆成高低兩部分字節(jié),分別送入TL1和TH1。
實(shí)例:欲采用8051單片機(jī)控制8個LED同時以1s為周期閃爍,設(shè)計(jì)電路原理圖并編寫程序。
設(shè)置定時/計(jì)數(shù)器的過程:
1)先初始化工作方式寄存器TMOD
2)為定時/計(jì)數(shù)器賦初值
3)通過控制寄存器TCON中的TRO或TRl實(shí)現(xiàn)啟動或停止。
#include // 將8051單片機(jī)頭文件包含到文件中
main(void )
{
unsigned char counter; //設(shè)置無符號字符型變量,存儲定時器中斷次數(shù)。
TMOD=0x01; //設(shè)T0為定時模式,由TR0控制啟動和停止,且工作于方式1
TH0=(65536-46083)/256; //初始化T0的高8位
TL0=(65536-46083)%256; //初始化T0的低8位
TF0=0; //初始化定時器溢出標(biāo)志
P0=0xff; //關(guān)閉LED
counter=0; //從0開始計(jì)數(shù)
TR0=1; //啟動定時器0
while(1)
{
while(TF0==1) //如果定時器溢出
{
counter++; //計(jì)時次數(shù)加1
if(counter==20) //計(jì)時時間達(dá)到1s
{
P0=~P0; // P0所有位取反,使LED閃爍
counter=0; //重新從0開始計(jì)數(shù)
}
TH0=(65536-46083)/256; //重新初始化T0的高8位
TL0=(65536-46083)%256; //重新初始化T0的低8位
TF0=0; //重新初始化定時器溢出標(biāo)志
}
}
}
方式0和方式1的特點(diǎn):
T1啟動后,在TL1和TH1中存儲的計(jì)數(shù)初值基礎(chǔ)上進(jìn)行加“1”計(jì)數(shù),直至溢出。溢出時T1寄存器被清零,TF1被置位,并申請中斷。此后,若T1重新啟動,則從零重新開始計(jì)數(shù)。若希望T1從某一數(shù)值開始計(jì)數(shù),則應(yīng)給計(jì)數(shù)器賦初值。
若所需計(jì)數(shù)長度為N,則計(jì)數(shù)初值X=2M-N(1≤N≤2M),其中當(dāng)工作于方式0時,M=13,當(dāng)工作于方式1時,M=16。在為計(jì)數(shù)器賦初值時,應(yīng)將初值拆成高低兩部分字節(jié),分別送入TL1和TH1。
實(shí)例:欲采用8051單片機(jī)控制8個LED同時以1s為周期閃爍,設(shè)計(jì)電路原理圖并編寫程序。
設(shè)置定時/計(jì)數(shù)器的過程:
1)先初始化工作方式寄存器TMOD
2)為定時/計(jì)數(shù)器賦初值
3)通過控制寄存器TCON中的TRO或TRl實(shí)現(xiàn)啟動或停止。
#include // 將8051單片機(jī)頭文件包含到文件中
main(void )
{
unsigned char counter; //設(shè)置無符號字符型變量,存儲定時器中斷次數(shù)。
TMOD=0x01; //設(shè)T0為定時模式,由TR0控制啟動和停止,且工作于方式1
TH0=(65536-46083)/256; //初始化T0的高8位
TL0=(65536-46083)%256; //初始化T0的低8位
TF0=0; //初始化定時器溢出標(biāo)志
P0=0xff; //關(guān)閉LED
counter=0; //從0開始計(jì)數(shù)
TR0=1; //啟動定時器0
while(1)
{
while(TF0==1) //如果定時器溢出
{
counter++; //計(jì)時次數(shù)加1
if(counter==20) //計(jì)時時間達(dá)到1s
{
P0=~P0; // P0所有位取反,使LED閃爍
counter=0; //重新從0開始計(jì)數(shù)
}
TH0=(65536-46083)/256; //重新初始化T0的高8位
TL0=(65536-46083)%256; //重新初始化T0的低8位
TF0=0; //重新初始化定時器溢出標(biāo)志
}
}
4.3、工作方式2
方式2的特點(diǎn)是能自動加載計(jì)數(shù)初值。16位計(jì)數(shù)器被分為兩部分,以TL0作為計(jì)數(shù)器,以TH0作為存儲器。初始化時把計(jì)數(shù)初值分別加載至TL0和TH0中,當(dāng)計(jì)數(shù)溢出時,由存儲器TH0自動給計(jì)數(shù)器TL0加載計(jì)數(shù)初值。若所需計(jì)數(shù)長度為N,則計(jì)數(shù)初值X=28-N(1≤N≤256)。
實(shí)例:下圖是產(chǎn)品包裝生產(chǎn)線的計(jì)數(shù)系統(tǒng),每個產(chǎn)品經(jīng)過計(jì)數(shù)裝置時由機(jī)械桿碰合按鍵S1一次。當(dāng)?shù)谝淮斡?jì)滿一包(5個)則D1亮,計(jì)滿第二包則D2亮…,計(jì)滿第八包則D1~D8全亮,八包包裝成一箱,此后重復(fù)以上過程。編寫程序?qū)崿F(xiàn)此功能。
#include // 包含51單片機(jī)寄存器定義的頭文件
unsigned char counter; //計(jì)數(shù)初值
main(void )
{
TMOD=0x60; //使用T1的工作方式2
TH1=256-5; // T1的高8位賦初值
TL1=256-5; // T1的低8位賦初值
counter=0;
TR1=1; //啟動T1
while(1)
{
while(TF1==1) //如果計(jì)滿
{
TF1=0; //計(jì)數(shù)器溢出后,將TF1清0
counter++; //計(jì)數(shù)加1
switch (counter) //檢查中斷計(jì)數(shù)值
{
case 1: P0=0xfe; break; //則第1個燈亮
case 2: P0=0xfd; break; //第2個燈亮
case 3: P0=0xfb; break; //第3個燈亮
case 4: P0=0xf7; break; //第4個燈亮
case 5: P0=0xef; break; //第5個燈亮
case 6: P0=0xdf; break; //第6個燈亮
case 7: P0=0xbf; break; //第7個燈亮
case 8: P0=0x00; counter=0; break; //8個燈全亮
}
}
}
}
4.4、工作模式3
TO被拆成兩個獨(dú)立的8位計(jì)數(shù)器TLO和THO,TL0獨(dú)占T0的各控制位、引腳和中斷源,既可以用作定時器也可作計(jì)數(shù)器。TH0只能作為定時器使用,且需要占用T1的控制位TR1和TF1實(shí)現(xiàn)啟停和中斷。
兩個定時/計(jì)數(shù)器的使用方法與方式0或1相似。工作方式3只適用于T0,不適用于T1。若將T1強(qiáng)行設(shè)置為模式3,將使T1立即停止計(jì)時或計(jì)數(shù),相當(dāng)于使TR1=0。
當(dāng)T0作方式3時,T1仍可以設(shè)置為除工作方式3外的其它工作方式,但由于它的TR1和TF1已被T0占用,因此無法按正常計(jì)時/計(jì)數(shù)器工作,常用于串行通信時的波特率發(fā)生器,以控制傳輸數(shù)據(jù)的速度。
單片機(jī)的P0口接了8個發(fā)光二極管,要求使用定時器T0中斷實(shí)現(xiàn)流水燈操作,流水頻率為每0.5秒鐘更替一次(假設(shè)單片機(jī)外接11.0592MHz的晶振)。
#include
unsigned char cnt=0; //用于中斷次數(shù)計(jì)數(shù)
unsigned char led =0xfe; //初始化流水燈
int main(void)
{
TMOD=0x01; //16位定時方式
TH0=(65536-46083)/256; //初始化T0的高8位
TL0=(65536-46083)%256; //初始化T0的低8位
EA=1;
ET0=1; //開中斷
TR0=1; //啟動T0工作
while(1);
}
void T0_int(void) interrupt 1
{
cnt++;
if( cnt==10 ) //0.5秒鐘的時間到了
{
cnt=0; //清除次數(shù)統(tǒng)計(jì)
led =(led <<1)|1; //更新流水燈數(shù)據(jù)
if(led ==0xff)
{
led =0xfe;
}
P0=led; //顯示流水燈
}
TH0=(65536-46083)/256; //初始化T0的高8位
TL0=(65536-46083)%256; //初始化T0的低8位
}
-
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2284瀏覽量
96032 -
定時器
+關(guān)注
關(guān)注
23文章
3288瀏覽量
117223 -
8051單片機(jī)
+關(guān)注
關(guān)注
5文章
153瀏覽量
25882
發(fā)布評論請先 登錄
80C51單片機(jī)定時器/計(jì)數(shù)器詳解(含工作方式)

51單片機(jī)的定時器和計(jì)數(shù)器的原理及應(yīng)用實(shí)例詳細(xì)資料說明

51單片機(jī)的定時器和計(jì)數(shù)器詳細(xì)資料介紹和應(yīng)用程序免費(fèi)下載

使用51單片機(jī)定時器和計(jì)數(shù)器實(shí)現(xiàn)定時的實(shí)例說明

51單片機(jī)的定時器和計(jì)數(shù)器的使用資料詳細(xì)說明

51單片機(jī)的定時器和計(jì)數(shù)器的功能實(shí)現(xiàn)資料說明

51單片機(jī)的定時器和計(jì)數(shù)器詳細(xì)資料說明

基于51單片機(jī)的定時器和計(jì)數(shù)器硬件設(shè)計(jì)
【51單片機(jī)】定時器/計(jì)數(shù)器的工作原理和結(jié)構(gòu)(一)

51單片機(jī)定時器、計(jì)數(shù)器配置

51單片機(jī)的定時器與計(jì)數(shù)器

51單片機(jī)定時器/計(jì)數(shù)器

51單片機(jī)——定時器/計(jì)數(shù)器

51單片機(jī)的定時器/計(jì)數(shù)器接口

51單片機(jī)——定時器和計(jì)數(shù)器

評論