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