新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)定時(shí)器應(yīng)用(C程序)

51單片機(jī)定時(shí)器應(yīng)用(C程序)

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
用Keil C51開發(fā)定時(shí)器/計(jì)數(shù)器
基本的51單片機(jī)內(nèi)部有兩個(gè)16位可編程的定時(shí)器/計(jì)數(shù)器T0和T1。它們各自具有4種工作狀態(tài),其控制字和狀態(tài)均在相應(yīng)的特殊功能寄存器中,可以通過(guò)軟件對(duì)控制寄存器編程設(shè)置,使其工作在不同的定時(shí)狀態(tài)或計(jì)數(shù)狀態(tài)。
現(xiàn)在,許多廠家生產(chǎn)的8051兼容單片機(jī)上,還加入了定時(shí)器/計(jì)數(shù)器2,使單片機(jī)的應(yīng)用更為靈活,適應(yīng)性更強(qiáng)。
很多8051單片機(jī)的書籍都對(duì)定時(shí)器/計(jì)數(shù)器有詳細(xì)的介紹,我們?cè)诖瞬辉僭敿?xì)地討論。但因?yàn)榫帉懟蚧蜷喿x程序時(shí)經(jīng)常要查閱定時(shí)器/計(jì)數(shù)器的設(shè)置情況,因此我們僅對(duì)一些編程時(shí)經(jīng)常要用到的較重要的寄存器和設(shè)置方式進(jìn)行簡(jiǎn)要簡(jiǎn)介。
1 定時(shí)器/計(jì)數(shù)器簡(jiǎn)介
8051單片機(jī)的定時(shí)器/計(jì)數(shù)器基本結(jié)構(gòu)如圖1-1所示,定時(shí)器T0由兩個(gè)8位計(jì)數(shù)器TH0和TL0構(gòu)成,定時(shí)器T1也由兩個(gè)8位計(jì)數(shù)器TH1和TL1構(gòu)成,TMOD寄存器控制定時(shí)器的工作方式,TCON寄存器控制定時(shí)器的啟動(dòng)和停止以及定時(shí)器的狀態(tài)。

