使用單片機(jī)時(shí),編程會(huì)高頻率用到延時(shí),如led燈閃爍,蜂鳴器長(zhǎng)短鳴,秒表應(yīng)用等等。首先考慮軟件延時(shí),但這個(gè)時(shí)間不精確,占用硬件資源。使用延時(shí)函數(shù)是,其他函數(shù)不能運(yùn)行。這個(gè)方案cut掉。硬件延時(shí),嗯,誤差非常小。但成本較高,且參數(shù)調(diào)節(jié)不便。這個(gè)也不行。選擇采用定時(shí)器調(diào)節(jié)時(shí)間,不占用cpu時(shí)間,能與CPU并行工作,實(shí)現(xiàn)精確的定時(shí)和計(jì)數(shù)。又可以通過(guò)編程設(shè)置其他工作方式和其他參數(shù),因此使用非常方便。下面介紹定時(shí)器的使用。
概述
定時(shí)器系統(tǒng)是單片機(jī)內(nèi)部一個(gè)獨(dú)立的硬件部分,它與cpu和晶振通過(guò)內(nèi)部某些控制線連接并相互作用,cpu一旦設(shè)置開(kāi)啟定時(shí)功能后,定時(shí)器便在晶振的作用下自動(dòng)計(jì)時(shí),但定時(shí)器的計(jì)數(shù)器計(jì)滿后,會(huì)產(chǎn)生中斷。計(jì)數(shù)時(shí)間一次為12/晶振頻率。在晶振頻率為11.0595mhz時(shí),計(jì)數(shù)一次時(shí)間約等于1.09us。
89c52單片機(jī)定時(shí)器系統(tǒng)有三個(gè)定時(shí)器/計(jì)數(shù)器,分別是定時(shí)器T0,定時(shí)器T1,T2定時(shí)器。他們既有定時(shí)器功能,也有計(jì)數(shù)器功能。T0,T1有四種工作方式,T2有三種工作模式。
內(nèi)部結(jié)構(gòu)
定時(shí)器結(jié)構(gòu)
由上圖可知,定時(shí)器系統(tǒng)有兩個(gè)寄存器組成,分別是TCON,TMOD。還可看出tcon控制外部中斷,tmod控制定時(shí)器工作方式。tmod寄存器分為兩部分,高四位為t1定時(shí)器控制位,低四位為t0定時(shí)器控制位。t0定時(shí)器與th0,tl0兩個(gè)8位計(jì)數(shù)器有關(guān),。t1定時(shí)器與th1,tl1兩個(gè)8位計(jì)數(shù)器有關(guān)。上圖信息就這么多,接下來(lái)看看兩個(gè)寄存器相關(guān)數(shù)據(jù)。
寄存器TCON
寄存器TCON
TF1:定時(shí)器 1 溢出標(biāo)志。當(dāng)定時(shí)器/計(jì)數(shù)器 1 溢出時(shí),由 硬件置位;當(dāng)主機(jī)響應(yīng)中斷,
轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件清零。
TR1:定時(shí)器 1 運(yùn)行控制位, 由軟件置位/ 復(fù)位來(lái)開(kāi)啟或關(guān)閉定時(shí)器/計(jì)數(shù)器 1。
TF0:定時(shí)器 0 溢出標(biāo)志。當(dāng)定時(shí)器/計(jì)數(shù)器 0 溢出時(shí),由 硬件置位;當(dāng)主機(jī)響應(yīng)中斷,
轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件清零。
TR0:定時(shí)器 0 運(yùn)行控制位,由 軟件置位/ 復(fù)位來(lái)開(kāi)啟或關(guān)閉定時(shí)器/計(jì)數(shù)器 0。
IE1:外部中斷 1 跳變中斷請(qǐng)求標(biāo)志,當(dāng)檢測(cè)到 INT1 發(fā)生 1 到 0 的跳變時(shí),由硬件置位;當(dāng)主機(jī)響應(yīng)中斷, 轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件清零。
IT1:外部中斷 1 觸發(fā)方式控制位,由 軟件置位或清零來(lái)選擇外部中斷 1 的跳變/電平觸發(fā)中斷請(qǐng)求。IT1=0 時(shí),外部中斷 1 為電平觸發(fā)方式,當(dāng) INT1 輸入低電平時(shí),置位 IE1。
采用電平觸發(fā)方式時(shí),外部中斷源必須保持低電平有效,直到該中斷被 CPU 響應(yīng),同時(shí)在該中斷服務(wù)程序執(zhí)行完之前,外部中斷源必須被清除,否則將產(chǎn)生另一次中斷。IT1=1 時(shí),外部中斷 1 為邊沿觸發(fā)方式,在對(duì) INT1 的相鄰兩次采樣中,如果一個(gè)周期中為高電平,接下來(lái)的周期為低電平,則置位 IE1,表示外部中斷 1 正在向 CPU 申請(qǐng)中斷。直到該中斷被CPU 響應(yīng)時(shí),才被 硬件清零。
IE0:外部中斷 0 跳變中斷請(qǐng)求標(biāo)志,當(dāng)檢測(cè)到 INT1 發(fā)生 1 到 0 的跳變時(shí),由硬件置位;當(dāng)主機(jī)響應(yīng)中斷, 轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件清零。
IT0:外部中斷 0 觸發(fā)方式控制位,應(yīng)用同 IT1。
這個(gè)寄存器與中斷有關(guān),支持位尋址,就是可以對(duì)其每一位進(jìn)行單獨(dú)操作。定時(shí)器工作就是在一個(gè)特定的間隔(與晶振有關(guān))加1,等到加到定時(shí)器溢滿時(shí),會(huì)觸發(fā)外部中斷。這兩個(gè)定時(shí)器都是16位可編程定時(shí)器/計(jì)數(shù)器。最大可裝2的16次方。,就是65535.,定時(shí)器在晶振為11.0592MHZ時(shí),間隔約等于1.09us。
(關(guān)于中斷的知識(shí)在上一篇文章有詳細(xì)介紹,在這里就不累贅。)
寄存器TMOD
寄存器TMOD
GATE:門控制位,當(dāng) GATEx=1 時(shí),控制寄存器 TCON 的 TRx=1(x=0 或 1)。當(dāng) GATEx=0 時(shí),定時(shí)器啟動(dòng)與停止僅受寄存器中的TRx來(lái)控制(x=0 或 1)。
C / :定時(shí)器、計(jì)數(shù)器方式選擇位,該位為 1 時(shí)為計(jì)數(shù)器,為 0 時(shí)為定時(shí)器。
M0:定時(shí)器/計(jì)數(shù)器工作模式選擇位。
M1:定時(shí)器/計(jì)數(shù)器工作模式選擇位。
注:高四位是T1定時(shí)器控制位,低四位是T0定時(shí)器控制位
工作方式如下圖所示
4種工作方式
這個(gè)寄存器是控制定時(shí)器的工作方式與哪個(gè)定時(shí)器工作。tmod寄存器支持位尋址,編程時(shí)只可以是總線式,不可以單個(gè)控制。因?yàn)閮蓚€(gè)定時(shí)器命名一樣,單個(gè)控制會(huì)弄混。下面示范寫法:
TMOD=0X01; // 0000 0001?
可以看出只有最低位為1,即T0定時(shí)器的M0=1;對(duì)照上圖數(shù)據(jù)可知,這是使用T0定時(shí)器的定時(shí)功能中的工作方式1,就是16位定時(shí)器。
TMOD=0X20; //0010 0000
這個(gè)看數(shù)據(jù)手冊(cè)得知是T1定時(shí)器的定時(shí)功能中的工作方式2,即具有自動(dòng)重載的8位定時(shí)器。
附:定時(shí)器使用需要用到中斷,這里將中斷的中斷源優(yōu)先級(jí)放在下面。
中斷源優(yōu)先級(jí)
定時(shí)器使用
中斷函數(shù)
在介紹定時(shí)器使用時(shí),先介紹中斷函數(shù),C51的中斷格式如下
void 函數(shù)名()iinterrupt 工作組
{
中斷內(nèi)容;
}
中斷函數(shù)不能返回值,所以前綴為void,函數(shù)名可以任意取,但一般建議使用有意義的名字,到時(shí)候檢查也可以明白是什么函數(shù),interrupt是c語(yǔ)言中的一個(gè)關(guān)鍵字--中斷,記住就行。工作組就是對(duì)應(yīng)中斷源,比如說(shuō),使用T1定時(shí)器,那中斷源就是定時(shí)器1中斷,這時(shí)工作組就是3。下面示范:
void timer_t1() interrupt 3
{
TH1=(0XE0);
TL1=(0X07);
}
上面這個(gè)實(shí)例很容易理解,對(duì)著手冊(cè)看就知道是T1定時(shí)器中斷。
定時(shí)器初值計(jì)算
中斷函數(shù)明白后,如何定時(shí)還是不清楚。開(kāi)啟定時(shí)器后,定時(shí)器就會(huì)開(kāi)始計(jì)數(shù),每次加1的間隔是固定的,而且到達(dá)最大值就會(huì)溢出,觸發(fā)中斷。這樣子的話我們可以設(shè)定一個(gè)初值,初值到最大值的時(shí)間假設(shè)為50ms,那樣的話定是的效果就達(dá)到了。定時(shí)器加1時(shí)間間隔約等于1.09us,定時(shí)器在沒(méi)有賦值時(shí)默認(rèn)初值為0,最大值為65535,計(jì)算可得655351.09us約等于72ms,沒(méi)有賦初值一次定時(shí)最大為72ms??梢栽O(shè)置一個(gè)初值,就拿50ms來(lái)說(shuō),501000/1.09約等于45872,也就是說(shuō)經(jīng)過(guò)45872次計(jì)數(shù)時(shí)間為50ms,那初值就是65535-45872=19663。
大概了解定時(shí)器,來(lái)看看如何使用,定時(shí)器是由16位可編程寄存器組成,分為高8位,即THX(X=1或X=0)低8位TLX(X=1或X=0)。為了更好定時(shí),肯定會(huì)選擇賦初值。這里介紹一種簡(jiǎn)單的方法,不用計(jì)算。既然它們分為兩部分,可以利用這一特點(diǎn)。舉個(gè)例子:
選擇10ms時(shí)間,T1定時(shí)器。這里以晶振為12MHZ為準(zhǔn),因?yàn)?1.0592MHZ計(jì)算麻煩,這樣計(jì)數(shù)一次就是1us;
TH1=(65535-10000)/256;//表示初值為55535,/256表示高8位的初值,很好理解,低 8位最多存2的8次方=256個(gè)數(shù),每滿一次高8位加1, /256表示高8位加了多少次。
TL1=(65535-10000)%256;// %256表示不滿256最后留下的數(shù)。
使用步驟
計(jì)算知道后,來(lái)看看定時(shí)器使用步驟:
對(duì)TMOD賦值,確定T0和T1的工作方式
計(jì)算初值,賦值TH0,TL0或TH1,TH1
對(duì)IE賦值,啟動(dòng)中斷
TR0或TR1置位,啟動(dòng)定時(shí)器
處理中斷函數(shù),定時(shí)器中斷后變成默認(rèn)值0,要重新賦初值
例程
#inlclude???//頭文件
sbit?led=P1^1;???//位定義
mian()??//主函數(shù)
{
????unsigned?char?count;??定義計(jì)數(shù)次數(shù)變量
????TMOD=0X01;???//設(shè)置定時(shí)器T0?定時(shí)器功能?工作模式1
????TH0=(65536-50000)/256;?????//賦初值???50ms
????TL0=(65536-50000)%256;
????EA=1;???//打開(kāi)總中斷
????ET0=1;??//開(kāi)定時(shí)器0中斷
????TR0=1;??//啟動(dòng)定時(shí)器?
}
void?timer_t0()?intterrupt?1
{
????TH0=(65536-50000)/256;????//重新賦值
????TL0=(65536-50000)%256;
????count++;?????//每中斷一次加1
????if(count==20)??//count==20時(shí),說(shuō)明1秒到
????{
????????count=0;??//count清零,重新等待1秒的到來(lái)
????????led=~led;???//led狀態(tài)取反
????}
}
上面注釋已經(jīng)很清楚,按照步驟來(lái),一步一步設(shè)置參數(shù),基本不會(huì)出錯(cuò)。在中斷函數(shù)中設(shè)置一個(gè)標(biāo)志位,中斷變化,變化成何值時(shí),再狀態(tài)變化?;揪褪沁@個(gè)套路。給個(gè)建議,中斷函數(shù)不要寫太多東西,不然會(huì)出錯(cuò)。試想一下,假如進(jìn)入中斷需5ms,但在中斷函數(shù)中命令要運(yùn)行10ms,命令沒(méi)有運(yùn)行完,又進(jìn)入中斷,就會(huì)出錯(cuò)。
總結(jié)
定時(shí)器就這樣子,不會(huì)很難,一些命令在數(shù)據(jù)手冊(cè)都有,忘記了就重新看一下,寫多了就會(huì)記住·,重要的是記住步驟,記住編程思想,在寫之前在腦中想一下步驟,或在紙上把思路畫一下,那里不通就會(huì)躍然于紙上,再稍加思索一般就行了。
評(píng)論
查看更多