目錄
1,單片機(jī)定時(shí)器原理
2,51單片機(jī)定時(shí)器/計(jì)數(shù)器結(jié)構(gòu)
3,定時(shí)器配置?
4,示例代碼-通過定時(shí)器控制LED燈間隔1s閃爍?
51 單片機(jī)有兩組定時(shí)器/計(jì)數(shù)器,因?yàn)榧瓤梢远〞r(shí),又可以計(jì)數(shù),故稱之為定時(shí)器/計(jì)數(shù)器。
定時(shí)器/計(jì)數(shù)器和單片機(jī)的CPU 是相互獨(dú)立的。定時(shí)器/計(jì)數(shù)器工作的過程是自動(dòng)完成的,不需要CPU 的參與。
51 單片機(jī)中的定時(shí)器/計(jì)數(shù)器是根據(jù)機(jī)器內(nèi)部的時(shí)鐘或者是外部的脈沖信號(hào)對(duì)寄存器中的數(shù)據(jù)加1。
有了定時(shí)器/計(jì)數(shù)器之后,可以增加單片機(jī)的效率,一些簡單的重復(fù)加1 的工作可以交給定時(shí)器/計(jì)數(shù)器處理。CPU 轉(zhuǎn)而處理一些復(fù)雜的事情。同時(shí)可以實(shí)現(xiàn)精確定時(shí)作用。
譬如外部12MHz晶振,單片機(jī)工作在12T模式下,則內(nèi)部時(shí)鐘頻率是1MHz,則時(shí)鐘脈沖寬度為1us(1/1MHz = 1us)。如果單片機(jī)工作在6T模式下,則內(nèi)部時(shí)鐘頻率是2MHz,則時(shí)鐘脈沖寬度為0.5us(1/2MHz = 0.5us)
1,單片機(jī)定時(shí)器原理
STC89C5X 單片機(jī)內(nèi)有兩個(gè)可編程的定時(shí)/計(jì)數(shù)器T0、T1 和一個(gè)特殊功能定時(shí)器T2。定時(shí)/計(jì)數(shù)器的實(shí)質(zhì)是加1 計(jì)數(shù)器(16 位),由高8 位和低8 位兩個(gè)寄存器THx 和TLx 組成(x代表0/1/2)。它隨著計(jì)數(shù)器的輸入脈沖進(jìn)行自加1,也就是每來一個(gè)脈沖,計(jì)數(shù)器就自動(dòng)加1,當(dāng)加到計(jì)數(shù)器為全1 時(shí),再輸入一個(gè)脈沖就使計(jì)數(shù)器回零,且計(jì)數(shù)器的溢出使相應(yīng)的中斷標(biāo)志位置1,向CPU 發(fā)出中斷請(qǐng)求(定時(shí)/計(jì)數(shù)器中斷允許時(shí))。如果定時(shí)/計(jì)數(shù)器工作于定時(shí)模式,則表示定時(shí)時(shí)間已到;如果工作于計(jì)數(shù)模式,則表示計(jì)數(shù)值已滿??梢?,由溢出時(shí)計(jì)數(shù)器的值減去計(jì)數(shù)初值才是加1 計(jì)數(shù)器的計(jì)數(shù)值。
2,51單片機(jī)定時(shí)器/計(jì)數(shù)器結(jié)構(gòu)
上圖中的T0 和T1 引腳對(duì)應(yīng)的是單片機(jī)P3.4 和P3.5 管腳。51 單片機(jī)定時(shí)/計(jì)數(shù)器的工作由兩個(gè)特殊功能寄存器控制。TMOD 是定時(shí)/計(jì)數(shù)器的工作方式寄存器,確定工作方式和功能;TCON 是控制寄存器,控制T0、T1 的啟動(dòng)和停止及設(shè)置溢出標(biāo)志。
工作方式寄存器TMOD 用于設(shè)置定時(shí)/計(jì)數(shù)器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
GATE 是門控位, GATE=0 時(shí),用于控制定時(shí)器的啟動(dòng)是否受外部中斷源信號(hào)的影響。只要用軟件使TCON 中的TR0 或TR1 為1,就可以啟動(dòng)定時(shí)/計(jì)數(shù)器工作;GATA=1 時(shí),要用軟件使TR0 或TR1 為1,同時(shí)外部中斷引腳INT0/1 也為高電平時(shí),才能啟動(dòng)定時(shí)/計(jì)數(shù)器工作。即此時(shí)定時(shí)器的啟動(dòng)條件,加上了INT0/1 引腳為高電平這一條件。
C/T :定時(shí)/計(jì)數(shù)模式選擇位。C/T =0 為定時(shí)模式;C/T =1 為計(jì)數(shù)模式。
M1M0:工作方式設(shè)置位。定時(shí)/計(jì)數(shù)器有四種工作方式。
TCON 的低4 位用于控制外部中斷,已在前面介紹。TCON 的高4 位用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)和中斷申請(qǐng)。其格式如下:?
TF1(TCON.7):T1 溢出中斷請(qǐng)求標(biāo)志位。T1 計(jì)數(shù)溢出時(shí)由硬件自動(dòng)置TF1為1。CPU 響應(yīng)中斷后TF1 由硬件自動(dòng)清0。T1 工作時(shí),CPU 可隨時(shí)查詢TF1 的狀態(tài)。所以,TF1 可用作查詢測試的標(biāo)志。TF1 也可以用軟件置1 或清0,同硬件置1 或清0 的效果一樣。
TR1(TCON.6):T1 運(yùn)行控制位。TR1 置1 時(shí),T1 開始工作;TR1 置0 時(shí),T1 停止工作。TR1 由軟件置1 或清0。所以,用軟件可控制定時(shí)/計(jì)數(shù)器的啟動(dòng)與停止。
TF0(TCON.5):T0 溢出中斷請(qǐng)求標(biāo)志位,其功能與TF1 類同。
TR0(TCON.4):T0 運(yùn)行控制位,其功能與TR1 類同。?
?以方式0為例介紹單片機(jī)的工作方式:
方式0 為13 位計(jì)數(shù),由TL0 的低5 位(高3 位未用)和TH0 的8 位組成。TL0 的低5 位溢出時(shí)向TH0 進(jìn)位,TH0 溢出時(shí),置位TCON 中的TF0 標(biāo)志,向CPU發(fā)出中斷請(qǐng)求。其結(jié)構(gòu)圖如下所示:
門控位GATE 具有特殊的作用。當(dāng)GATE=0 時(shí),經(jīng)反相后使或門輸出為1,此時(shí)僅由TR0 控制與門的開啟,與門輸出1 時(shí),控制開關(guān)接通,計(jì)數(shù)開始;當(dāng)GATE=1時(shí),由外中斷引腳信號(hào)控制或門的輸出,此時(shí)控制與門的開啟由外中斷引腳信號(hào)和TR0 共同控制。當(dāng)TR0=1 時(shí),外中斷引腳信號(hào)引腳的高電平啟動(dòng)計(jì)數(shù),外中斷引腳信號(hào)引腳的低電平停止計(jì)數(shù)。這種方式常用來測量外中斷引腳上正脈沖的寬度。計(jì)數(shù)模式時(shí),計(jì)數(shù)脈沖是T0 引腳上的外部脈沖。計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:X=213-N。?
3,定時(shí)器配置?
在使用定時(shí)器時(shí),應(yīng)該如何配置使其工作?其步驟如下(各步驟順序可任意):
①對(duì)TMOD 賦值,以確定T0 和T1 的工作方式,如果使用定時(shí)器0 即對(duì)T0 配置,如果使用定時(shí)器1 即對(duì)T1 配置。
②根據(jù)所要定時(shí)的時(shí)間計(jì)算初值,并將其寫入TH0、TL0 或TH1、TL1。
③如果使用中斷,則對(duì)EA 賦值,開放定時(shí)器中斷。
④使TR0 或TR1 置位,啟動(dòng)定時(shí)/計(jì)數(shù)器定時(shí)或計(jì)數(shù)。上述中有一個(gè)定時(shí)/計(jì)數(shù)器初值的計(jì)算,下面我們來看下如何計(jì)算定時(shí)/計(jì)數(shù)器初值。
前面我們介紹過機(jī)器周期的概念,它是CPU 完成一個(gè)基本操作所需要的時(shí)間。其計(jì)算公式是:機(jī)器周期=1/單片機(jī)的時(shí)鐘頻率。51 單片機(jī)內(nèi)部時(shí)鐘頻率是外部時(shí)鐘的12 分頻,也就是說當(dāng)外部晶振的頻率輸入到單片機(jī)里面的時(shí)候要進(jìn)行12分頻。比如說你用的是12MHZ 晶振,那么單片機(jī)內(nèi)部的時(shí)鐘頻率就是12/12MHZ,當(dāng)你使用12MHZ 的外部晶振的時(shí)候,機(jī)器周期=1/1M=1us。如果我們想定時(shí)1ms的初值是多少呢?1ms/1us=1000。也就是要計(jì)數(shù)1000 個(gè),初值=65535-1000+1(因?yàn)閷?shí)際上計(jì)數(shù)器計(jì)數(shù)到65536(2 的16 次方)才溢出,所以后面要加1)=64536=FC18H,所以初值即為THx=0XFC,TLx=0X18。知道了如何計(jì)算定時(shí)/計(jì)數(shù)器初值,那么想定時(shí)多長時(shí)間都可以計(jì)算出,當(dāng)然由于定時(shí)計(jì)數(shù)器位數(shù)有限,我們不可能直接通過初值定時(shí)很長時(shí)間,如果要實(shí)現(xiàn)很長時(shí)間的定時(shí),比如定時(shí)1 秒鐘??梢酝ㄟ^初值設(shè)置定時(shí)1ms,每當(dāng)定時(shí)1ms結(jié)束后又重新賦初值,并且設(shè)定一個(gè)全局變量累計(jì)定時(shí)1ms 的次數(shù),當(dāng)累計(jì)到1000 次,表示已經(jīng)定時(shí)1 秒了。需要其他定時(shí)時(shí)間類似操作,這樣我們就可以使用定時(shí)器來實(shí)現(xiàn)精確延時(shí)來替代之前的delay 函數(shù)。這里以定時(shí)器0 為例介紹配置定時(shí)器工作方式1、設(shè)定1ms 初值,開啟定時(shí)器計(jì)數(shù)功能以及總中斷,如下:?
void time0_init(void)
{
TMOD|=0X01;//選擇為定時(shí)器0 模式,工作方式1
TH0=0XFC; //給定時(shí)器賦初值,定時(shí)1ms
TL0=0X18;
ET0=1;//打開定時(shí)器0 中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時(shí)器
}
其中ET0和EA的設(shè)置是在中斷允許寄存器IE中:
CPU 對(duì)中斷系統(tǒng)所有中斷以及某個(gè)中斷源的開放和屏蔽是由中斷允許寄存器IE 控制的。?
EA (IE.7), CPU 中斷允許(總允許)位。
ET0(IE.1),定時(shí)/計(jì)數(shù)器T0 中斷允許位。
4,示例代碼-通過定時(shí)器控制LED燈間隔1s閃爍?
#include <reg51.h>
//使用T0定時(shí)器控制LED燈間隔1s閃爍
unsigned int u16 = 0; //計(jì)數(shù)初始值
sbit led = P0^0;
void time0_ini()
{
TMOD = 0x01; //T0工作在定時(shí)模式,工作方式1:16位定時(shí)/計(jì)數(shù)器
TR0 = 1; //T0 運(yùn)行控制位,TR0 置1 時(shí),T0 開始工作
TH0 = 0xfc;
TL0 = 0x18; //按一秒時(shí)間計(jì)時(shí),先計(jì)算1ms的對(duì)應(yīng)的初值65535 - 1000 + 1 = 64536
//對(duì)應(yīng)16進(jìn)制 0xFBB4
EA = 1; //中斷總開關(guān)
ET0 = 1; //T0中斷開關(guān)
}
void time0_isr() interrupt 1 //定時(shí)器0中斷處理程序
{
u16++;
TH0 = 0xfc;
TL0 = 0x18;
if(u16 == 1000)
{
u16 = 0;
led = !led;
}
}
void main()
{
time0_ini(); //調(diào)用定時(shí)器配置函數(shù),即打開定時(shí)器和允許定時(shí)器的中斷
while(1); //主程序
}
內(nèi)部時(shí)鐘頻率是1MHz,時(shí)鐘周期是1us。最多能定65535(16位定時(shí)器),也就是說最大定時(shí)時(shí)間為65535*1us=65535us=65.535ms。
如果要定比較長的時(shí)間(譬如2s),定時(shí)器直接是不能滿足的,解決辦法是多次定時(shí)后加起來構(gòu)成一個(gè)長時(shí)間。文章來源:http://www.zghlxwxcb.cn/news/detail-557485.html
實(shí)驗(yàn)?zāi)康模?br> (1)使用定時(shí)器來完成LED閃爍;
(2)原來實(shí)現(xiàn)閃爍時(shí)中間的延遲是用delay函數(shù)實(shí)現(xiàn)的,在delay的過程中CPU要一直耗在這里不能去做別的事情。這是之前的缺點(diǎn);
(3)本節(jié)用定時(shí)器來定一個(gè)時(shí)間(譬如1s),在這個(gè)定時(shí)器定時(shí)時(shí)間內(nèi)CPU還可以去做主任務(wù),定時(shí)時(shí)間到產(chǎn)生中斷,在中斷處理程序isr中讓LED閃爍即可。?文章來源地址http://www.zghlxwxcb.cn/news/detail-557485.html
到了這里,關(guān)于單片機(jī)第一季:零基礎(chǔ)6——定時(shí)器和計(jì)時(shí)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!