單片機(jī)中,中斷算是一個(gè)比較重要的部分,在51單片機(jī)中有八種中斷方式 ,其中常用的的有五種,分別是外部中斷0,計(jì)時(shí)器中斷0,外部中斷1,計(jì)時(shí)器中斷1,和串口中斷。今天主要介紹的是計(jì)時(shí)器中斷。
51單片機(jī)給我們提供了2個(gè)計(jì)時(shí)器中斷,分別是計(jì)時(shí)器0和計(jì)時(shí)器1,他們對(duì)應(yīng)的優(yōu)先級(jí)分別是1和3,開(kāi)啟計(jì)時(shí)器并允許其中斷后,計(jì)時(shí)器會(huì)從給定的初始值開(kāi)始,每個(gè)指令周期加1,直到加到65535,再加一時(shí)計(jì)時(shí)器溢出,計(jì)時(shí)器此時(shí)會(huì)進(jìn)入中斷,并執(zhí)行中斷服務(wù)函數(shù)。
在編程過(guò)程中發(fā)現(xiàn)有許多人搞不清中斷服務(wù)函數(shù)與一般函數(shù)的區(qū)別,他們總是問(wèn)出諸如中斷服務(wù)函數(shù)在程序中哪一句之前或哪一句之后執(zhí)行的問(wèn)題。其實(shí)中斷服務(wù)函數(shù)雖然也是個(gè)函數(shù),但是它與一般函數(shù)還是有一定的區(qū)別的。一般函數(shù)想使用時(shí),必須要在主函數(shù)或其他函數(shù)中調(diào)用。而中斷服務(wù)函數(shù),只要在主函數(shù)中初始化計(jì)時(shí)器后,當(dāng)計(jì)時(shí)器進(jìn)入中斷時(shí)會(huì)中止單片機(jī)進(jìn)行的所有操作,開(kāi)始執(zhí)行中斷服務(wù)函數(shù),在執(zhí)行完中斷服務(wù)函數(shù)后再回到執(zhí)行中斷服務(wù)函數(shù)前執(zhí)行的地方繼續(xù)執(zhí)行。其實(shí)中斷服務(wù)函數(shù)也是被調(diào)用了,但它不是被程序中的某一句話調(diào)用了,而是被單片機(jī)調(diào)用了。
單片機(jī)單片機(jī)存儲(chǔ)程序并不是從0地址開(kāi)始保存,而是在中端向量表后保存,中斷向量表中保存的是中斷的優(yōu)先級(jí)和中斷服務(wù)函數(shù)的地址。程序執(zhí)行后一旦計(jì)時(shí)器進(jìn)入中斷狀態(tài),單片機(jī)會(huì)回到中斷向量表查詢中斷的優(yōu)先級(jí)和中斷服務(wù)函數(shù)的地址,然后跳轉(zhuǎn)到中斷服務(wù)函數(shù)所在地址開(kāi)始執(zhí)行,執(zhí)行完成后回到中斷向量表,然后回到中斷前的地方執(zhí)行。
單片機(jī)的初始化有5步:
1.打開(kāi)總中斷。
2.選擇工作方式。
3.計(jì)時(shí)器初始化。
4.打開(kāi)計(jì)時(shí)器中斷允許。
5.開(kāi)始計(jì)時(shí)。
下面以定時(shí)器0為例就按照上面五個(gè)步驟寫(xiě)一個(gè)1ms執(zhí)行一次中斷函數(shù)的初始化函數(shù)。
void tiemr0_init()
{
EA = 1; //打開(kāi)總中斷
TMOD |= 0x01; //選擇工作方式1 *注1
TH0 = (65536 - 1000) / 256; //定時(shí)器高八位初始化
TL0 = (65536 - 1000) %256; // 定時(shí)器低八位初始化
ET0 = 1; //打開(kāi)定時(shí)器0中斷允許
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
}
注1:TMOD寄存器有八位,其中高八位用于選擇定時(shí)器1的工作方式,低八位用于選擇定時(shí)器0 的工作方式,定時(shí)器1有三種工作方式,定時(shí)器1有四種工作方式。
一般定時(shí)器中斷時(shí)使用方式一,也就是用定時(shí)器0(T0)時(shí) TMOD |= 0x01,用定時(shí)器1(T1)時(shí) TMOD |= 0x10,方式2一般用于串口中斷,其余兩種涉及不多。
中斷服務(wù)函數(shù)只需要在函數(shù)名后加interrupt X ,X就是中斷對(duì)應(yīng)的優(yōu)先級(jí),如定時(shí)器0中斷對(duì)應(yīng)的優(yōu)先級(jí)是1,那他的中斷服務(wù)函數(shù)名后面就加interrupt 1,下面就以定時(shí)器0為例編寫(xiě)一個(gè)使count一毫秒加一的中斷服務(wù)函數(shù)(晶振為12M)
unsigned char count = 0;
void timer0_isr() interrupt 1
{
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
count++;
}
上一篇:51單片機(jī)的中斷控制
下一篇:51單片機(jī)的定時(shí)器與中斷
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 意法半導(dǎo)體推出先進(jìn)的 1600 V IGBT,面向高性價(jià)比節(jié)能家電市場(chǎng)
- EDPF-NT+分散控制系統(tǒng)網(wǎng)絡(luò)防護(hù)解決方案
- 基于PLC控制的易驅(qū)變頻器在布袋除塵器上的應(yīng)用
- 如何利用伺服自動(dòng)化實(shí)現(xiàn)成本降低和產(chǎn)能最大化?
- 壓力傳感器有哪些抗干擾措施?
- 破局!補(bǔ)盲dToF固態(tài)激光雷達(dá)輪番“出手”,禾賽FT120也要靠邊
- 利用正壓送風(fēng)壓力傳感器自動(dòng)控制火災(zāi)風(fēng)口壓力
- 多個(gè)傳感器間相互位置關(guān)系校準(zhǔn)方法
- 樓宇自控BA系統(tǒng)傳感器有哪些?
- 常見(jiàn)壓力傳感器工業(yè)原理匯總
- EEworld獨(dú)家原創(chuàng)視頻:大話TI CC2650,邀你來(lái)看!
- 觀看TI IOT解決方案研討會(huì) 答題即可贏取更多精美好禮!
- 【EEWORLD第三十九屆】2012年06月社區(qū)明星人物揭曉!
- 永不過(guò)時(shí)的物聯(lián)網(wǎng)解決方案 Intel帶你6的飛起來(lái)!
- ADI有獎(jiǎng)下載活動(dòng)之25:ADI汽車(chē)傳感器和傳感器接口解決方案
- Vicor 更好的供電方式提升無(wú)人機(jī)飛行時(shí)間飛行半徑及有效載荷
- 考眼力:高速數(shù)字設(shè)計(jì)的秘籍 藏在哪里? 走近Keysight PATHWAVE,提升工作效率
- TI 最新電容式觸控套件,免費(fèi)嘗鮮中
- TI有獎(jiǎng)直播|借助Sitara™ AM263x MCU 創(chuàng)造電氣化的未來(lái)
- WindowsCE 6.0 for mini2440/micro2440現(xiàn)在已經(jīng)發(fā)布啦
- 關(guān)于嵌入式工程師的資格認(rèn)證問(wèn)題
- 大家好,6410矩陣鍵盤(pán)做過(guò)嗎?我這里老是有問(wèn)題呢,請(qǐng)指教!
- Squirrel:面向?qū)ο?輕量級(jí)腳本語(yǔ)言
- 拍了幾個(gè)爺爺級(jí)的古董儀器照片
- Qorvo技術(shù)視頻之面向汽車(chē)應(yīng)用的 UWB:工程入門(mén)知識(shí)
- CC2530/CC2540/CC2541常用寄存器
- 有人轉(zhuǎn)讓恩智浦LPC1114 & LPC1343開(kāi)發(fā)板嗎
- 關(guān)于精密整流電路的干擾
- EEWORLD大學(xué)堂----半導(dǎo)體基礎(chǔ)(普渡大學(xué))