在接下來(lái)的教程中,將會(huì)介紹定時(shí)器、串口通信等外設(shè)的基本使用,而這些外設(shè)的使用都要涉及中斷,而且中斷是單片機(jī)或嵌入式開(kāi)發(fā)中一個(gè)相當(dāng)重要的概念。不能掌握中斷系統(tǒng),就無(wú)法靈活應(yīng)用這些外設(shè)。
一、中斷定義
CPU在處理某一事件A時(shí),發(fā)生了另一事件B請(qǐng)求CPU迅速去處理(中斷發(fā)生);CPU暫時(shí)中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B(中斷響應(yīng)和中斷服務(wù));待CPU將事件B處理完畢后,再回到原來(lái)事件A被中斷的地方繼續(xù)處理事件A(中斷返回),這一過(guò)程稱(chēng)為中斷 。
引起CPU中斷的根源,稱(chēng)為中斷源。中斷源向CPU提出的中斷請(qǐng)求。CPU暫時(shí)中斷原來(lái)的事務(wù)A,轉(zhuǎn)去處理事件B。
對(duì)事件B處理完畢后,再回到原來(lái)被中斷的地方(即斷點(diǎn)),稱(chēng)為中斷返回。實(shí)現(xiàn)上述中斷功能的部件稱(chēng)為中斷系統(tǒng)。
二、51中斷結(jié)構(gòu)
89C51/52的中斷系統(tǒng)有5個(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)中斷。
三、中斷配置
CPU對(duì)中斷系統(tǒng)的所有中斷以及某個(gè)中斷源的開(kāi)發(fā)和屏蔽是由中斷允許寄存器IE控制的。
EA:中斷允許總開(kāi)關(guān)控制位。(1:所有中斷請(qǐng)求被允許;0:所有中斷請(qǐng)求被屏蔽)
ES:串行口中斷允許控制位。(1:允許串口中斷;0:禁止串口中斷)
ET1:定時(shí)器/計(jì)數(shù)器T1的溢出中斷允許控制位。(1:允許T1溢出中斷;0:禁止T1溢出中斷)
EX1:外部中斷1中斷允許位。(1:允許外部中斷1中斷;0:禁止外部中斷1中斷)
ET0:定時(shí)器/計(jì)數(shù)器T0的溢出中斷允許控制位。(1:允許T1溢出中斷;0:禁止T1溢出中斷)
EX0:外部中斷0中斷允許位。(1:允許外部中斷1中斷;0:禁止外部中斷1中斷)
1、中斷請(qǐng)求標(biāo)志
TOCN 的中斷標(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、中斷優(yōu)先級(jí)
外部中斷0(IE0)->定時(shí)/計(jì)數(shù)器0(TF0)->外部中斷1(IE1)->定時(shí)/計(jì)數(shù)器1(TF1)->串行口(R1或T1)
3、中斷源
外部中斷0(int0),對(duì)應(yīng)中斷號(hào)是0,中斷入口地址0003h
定時(shí)/計(jì)數(shù)器0(t1),對(duì)應(yīng)中斷號(hào)1,中斷入口地址000bh
外部中斷1(int1),對(duì)應(yīng)中斷號(hào)2,中斷入口地址0013h
定時(shí)/計(jì)數(shù)器1(t1),對(duì)應(yīng)中斷號(hào)3,中斷入口地址001bh
串行口中(ri/ti),對(duì)應(yīng)中斷號(hào)4,中斷入口地址0023h
3、中斷相應(yīng)條件
中斷源有中斷請(qǐng)求
此中斷源的中斷允許位為1
CPU開(kāi)中斷(EA=1)
四、中斷定義
主程序中需要有以下代碼:
EA=1;//打開(kāi)總中斷開(kāi)關(guān)
EX0=1;//開(kāi)外部中斷0
IT0=0/1;//設(shè)置外部中斷的觸發(fā)方式
中斷服務(wù)函數(shù):
void int0 () interrupt 0 using 1 // using 1 不用寫(xiě)也不用管
{
do anything that you want
}
五、程序舉例
#include
sbit led =P2^1;
void main()
{
EA=1; //開(kāi)啟總中斷,這個(gè)相當(dāng)于校長(zhǎng)
TMOD =0x01;
TH0=(65536-48300)/256; //50ms
TL0=(65536-48300)%256;
TR0=1; // 打開(kāi)定時(shí)器T0
ET0=1; //允許中斷 這個(gè)相當(dāng)于班主任,只有校長(zhǎng)和班主任同意中斷才能中斷
while(1)
{
;
}
}
void time0() interrupt 1
{
unsigned int count;
TF0=0; //注意TF0同時(shí)是中斷請(qǐng)求標(biāo)志位,
//TF0=1,請(qǐng)求中斷
TH0=(65536-48300)/256; //50ms 裝初值
TL0=(65536-48300)%256;
count+=1;
if(count>=20)
{
led=~led;
count=0;
}
}
-
單片機(jī)
+關(guān)注
關(guān)注
6042文章
44617瀏覽量
637483 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115169 -
嵌入式開(kāi)發(fā)
+關(guān)注
關(guān)注
18文章
1035瀏覽量
47655 -
串口通信
+關(guān)注
關(guān)注
34文章
1627瀏覽量
55653
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論