單片機(jī)學(xué)習(xí)筆記(四)——中斷
一、中斷的概念:
(1)CPU 在處理某一事件A時(shí),發(fā)生了另一事件B請(qǐng)求 CPU 迅速去處理(中斷發(fā)生);
(2)CPU 暫時(shí)中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B(中斷響應(yīng)和中斷服務(wù));
(3)待 CPU 將事件B處理完畢后,再回到原來(lái)事件A被中斷的地方繼續(xù)處理事件A(中斷返回),
這一過(guò)程稱為中斷。
中斷源:
引起 CPU 中斷的根源,稱為中斷源。
中斷返回:
中斷源向 CPU 提出的中斷請(qǐng)求。CPU 暫時(shí)中斷原來(lái)的事務(wù) A,轉(zhuǎn)去處理事件 B。對(duì)事件 B 處理完畢后,再回到原來(lái)被中斷的地方(即斷點(diǎn)),稱為中斷返回。
中斷系統(tǒng):
實(shí)現(xiàn)上述中斷功能的部件(即中斷機(jī)構(gòu)),稱為中斷系統(tǒng)。
中斷技術(shù)的優(yōu)點(diǎn):
(1)分時(shí)操作:CPU 可以分時(shí)為多個(gè) I / O 設(shè)備服務(wù),提高了計(jì)算機(jī)的利用率;
(2)實(shí)時(shí)響應(yīng):CPU 能夠及時(shí)處理應(yīng)用系統(tǒng)的隨機(jī)事件,系統(tǒng)的實(shí)時(shí)性大大增強(qiáng);
(3)可靠性高:CPU 具有處理設(shè)備故障及掉電等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高。
二、80C51中斷系統(tǒng)的結(jié)構(gòu):
80C51的中斷系統(tǒng)有 5 個(gè)中斷源(8052有 6個(gè)) ,2個(gè)優(yōu)先級(jí),可實(shí)現(xiàn)二級(jí)中斷嵌套 。
1.(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)中斷。
2.(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)中斷。
3.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)中斷。
4.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)中斷。
5.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)中斷。
三、中斷請(qǐng)求標(biāo)志:
1、TCON的中斷標(biāo)志:
IT0(TCON.0),外部中斷0觸發(fā)方式控制位。
當(dāng)IT0= 0 時(shí),為電平觸發(fā)方式。
當(dāng)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)志位。
2、SCON的中斷標(biāo)志:
RI(SCON.0),串行口接收中斷標(biāo)志位。當(dāng)允許串行口接收數(shù)據(jù)時(shí),每接收完一個(gè)串行幀,由硬件置位RI。 注意,RI必須由軟件清除。
TI(SCON.1),串行口發(fā)送中斷標(biāo)志位。當(dāng) CPU 將一個(gè)發(fā)送數(shù)據(jù)寫入串行口發(fā)送緩沖器時(shí),就啟動(dòng)了發(fā)送過(guò) 程。每發(fā)送完一個(gè)串行幀,由硬件置位TI。CPU 響應(yīng)中斷時(shí),不能自動(dòng)清除TI,TI必須由軟件清除。
四、80C51 中斷控制
1、中斷允許控制
CPU 對(duì)中斷系統(tǒng)所有中斷以及某個(gè)中斷源的開放和屏蔽是由中斷允許寄存器IE控制的。
EX0(IE.0),外部中斷 0 允許位;
ET0(IE.1),定時(shí)/計(jì)數(shù)器T0中斷允許位;
EX1(IE.2),外部中斷 0 允許位;
ET1(IE.3),定時(shí) / 計(jì)數(shù)器 T1 中斷允許位;
ES(IE.4),串行口中斷允許位;
EA(IE.7), CPU 中斷允許(總允許)位。
2、中斷優(yōu)先級(jí)控制
斷源的中斷優(yōu)先級(jí)都是由中斷優(yōu)先級(jí) 寄存器IP中的相應(yīng)位的狀態(tài)來(lái)規(guī)定的 。
PX0(IP.0),外部中斷 0 優(yōu)先級(jí)設(shè)定位;
PT0(IP.1),定時(shí) / 計(jì)數(shù)器 T0 優(yōu)先級(jí)設(shè)定位;
PX1(IP.2),外部中斷 0 優(yōu)先級(jí)設(shè)定位;
PT1(IP.3),定時(shí) / 計(jì)數(shù)器 T1 優(yōu)先級(jí)設(shè)定位;
PS(IP.4),串行口優(yōu)先級(jí)設(shè)定位;
PT2(IP.5),定時(shí) / 計(jì)數(shù)器 T2 優(yōu)先級(jí)設(shè)定位。
(1)同一優(yōu)先級(jí)中的中斷申請(qǐng)不止一個(gè)時(shí),則有中斷優(yōu)先權(quán)排隊(duì)問(wèn)題。同一優(yōu)先級(jí)的中斷優(yōu)先權(quán)排隊(duì),由中斷系統(tǒng)硬件確定的自然優(yōu)先級(jí)形成,其排列如所示:
(2)80C51單片機(jī)中斷優(yōu)先級(jí)三條原則:
(1)CPU同時(shí)接收到幾個(gè)中斷時(shí),首先響應(yīng)優(yōu)先級(jí)別最高的中斷請(qǐng)求。
(2)正在進(jìn)行的中斷過(guò)程不能被新的同級(jí)或低優(yōu)先級(jí)的中斷請(qǐng)求所中斷。
(3)正在進(jìn)行的低優(yōu)先級(jí)中斷服務(wù),能被高優(yōu)先級(jí)中斷請(qǐng)求所中斷。
為了實(shí)現(xiàn)上述后兩條原則,中斷系統(tǒng)內(nèi)部設(shè)有兩個(gè)用戶不能尋址的優(yōu)先級(jí)狀態(tài)觸發(fā)器。其中一個(gè)置 1,表示正在響應(yīng)高優(yōu)先級(jí)的中斷,它將阻斷后來(lái)所有的中斷請(qǐng)求;另一個(gè)置 1,表示正在響應(yīng)低優(yōu)先級(jí)中斷,它將阻斷后來(lái)所有的低優(yōu)先級(jí)中斷請(qǐng)求。
五、中斷響應(yīng)條件
(1)中斷源有中斷請(qǐng)求;
(2)此中斷源的中斷允許位為 1;
(3)CPU 開中斷(即EA= 1)。
六、中斷程序:
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;//段選
sbit wela = P2^7;//位選
sbit d1 = P1^0;//P1 口 0 號(hào) LED
uchar num;
uchar code table[]={ //LED 數(shù)字編碼
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
EA = 1;//開總中斷
EX0 = 1;//開外部中斷0
//IT0 = 1;
TCON = 0x01;
wela = 1;//11101010 打開鎖存器
P0 = 0xea;//選擇數(shù)碼管
wela = 0;//鎖住數(shù)碼管
while(1)
{
for(num = 0; num < 16; num++)
{
d1 = 1; //關(guān)閉LED
dula = 1;//打開鎖存器
P0 = table[num];//數(shù)碼管入值
dula = 0;//鎖住數(shù)碼管輸入值
delay(1000);//延時(shí)1s
}
}
}
void Delay(unsigned int xx) //輸入 xx :ms
{
while(xx--)
{
Delay1ms();
}
}
void Delay1ms()//@11.0592MHz 1ms
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void exter0() interrupt 0 //中斷程序,0 為 中斷號(hào)
{
d1=0;//打開LED
}