圖1-1 定時(shí)器/計(jì)數(shù)器結(jié)構(gòu)
在作定時(shí)器使用時(shí),輸入的時(shí)鐘脈沖是由晶體振蕩器的輸出經(jīng)12分頻后得到的。實(shí)際上,定時(shí)器就是單片機(jī)機(jī)器周期的計(jì)數(shù)器。因?yàn)槊總€(gè)機(jī)器周期包含晶體振蕩器的12個(gè)振蕩周期,而每一個(gè)機(jī)器周期定時(shí)器加1,故其頻率為晶振頻率的1/12。如果晶振頻率為12MHz,則定時(shí)器每接收一個(gè)輸入脈沖的時(shí)間為1μs。
選擇計(jì)數(shù)器工作方式時(shí),計(jì)數(shù)脈沖來(lái)自相應(yīng)的外部輸入引腳T0(P3.4)或T1(P3.5)。在這種情況下,當(dāng)檢測(cè)到輸入引腳上的電平由高跳變到低時(shí),計(jì)數(shù)器就加1。
2 控制和狀態(tài)寄存器
(1)定時(shí)器控制寄存器(TCON)
TCON為定時(shí)器/計(jì)數(shù)器的控制寄存器,同時(shí)也鎖存外部中斷請(qǐng)求標(biāo)志,各位定義如下。
? TF1:定時(shí)器/計(jì)數(shù)器1中斷請(qǐng)求標(biāo)志位。當(dāng)定時(shí)器計(jì)數(shù)滿溢出回零時(shí),由硬件置位,并可申請(qǐng)中斷。當(dāng)CPU響應(yīng)中斷并進(jìn)入中斷服務(wù)程序后,TF1自動(dòng)清零。
? TR1:定時(shí)器/計(jì)數(shù)器1運(yùn)行控制位,靠軟件置位或清除。置位時(shí),定時(shí)器/計(jì)數(shù)器1接通工作,清除時(shí)停止工作。
? TF0:定時(shí)器/計(jì)數(shù)器0中斷請(qǐng)求標(biāo)志位,其功能和操作情況類同于TF1。
? TR0:定時(shí)器/計(jì)數(shù)器0運(yùn)行控制位,其功能和操作情況類同于TR1。
? IEl:外部中斷1的中斷申請(qǐng)標(biāo)志,檢測(cè)到在INT引腳上出現(xiàn)的外部中斷信號(hào)的下降沿時(shí),由硬件置位,申請(qǐng)中斷。進(jìn)入中斷服務(wù)程序后被硬件自動(dòng)清除。
? IT1:外部中斷1的類型控制位。IT1=1,由下跳沿觸發(fā);IT1=0,由低電平觸發(fā)??梢杂绍浖?lái)設(shè)置或清除。
? IE0:外部中斷0的中斷申請(qǐng)標(biāo)志。其功能和操作情況類同于IE1。
? IT0:外部中斷0的類型控制位。其功能和操作情況類同于IT1。
(2)工作方式寄存器(TMOD)。TMOD確定定時(shí)器的工作方式及功能選擇,不能位尋址。其中,高4位用于控制定時(shí)器1,低4位用于控制定時(shí)器0。TMOD各位的定義如下。
? GATE:門控位,當(dāng)GATE=1時(shí),只有?I?N?T?0或?I?N?T?1引腳為高電平,且TR0或TR1置1時(shí),定時(shí)器/計(jì)數(shù)器才工作。當(dāng)GATE=0時(shí),定時(shí)器/計(jì)數(shù)器僅受TR0或TR1的控制,而不管?I?N?T?0或?I?N?T?1引腳的電平是高還是低。
? C/?T:定時(shí)器/計(jì)數(shù)器功能選擇位,C/?T=0時(shí),設(shè)置為定時(shí)功能;C/?T=1時(shí),設(shè)置為計(jì)數(shù)功能。
? M1 M0 :工作方式選擇位。由M1M0共2位形成4種編碼,對(duì)應(yīng)以下4種工作方式。
n M1M0=00:工作方式0(13位方式)。
n M1M0=01:工作方式1(16位方式)。
n M1M0=10:工作方式2(8位自動(dòng)裝入時(shí)間常數(shù)方式)。
n MlM0=11:工作方式3(2個(gè)8位方式——僅對(duì)T0)。
3 定時(shí)器/計(jì)數(shù)器設(shè)置實(shí)例
以定時(shí)器/計(jì)數(shù)器T0為例,在方式0下,TL0的低5位和TH0的8位構(gòu)成13位計(jì)數(shù)器,因此計(jì)數(shù)工作方式時(shí),計(jì)數(shù)值的范圍是:1~8192(213)。
當(dāng)設(shè)定為定時(shí)工作方式時(shí),定時(shí)時(shí)間的計(jì)算公式為:
(213-計(jì)數(shù)初值)×晶振周期×12 或(213-計(jì)數(shù)初值)×機(jī)器周期
這樣,我們可以算出,若單片機(jī)系統(tǒng)的外接晶振頻率為6MHz,則該系統(tǒng)的最小定時(shí)時(shí)間為:
[213-(213-1)]×[1/(6×106)]×12=2×10-6=2(?s)
最大定時(shí)時(shí)間為:
(213-0)×[1/(6×106)]×12=16384×10-6=16384(?s)=16.384(ms)
或:最小定時(shí)單位×1013=16384(?s)=16.384(ms)
【例】某單片機(jī)系統(tǒng)的外接晶振頻率為6MHz,使用定時(shí)器1,以方式0定時(shí),從P1.0輸出2ms方波的計(jì)算和設(shè)置方法如下:
① 計(jì)算計(jì)數(shù)初值。欲產(chǎn)生2ms的等寬正方波脈沖,只需在P1.0端以1ms為周期交替輸出高低電平即可實(shí)現(xiàn),為此定時(shí)時(shí)間應(yīng)為1ms。使用6MHz晶振,則機(jī)器周期為:
機(jī)器周期=12/晶振頻率=12/(6×106)=2(?s)
方式0為13位計(jì)數(shù)結(jié)構(gòu)。設(shè)待求的計(jì)數(shù)初值為X,則:
(213-X)×2×10-6=1×10-3
求解得:
X=7692
化為二進(jìn)制數(shù)表示為1111000001100。
用十六進(jìn)制表示,高8位為F0H,放入TH1;低5位為0CH,放入TL1。
② TMOD寄存器初始化。為把定時(shí)器/計(jì)數(shù)器1設(shè)定為方式0,設(shè)置M1M0=00;為實(shí)現(xiàn)定時(shí)功能,應(yīng)使C/?T =0;為實(shí)現(xiàn)定時(shí)器/計(jì)數(shù)器1的運(yùn)行控制,設(shè)置GATE=0。定時(shí)器/計(jì)數(shù)器0不用,有關(guān)位設(shè)定為0。因此TMOD寄存器應(yīng)初始化為00H。
③ 由定時(shí)器控制寄存器TCON中的TR1位控制定時(shí)的啟動(dòng)和停止,TR1=1啟動(dòng),TR1=0停止。
若使其工作在方式1,定時(shí)器/計(jì)數(shù)器為16 位定時(shí)器/計(jì)數(shù)器,即加法計(jì)數(shù)器由 TH0 全部8位和TL0全部8位構(gòu)成16位,其余與方式0完全相同,因此計(jì)算TH0和TL0初值的方法也和工作方式0類似,只是需注意原來(lái)13位的地方現(xiàn)在要換成16位。
4 定時(shí)器/計(jì)數(shù)器2
8051單片機(jī)中,有一部分型號(hào)有三個(gè)定時(shí)器/計(jì)數(shù)器,如Intel的8032、Atmel的89C52、89C55、Philips的89C51RC、89C58,等等。這些單片機(jī)的第三個(gè)定時(shí)器/計(jì)數(shù)器叫T2,其控制寄存器是T2CON,它的各位定義如下:
? TF2:定時(shí)器2溢出標(biāo)志。定時(shí)器溢出時(shí)置位,并申請(qǐng)中斷,只能靠軟件清除。當(dāng)RCLK或TCLK =1 時(shí)TF2 將不會(huì)置位。
? EXF2:定時(shí)器2外部標(biāo)志。當(dāng)EXEN2為1,且T2EX 引腳上出現(xiàn)負(fù)跳變產(chǎn)生捕獲或重裝時(shí)EXF2置位,申請(qǐng)中斷。若已允許定時(shí)器2 中斷,EXF2=1 將使CPU 從中斷向量處執(zhí)行定時(shí)器2中斷子程序。EXF2 位必須用軟件清零。當(dāng)定時(shí)器/計(jì)數(shù)器2工作在向上遞增或向下遞減計(jì)數(shù)器模式(方式控制寄存器T2MOD的DCEN位=1)時(shí),EXF2 不能激活中斷。
? RCLK:接收時(shí)鐘標(biāo)志。靠軟件置位或清除。RCLK=1時(shí),用定時(shí)器2溢出脈沖作為串行口(工作于方式1或3時(shí))的接收時(shí)鐘。RCLK=0時(shí),用定時(shí)器1的溢出脈沖作為接收時(shí)鐘。
? TCLK:發(fā)送時(shí)鐘標(biāo)志。靠軟件置位或清除。TCLK=1時(shí),用定時(shí)器2溢出脈沖作為串行口(工作于方式1或3時(shí))的發(fā)送時(shí)鐘。TCLK=0時(shí),用定時(shí)器1的溢出脈沖作為發(fā)送時(shí)鐘。
? EXEN2:定時(shí)器2外部允許標(biāo)志。靠軟件置位或清除。當(dāng)EXEN2=1時(shí),如果定時(shí)器2未用作串行口的波特率發(fā)生器,在T2EX端出現(xiàn)負(fù)跳變脈沖時(shí),激活定時(shí)器2捕獲或重裝,并置EXF2標(biāo)志為1,請(qǐng)求中斷。EXEN2=0時(shí),T2EX端的外部信號(hào)無(wú)效。
? TR2:定時(shí)器2啟動(dòng)/停止控制位。靠軟件置位或清除。TR2=1時(shí),啟動(dòng)定時(shí)器2,否則停止。
? C/?T?2:定時(shí)器2定時(shí)方式或計(jì)數(shù)方式控制位。C/?T?2=0,選擇定時(shí)方式;C/?T?2=1時(shí),選擇對(duì)外部計(jì)數(shù)方式(下降沿觸發(fā))。
? CP/?R?L?2:捕獲/重裝載選擇。CP/?R?L?2=1時(shí),如果EXEN2=1,且T2EX端出現(xiàn)負(fù)跳變脈沖時(shí)發(fā)生捕獲操作,即把TH2和TL2的內(nèi)容傳遞給RCAP2H和RCAP2L。CP/?R?L?2=0時(shí),若定時(shí)器2溢出或EXEN2=1,T2EX端出現(xiàn)負(fù)跳變脈沖,會(huì)出現(xiàn)重裝載操作,即把RCAP2H和RCAP2L的內(nèi)容傳遞給TH2和TL2。當(dāng)RCLK=1或TCLK=1時(shí),該位無(wú)效,在定時(shí)器2溢出時(shí)強(qiáng)制其自動(dòng)重裝載。
通過(guò)軟件設(shè)置T2CON,可使定時(shí)/計(jì)數(shù)器以三種基本工作方式之一工作。第一種為捕捉方式。設(shè)置為捕捉方式時(shí),和定時(shí)器0 或定時(shí)器1 一樣以16 位方式工作。這種方式通過(guò)復(fù)位EXEN2來(lái)選擇。當(dāng)置位EXEN2時(shí),如果T2EX有負(fù)跳變電平,將把當(dāng)前的數(shù)鎖存在(RCAP2H和RCAP2L)中。這個(gè)事件可用來(lái)產(chǎn)生中斷。
第二種工作方式為自動(dòng)重裝方式,其中包含了兩個(gè)子功能,由EXEN2來(lái)選擇,當(dāng)EXEN2復(fù)位時(shí),16 位定時(shí)器溢出將觸發(fā)一個(gè)中斷并將RCAP2H 和RCAP2L 中的數(shù)裝入定時(shí)器中。當(dāng)EXEN2 置位時(shí),除上述功能外,T2EX 引腳的負(fù)跳變將產(chǎn)生一次重裝操作。
最后一種方式用來(lái)產(chǎn)生串行口通信所需的數(shù)據(jù)傳輸率,這通過(guò)同時(shí)或分別置位RCLK 和TCLK來(lái)實(shí)現(xiàn)。在這種方式中,每個(gè)機(jī)器周期都將使定時(shí)器加1,而不像定時(shí)器0 和1 那樣,需要12個(gè)機(jī)器周期。這使得串行通信的數(shù)據(jù)傳輸率更高。
定時(shí)器2還有一個(gè)不可尋址的方式控制寄存器T2MOD,其內(nèi)容如下:
? —:保留位。
? T2OE:定時(shí)器2輸出允許位。
? DCNE:置位時(shí),允許定時(shí)器2作為向上/向下計(jì)數(shù)器。
5 編程實(shí)例
【例1】這是一個(gè)簡(jiǎn)單的定時(shí)器程序,由一個(gè)循環(huán)組成,在點(diǎn)亮接在P1.0 口的LED之后,延時(shí)一段時(shí)間,再滅掉LED,又延時(shí)一段時(shí)間,之后循環(huán)到前面。按全速運(yùn)行,可以看到P1.0口上接的LED 燈不斷地閃爍。
#include //包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件
sbit P10 = P1^0; //要控制的LED燈
sbit K1= P3^2; //按鍵K1
//用定時(shí)器中斷閃爍LED
void main(void) //主程序
TMOD=0x01; //定時(shí)器0,16位工作方式
TR0=1; //啟動(dòng)定時(shí)器
ET0=1; //打開定時(shí)器0中斷
EA=1; //打開總中斷
while(1) //程序循環(huán)
; //主程序在這里就不斷自循環(huán),實(shí)際應(yīng)用中,這里是做主要工作
//定時(shí)器0中斷
timer0() interrupt 1 // 定時(shí)器0中斷是1號(hào)
TH0=0x00; //寫入定時(shí)器0初始值0x0005
TL0=0x06;
P10=~P10; //反轉(zhuǎn)LED燈的亮和滅
程序中,使用了定時(shí)器0,工作在方式1,即16位工作方式。
【例2】這是一個(gè)跑馬燈程序,使用了定時(shí)器2。
#include //包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件
sbit P10 = P1^0; //頭文件中沒(méi)有定義的IO就要自己來(lái)定義了
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
bit ldelay=0; //長(zhǎng)定時(shí)溢出標(biāo)記,預(yù)置是0
//定時(shí)器中斷方式的跑馬燈
void main(void) //主程序
unsigned char code ledp[4]={0xfe,0xfd,0xfb,0xf7};//預(yù)定的寫入P1的值
unsigned char ledi; //用來(lái)指示顯示順序
RCAP2H =0x10; //賦T2的預(yù)置值0x1000,溢出30次就是1秒鐘
RCAP2L =0x00;
TR2=1; //啟動(dòng)定時(shí)器
ET2=1; //打開定時(shí)器2中斷
EA=1; //打開總中斷
while(1) //主程序循環(huán)
if(ldelay) //發(fā)現(xiàn)有時(shí)間溢出標(biāo)記,進(jìn)入處理
ldelay=0; //清除標(biāo)記
P1=ledp[ledi]; //讀出一個(gè)值送到P1口
ledi++; //指向下一個(gè)
if(ledi==4)ledi=0; //到了最后一個(gè)燈就換到第一個(gè)
//定時(shí)器2中斷
timer2() interrupt 5 // 中斷向量是5
static unsigned char t;
TF2=0;
t++;
if(t==30) //T2的預(yù)置值0x1000,溢出30次就是1秒鐘,晶振22.118400 MHZ
t=0;
ldelay=1; //每次長(zhǎng)時(shí)間的溢出,就置一個(gè)標(biāo)記,以便主程序處理



評(píng)論


技術(shù)專區(qū)

關(guān)閉