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