前排提示
以下定時(shí)器的設(shè)置例程是以12MHz頻率運(yùn)行為模板的
STC15F2K60S2單片機(jī)內(nèi)部晶振頻率設(shè)置方法如下:
什么是中斷
首先,我們先來模擬一個(gè)情景:
在某天的晚上,你正在為今晚截止上交的作業(yè)絞盡腦汁,同時(shí)你還有一桶的衣服沒洗(嗯,假設(shè)是個(gè)懶癌,假設(shè))**。但有一個(gè)好消息,洗衣機(jī)還有5分鐘就洗完了上一位同學(xué)的衣服,如果你足夠及時(shí)的話就能夠用上洗衣機(jī)。因此,你用手機(jī)設(shè)了一個(gè)5分鐘后的提醒,時(shí)間一到你就暫停做作業(yè),并馬上去使用洗衣機(jī)洗衣服,完成這項(xiàng)任務(wù)后回去繼續(xù)寫作業(yè)。
分析一下上面的情景,我們可以得到以下信息:
1、你現(xiàn)在主要的任務(wù)是完成作業(yè),而且現(xiàn)在就需要進(jìn)行;
2、你需要洗你的衣服,但不是現(xiàn)在;
3、在洗衣機(jī)前一直等待的話,將阻礙你其他任務(wù)的進(jìn)行;
4、你設(shè)置了一個(gè)定時(shí)器,會(huì)提醒你進(jìn)行另一項(xiàng)任務(wù)。
得到這些信息,對(duì)于定時(shí)器中斷我們就很好理解了。
將上面的情景套到單片機(jī)中的話:
1、主函數(shù)(main)是你現(xiàn)在正在做的事(做作業(yè));
2、中斷函數(shù)是你另外需要做的事(洗衣服)但不是現(xiàn)在需要做的;
3、主函數(shù)需要一直執(zhí)行,而且無法與其他函數(shù)同時(shí)執(zhí)行(只有一個(gè)線程);
4、定時(shí)器中斷可以暫停主函數(shù)的執(zhí)行,并進(jìn)入中斷函數(shù),待中斷函數(shù)完成后就回到主函數(shù),從暫停的位置繼續(xù)執(zhí)行。
如果你理解了什么是中斷,那么請(qǐng)接著往下看。
怎樣使用中斷
使用定時(shí)器中斷分為兩部分:打開定時(shí)器中斷與編寫中斷函數(shù),下面以定時(shí)器0為例,講解如何編寫和使用。
打開定時(shí)器中斷
打開定時(shí)器中斷分為以下三個(gè)步驟:
1、打開定時(shí)器;
2、設(shè)置定時(shí)器工作模式;
3、設(shè)置定時(shí)時(shí)長(zhǎng)(設(shè)置初值)。
下面是設(shè)置定時(shí)50ms的例程:
void Timer0_Start() //中斷設(shè)置函數(shù)
{
EA = 1;
ET0 = 1;
TMOD |= 0x09;
TR0 = 1;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
}
我們按上面所隔開的三部分,來逐句分析上面的程序:
- 第一步,打開定時(shí)器:
EA:中斷的總開關(guān),置1使中斷可用;
ET0:定時(shí)器0的開關(guān),置1使定時(shí)器0可用。
我們可以這樣理解,EA家里的總電閘,ET0是家里其中一盞電燈的開關(guān),只有打開了EA,ET0才能用;只用ET0打開了,定時(shí)器0才能用。
- 第二步,設(shè)置定時(shí)器的工作模式:
TMOD:定時(shí)器共有4種工作模式(模式0~模式3),其中模式1較為常用,具體的設(shè)置方法以后更新,本文只講較常用的模式。
TR0:控制TR0的運(yùn)行,置1時(shí)定時(shí)器開始運(yùn)行(ET0是使定時(shí)器0能用,并不代表著定時(shí)器0已經(jīng)開始工作)。
- 第三步,設(shè)置定時(shí)器初值:
TH0:相當(dāng)于分,計(jì)滿(65536)時(shí)進(jìn)入中斷;
TL0:相當(dāng)于秒,計(jì)滿(65536)時(shí)分(TH0)加一。
如果不設(shè)置TH0和TL0,則默認(rèn)從0開始計(jì)。
其中,50000為計(jì)時(shí)時(shí)長(zhǎng)(50000微妙,即50毫秒)具體的為啥醬紫設(shè)置將在下篇細(xì)講。
編寫中斷函數(shù)
中斷函數(shù)的編寫與一般子函數(shù)的編寫差別不大:
void xxx() interrupt 1 //中斷函數(shù)
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
//balabalabala...
}
函數(shù)名同樣是可以自定義的,不過中斷函數(shù)并沒有返回值與參數(shù)。
函數(shù)名后面的interrupt關(guān)鍵字可以看成中斷函數(shù)的標(biāo)志,帶這東西的就是中斷函數(shù)。
進(jìn)入中斷后,首先要做的就是將TH0、TL0恢復(fù)初值(如果這個(gè)中斷只執(zhí)行一次,那么可以忽略這個(gè)步驟)。
原來定時(shí)的時(shí)長(zhǎng)已經(jīng)完成了,如果不重新設(shè)定時(shí)間,那么就不會(huì)再繼續(xù)定時(shí)。
interrupt后面接的數(shù)字是中斷源的序號(hào):
- 1 為定時(shí)器0;*
- 3 為定時(shí)器1;
- 有的單片機(jī)還有定時(shí)器2,定時(shí)器2的序號(hào)為5。*
中間其他數(shù)是其他中斷的序號(hào)。
要注意的是,中斷是有優(yōu)先級(jí)的,序號(hào)越高則優(yōu)先級(jí)越高。例如,定時(shí)器0與定時(shí)器1同時(shí)發(fā)生了中斷,則優(yōu)先執(zhí)行定時(shí)器0的中斷函數(shù),執(zhí)行完后再執(zhí)行定時(shí)器1的中斷函數(shù),最后回到主函數(shù)。
注意:
上面所使用的ET0、TR0、TH0、TL0中,最后的數(shù)字代表著定時(shí)器0,
如果使用定時(shí)器1,相應(yīng)的就改成ET1、TR1、TH1、TL1。
寫個(gè)程序試試看
上面就是定時(shí)器中斷的設(shè)置與使用了,我們來試試用定時(shí)器做一個(gè)LED閃爍的小程序吧。
例程:
#include < reg52.h >
#define TIME_US 50000 //中斷間隔,50000即每隔50ms發(fā)生一次中斷
#define LED P1 //LED與單片機(jī)所連接的引腳
int count = 0; //用于記錄進(jìn)入中斷次數(shù)的全局變量
void Timer0_Start() //中斷設(shè)置函數(shù)
{
EA = 1;
ET0 = 1;
TMOD |= 0x09;
TR0 = 1;
TH0 = (65536-TIME_US)/256;
TL0 = (65536-TIME_US)%256;
}
void main()
{
Timer0_Start(); //調(diào)用中斷設(shè)置函數(shù),若不調(diào)用則與沒寫沒有區(qū)別
LED = 0x00; //設(shè)置LED的初值
while(1); //死循環(huán),讓程序在此停止,否則將一直循環(huán)令LED為0x00
}
void Timer0() interrupt 1 //中斷函數(shù)
{
TH0 = (65536-TIME_US)/256;
TL0 = (65536-TIME_US)%256;
count++; //進(jìn)入了一次中斷,變量count加1
if(count == 20) //如果進(jìn)入了20次中斷,即過了1秒(50ms*20=1s),
{
count = 0; //將count歸0,下次中斷開始重新計(jì)數(shù)
LED = ~LED; //將LED進(jìn)行取反,原來亮的就變滅,原來滅的就變亮
}
}
(程序下載效果,LED亮一秒滅一秒)
在使用中斷時(shí),有幾個(gè)需要注意的地方:
1、中斷設(shè)置函數(shù)( Timer0_Start() )只需要進(jìn)行一次,若循環(huán)進(jìn)行則相當(dāng)于一直給TH、TL賦值,TH、TL不能計(jì)滿溢出則無法進(jìn)入中斷。
2、中斷里用來計(jì)數(shù)的變量(count)不能在中斷里進(jìn)行定義(例如把int count寫在中斷函數(shù)里),因?yàn)槊看瓮顺鲋袛嗪罄锩娴木植孔兞慷紩?huì)被清除,這個(gè)變量也就無法用于計(jì)數(shù)。
使用中斷的好處是,你可以在上面主函數(shù)的while循環(huán)里執(zhí)行其他程序,且不影響LED閃爍的執(zhí)行,可以完成多項(xiàng)任務(wù)(例如動(dòng)態(tài)數(shù)碼管與LED閃爍同時(shí)工作)。
相比之下,使用軟件延時(shí)(delay)的話,要完成像上面這樣的多任務(wù)執(zhí)行可能就要寫比較復(fù)雜的程序了,因?yàn)樵谲浖訒r(shí)的期間單片機(jī)是無法執(zhí)行其他程序的。
-
單片機(jī)
+關(guān)注
關(guān)注
6063文章
44915瀏覽量
646887 -
LED閃爍
+關(guān)注
關(guān)注
0文章
29瀏覽量
9993 -
定時(shí)器中斷
+關(guān)注
關(guān)注
0文章
49瀏覽量
11424 -
動(dòng)態(tài)數(shù)碼管
+關(guān)注
關(guān)注
1文章
11瀏覽量
7546 -
中斷函數(shù)
+關(guān)注
關(guān)注
0文章
13瀏覽量
5439
發(fā)布評(píng)論請(qǐng)先 登錄
定時(shí)器中斷跑馬燈
stm32定時(shí)器中斷程序
51單片機(jī):開啟中斷和定時(shí)器

"外部中斷,定時(shí)器中斷的理解"

STM32定時(shí)器與中斷整理

定時(shí)器中斷實(shí)現(xiàn)步驟及實(shí)例筆記

定時(shí)器中斷實(shí)驗(yàn)

利用定時(shí)器中斷方式控制led燈的閃爍速度_項(xiàng)目四 定時(shí)器和中斷概念的基本認(rèn)識(shí)...

STM32CubeMX_定時(shí)器中斷_PWM

STM32定時(shí)器的分類及中斷原理

如何設(shè)置基于定時(shí)器的中斷

評(píng)論