本文主要是關(guān)于C51中的中斷系統(tǒng)的相關(guān)介紹塑荒。
1. 中斷概念
中斷是為使單片機(jī)具有對(duì)外部或內(nèi)部隨機(jī)發(fā)生的事件實(shí)時(shí)處理而設(shè)置的。中斷功能的存在,很大程度上提高了單片機(jī)處理外部或內(nèi)部事件的能力糟把,中斷是單片機(jī)最重要的功能之一。
中斷在生活中的一個(gè)事例:你打開火牲剃,燒一壺水遣疯;然后去洗衣服,在洗衣服的過(guò)程中凿傅,突然聽到水壺發(fā)出水開的報(bào)警聲缠犀,這是,你停止洗衣服動(dòng)作聪舒,立即去關(guān)火辨液,然后將開水灌入開水壺中,灌完開水后箱残,又回去繼續(xù)洗衣服滔迈。這個(gè)過(guò)程中就發(fā)生了一次中斷止吁。
對(duì)單片機(jī)來(lái)講,中斷是指CPU在處理某一事件A時(shí)燎悍,發(fā)生了另一事件B敬惦,請(qǐng)求CPU迅速去處理(中斷發(fā)生);CPU暫時(shí)停止當(dāng)前的工作(中斷響應(yīng))谈山,轉(zhuǎn)去處理時(shí)間B(中斷服務(wù))俄删;待CPU將事件B處理完畢后,再回到原來(lái)事件A被中斷的地方繼續(xù)處理時(shí)間A(中斷返回)奏路,這一個(gè)過(guò)程稱為中斷畴椰。
如下圖是展示了生活中的中斷實(shí)例以及單片機(jī)處理中斷的過(guò)程示意圖。
將生活事例與單片機(jī)中斷結(jié)合分析鸽粉,主任務(wù)是洗衣服斜脂,水開報(bào)警是一個(gè)中斷請(qǐng)求,這一時(shí)刻相當(dāng)于斷點(diǎn)處触机,響應(yīng)中斷去關(guān)火秽褒,然后將開水灌入暖水瓶中,這一動(dòng)作實(shí)際上是處理中斷程序威兜,灌完開水后再回去繼續(xù)洗衣服销斟,相當(dāng)于處理完中斷程序后再返回主程序繼續(xù)執(zhí)行主程序。
需要注意的是椒舵,水開是隨時(shí)都有可能的蚂踊,但是無(wú)論什么時(shí)候開,只要一開將立即去處理它笔宿,處理完后再回來(lái)繼續(xù)接著洗剛才那件衣服犁钟。單片機(jī)在執(zhí)行程序時(shí),中斷也是隨時(shí)可能發(fā)生泼橘,但無(wú)論何時(shí)發(fā)生涝动,只要一旦發(fā)生,單片機(jī)將立即暫停當(dāng)前程序炬灭,趕去處理中斷程序醋粟,處理完中斷程序后再返回剛才暫停處接著執(zhí)行原來(lái)的程序。
引起CPU中斷的根源稱為中斷源重归。中斷源向CPU提出中斷請(qǐng)求米愿,CPU暫時(shí)中斷原來(lái)的事務(wù)A,轉(zhuǎn)去處理事件B鼻吮,對(duì)事件B處理完畢后育苟,再回到原來(lái)被中斷的地方(即斷點(diǎn)),稱為中斷返回椎木。實(shí)現(xiàn)上述中斷功能的部件稱為中斷系統(tǒng)(中斷機(jī)構(gòu))违柏。
當(dāng)中央處理機(jī)CPU正在處理某件事時(shí)外界發(fā)生了緊急事件請(qǐng)求博烂,要求CPU暫停當(dāng)前的工作,轉(zhuǎn)而去處理這個(gè)緊急事件漱竖,處理完以后禽篱,再回到原來(lái)被中斷的地方,繼續(xù)原來(lái)的工作闲孤,這樣的過(guò)程稱為中斷谆级。實(shí)現(xiàn)這種功能的部件稱為中斷系統(tǒng)烤礁,請(qǐng)示CPU中斷的請(qǐng)求源稱為中斷源讼积。
微型機(jī)的中斷系統(tǒng)一般允許多個(gè)中斷源,當(dāng)幾個(gè)中斷源同時(shí)向CPU請(qǐng)求中斷脚仔,要求為它服務(wù)的時(shí)候勤众,就存在CPU優(yōu)先響應(yīng)哪一個(gè)中斷源請(qǐng)求的問題。通常根據(jù)中斷源的輕重緩急排隊(duì)鲤脏,優(yōu)先處理最緊急事件的中斷請(qǐng)求源们颜,即規(guī)定每一個(gè)中斷源有一個(gè)優(yōu)先級(jí)別。CPU總是先響應(yīng)優(yōu)先級(jí)別最高的中斷請(qǐng)求猎醇。
當(dāng)CPU正在處理一個(gè)中斷源請(qǐng)求的時(shí)候窥突,發(fā)生了另外一個(gè)優(yōu)先級(jí)比它還高的中斷源請(qǐng)求。如果CPU能夠暫停對(duì)原來(lái)中斷源的服務(wù)程序硫嘶,轉(zhuǎn)而去處理優(yōu)先級(jí)更高的中斷請(qǐng)求源阻问,處理完以后,再回到原低優(yōu)先級(jí)中斷服務(wù)程序沦疾,這樣的過(guò)程稱為中斷嵌套称近。這樣的中斷系統(tǒng)稱為多級(jí)中斷系統(tǒng),沒有中斷嵌套功能的中斷系統(tǒng)稱為單級(jí)中斷系統(tǒng)哮塞。
中斷的開啟與關(guān)閉刨秆、設(shè)置啟用哪一個(gè)中斷等都是由單片機(jī)內(nèi)部的一些特殊功能寄存器來(lái)決定的。
終端技術(shù)不僅解決了快速主機(jī)與慢速I/O設(shè)備的數(shù)據(jù)傳送問題忆畅,而且還具有如下優(yōu)點(diǎn):
- 分時(shí)操作衡未。CPU可以分時(shí)為多個(gè)I/O設(shè)備服務(wù),提高了計(jì)算機(jī)的利用率家凯;
- 實(shí)時(shí)響應(yīng)眠屎。CPU能夠及時(shí)處理應(yīng)用系統(tǒng)的隨機(jī)事件,系統(tǒng)的實(shí)時(shí)性大大增強(qiáng)肆饶。
- 可靠性高改衩。CPU具有處理設(shè)備故障及掉電等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高驯镊。
2. 中斷結(jié)構(gòu)及相關(guān)寄存器
89C51系列單片機(jī)提供了8個(gè)中斷請(qǐng)求源葫督,它們分別是:外部中斷0(INT0)竭鞍、外部中斷1(INT1)、外部中斷2(INT2)橄镜、外部中斷3(INT3)偎快、定時(shí)器0中斷、定時(shí)器1(T0)中斷、定時(shí)器2(T1)中斷濒蒋、串口(UART)中斷启盛。
需要注意,51單片機(jī)一定有基本的5個(gè)中斷丐怯,但不全有8個(gè)中斷,需要查看芯片手冊(cè)翔横,通常我們使用的都是基本的5個(gè)中斷:INT0读跷、INT1、定時(shí)器0/1禾唁、串口中斷效览。
所有的中斷都具有四個(gè)中斷優(yōu)先級(jí)(基本型只有兩個(gè))。
用戶可以用關(guān)總中斷允許位(EA/IE.7)或相應(yīng)中斷的允許位來(lái)屏蔽所有的中斷請(qǐng)求荡短,也可以用打開相應(yīng)的中斷允許位來(lái)使CPU響應(yīng)相應(yīng)的中斷請(qǐng)求丐枉。
其中有些中斷源可以用軟件獨(dú)立地控制位開中斷或關(guān)中斷狀態(tài)。
每一個(gè)中斷的優(yōu)先級(jí)別均可用軟件設(shè)置掘托。高優(yōu)先級(jí)的中斷請(qǐng)求可以打斷低優(yōu)先級(jí)的中斷瘦锹,反之,低優(yōu)先級(jí)的中斷請(qǐng)求不可以打斷高優(yōu)先級(jí)及同優(yōu)先級(jí)的中斷烫映。
當(dāng)兩個(gè)相同優(yōu)先級(jí)的中斷同時(shí)產(chǎn)生時(shí)沼本,將由查詢次序來(lái)決定系統(tǒng)先響應(yīng)哪個(gè)中斷。
STC89C5X系列單片機(jī)的各個(gè)中斷查詢次序表如下圖所示:
中斷源 | 中斷向量地址 | 相同優(yōu)先級(jí)內(nèi)的查詢次序 | 中斷優(yōu)先級(jí)設(shè)置IPH.IP | 優(yōu)先級(jí)0(最低) | 優(yōu)先級(jí)1 | 優(yōu)先級(jí)2 | 優(yōu)先級(jí)3(最高) | 中斷請(qǐng)求標(biāo)志位 | 中斷允許控制位 |
---|---|---|---|---|---|---|---|---|---|
/INT0 外部中斷0 |
0003H | 0 最高 |
PX0H,PX0 | 0,0 | 0,1 | 1,0 | 1,1 | IE0 | EX0/EA |
Timer0 定時(shí)器0 |
000BH | 1 | PT0H,PT0 | 0,0 | 0,1 | 1,0 | 1,1 | TF0 | ET0/EA |
/INT1 外部中斷1 |
0013H | 2 | PX1H,PX1 | 0,0 | 0,1 | 1,0 | 1,1 | IE1 | EX1/EA |
Timer1 | 001BH | 3 | PT1H,PT1 | 0,0 | 0,1 | 1,0 | 1,1 | TF1 | ET1/EA |
UART | 0023H | 4 | PSH,PS | 0,0 | 0,1 | 1,0 | 1,1 | RI+TI | |
Timer2 | 002BH | 5 | PT2H,PT2 | 0,0 | 0,1 | 1,0 | 1,1 | TF2+EXF2 | (ET2)/EA |
/INT2 外部中斷2 |
0033H | 6 | PX2H,PX2 | 0,0 | 0,1 | 1,0 | 1,1 | IE2 | EX2/EA |
/INT3 外部中斷3 |
003BH | 7 | PX3H,PX3 | 0,0 | 0,1 | 1,0 | 1,1 | IE3 | EX3/EA |
通過(guò)設(shè)置新增加的特殊功能寄存器IPH中的相應(yīng)位锭沟,可將中斷優(yōu)先級(jí)設(shè)為四級(jí)抽兆。如果只設(shè)置IP或XICON,那么中斷優(yōu)先級(jí)就只有兩級(jí)族淮,與傳統(tǒng)8051單片機(jī)兩級(jí)中斷優(yōu)先級(jí)完全兼容辫红。
上圖中的中斷查詢次序即為中斷號(hào),當(dāng)中斷來(lái)臨時(shí)祝辣,只有中斷號(hào)正確才能進(jìn)入中斷贴妻。
以51單片機(jī)一定有的5個(gè)中斷介紹,其內(nèi)部結(jié)構(gòu)框圖如下所示:
①. INT0對(duì)應(yīng)的是P3.2口的附加功能蝙斜,可由IT0(TCON.0)選擇其為低電平有效還是下降沿有效名惩。當(dāng)CPU檢測(cè)到P3.2引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中斷標(biāo)志IE0(TCON.1)置1孕荠,向CPU申請(qǐng)中斷娩鹉。
②. INT1對(duì)應(yīng)的是P3.3口的附加功能攻谁,可由IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當(dāng)CPU檢測(cè)到P3.3引腳上出現(xiàn)有效的中斷信號(hào)時(shí)弯予,中斷標(biāo)志IE1(TCON.3)置1戚宦,向CPU申請(qǐng)中斷。
③. T0對(duì)應(yīng)的是P3.4口的附加功能锈嫩,TF0(TCON.5)受楼,片內(nèi)定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志。當(dāng)定時(shí)/計(jì)數(shù)器T0發(fā)生溢出時(shí)呼寸,置位TF0艳汽,并向CPU申請(qǐng)中斷。
④. T1對(duì)應(yīng)的是P3.5口的附加功能等舔,TF1(TCON.7)骚灸,片內(nèi)定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志糟趾。當(dāng)定時(shí)/計(jì)數(shù)器T1發(fā)生溢出時(shí)慌植,置位TF1,并向CPU申請(qǐng)中斷义郑。
⑤. RXD和TXD對(duì)應(yīng)的是P3.0和P3.1口的附加功能蝶柿,RI(SCON.0)或TI(SCON.1),串行口中斷請(qǐng)求標(biāo)志非驮。當(dāng)串行口接收完一幀串行數(shù)據(jù)時(shí)置位RI或當(dāng)串行口發(fā)送完一幀串行數(shù)據(jù)時(shí)置位TI交汤,向CPU申請(qǐng)中斷。
(1). 中斷允許控制寄存器IE
CPU對(duì)中斷系統(tǒng)所有中斷以及某個(gè)中斷源的開放和屏蔽是由中斷允許寄存器IE控制的劫笙。中斷允許寄存器IE各個(gè)位如下所示:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字節(jié)地址:A8H | EA | ES | ET1 | EX1 | ET0 | EX0 | IE |
位說(shuō)明:
- EX0(IE.0)芙扎,外部中斷0(INT0)允許位;
- ET0(IE.1)填大,定時(shí)/計(jì)數(shù)器T0中斷允許位戒洼;
- EX1(IE.2),外部中斷1(INT1)允許位允华;
- ET1(IE.3)圈浇,定時(shí)/計(jì)數(shù)器T1中斷允許位;
- ES(IE.4)靴寂,串行口中斷允許位磷蜀;
- EA(IE.7),CPU中斷允許(總允許)位百炬;
(2). 中斷請(qǐng)求標(biāo)志寄存器TCON
中斷請(qǐng)求標(biāo)志TCON各位如下所示:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字節(jié)地址:88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 | TCON |
位說(shuō)明:
- IT0(TCON.0)褐隆,外部中斷0觸發(fā)方式控制位,IT0=0表示電平觸發(fā)方式剖踊;IT0=1時(shí)表示邊沿觸發(fā)方式庶弃,下降沿有效轨蛤;
- IE0(TCON.1),外部中斷0中斷請(qǐng)求標(biāo)志位虫埂;
- IT1(TCON.2)祥山,外部中斷1觸發(fā)方式控制位;
- IE1(TCON.3)掉伏,外部中斷1中斷請(qǐng)求標(biāo)志位缝呕;
- TF0(TCON.5),定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志位斧散;
- TF1(TCON.7)供常,定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志位;
(3). 中斷優(yōu)先級(jí)
同一優(yōu)先級(jí)中的中斷申請(qǐng)不止一個(gè)時(shí)鸡捐,就會(huì)出現(xiàn)中斷優(yōu)先權(quán)排隊(duì)問題栈暇。同一優(yōu)先級(jí)的中斷優(yōu)先權(quán)排隊(duì),由中斷系統(tǒng)硬件確定的自然優(yōu)先級(jí)形成箍镜,其排列如下所示:
各中斷源響應(yīng)優(yōu)先級(jí)及中斷服務(wù)程序入口表
中斷源 | 中斷標(biāo)志 | 中斷服務(wù)程序入口 | 優(yōu)先級(jí)順序 |
---|---|---|---|
外部中斷0(/INT0) | IE0 | 0003H | 高 |
定時(shí)/計(jì)數(shù)器0(T0) | TF0 | 000BH | ↓ |
外部中斷1(/INT1) | IE1 | 0013H | ↓ |
定時(shí)/計(jì)數(shù)器1(T1) | TF1 | 001BH | ↓ |
串行口 | RI或TI | 0023H | 低 |
(4). 中斷號(hào)
中斷源符號(hào) | 名稱 | 中斷引起原因 | 中斷號(hào) |
---|---|---|---|
/INT0 | 外部中斷0 | P3.2引腳低電平或下降沿 | 0 |
T0 | 定時(shí)/計(jì)數(shù)器0 | 定時(shí)/計(jì)數(shù)器0計(jì)數(shù)回0溢出 | 1 |
/INT1 | 外部中斷1 | P3.3引腳低電平或下降沿 | 2 |
T1 | 定時(shí)/計(jì)數(shù)器1 | 定時(shí)/計(jì)數(shù)器1計(jì)數(shù)回0溢出 | 3 |
TI/RI | 串行口中斷 | 串行通信完成一幀數(shù)據(jù)發(fā)送或接收引起中斷 | 4 |
(5). 中斷響應(yīng)條件
當(dāng)三個(gè)條件:①中斷源有中斷請(qǐng)求源祈;②此中斷源的中斷允許位為;③CPU開中斷(即EA=1)色迂;同時(shí)滿足時(shí)香缺,CPU才有可能響應(yīng)中斷。
在使用中斷時(shí)歇僧,需要做:①想使用的是哪個(gè)中斷图张,選擇響應(yīng)的中斷號(hào);②希望的觸發(fā)條件是什么诈悍;③希望在中斷之后做什么祸轮。
以外部中斷0為例,如下所示:
首先主程序需要一下代碼:
EA=1; // 總中斷允許位置1侥钳,打開總中斷開關(guān)
EX0=1; // 外部中斷0允許位置1适袜,打開INT0
IT0=0/1; // 外部中斷0觸發(fā)方式控制位,置為0或1慕趴,表示電平或邊沿觸發(fā)中斷
然后中斷服務(wù)函數(shù):
void int0() interrupt 0 using 1
{
// 編寫中斷之后做什么的代碼
}
其中int0
是函數(shù)名痪蝇,可以自定義,需要符合C語(yǔ)言標(biāo)識(shí)符定義規(guī)則冕房;interrupt
是一個(gè)關(guān)鍵字躏啰,表示51單片機(jī)中斷;后面的0
是中斷號(hào)耙册,外部中斷0的中斷號(hào)為0给僵;后面的using 1
可省略不寫。