中斷是為單片機(jī)實(shí)時(shí)處理外部和內(nèi)部隨機(jī)機(jī)事情而設(shè)置的一項(xiàng)基本功能,中斷功能的存在,極大的提高了單片機(jī)處理外部和內(nèi)部事件的能力,目前幾乎所有單片機(jī)都會(huì)配置的這一項(xiàng)基本功能,而中斷功能的強(qiáng)弱也成為衡量一種單片機(jī)功能是否強(qiáng)大的重要指標(biāo)之一。作為單片機(jī)的學(xué)習(xí)者,中斷的概念及編程能力必須要靈活的掌握并學(xué)會(huì)應(yīng)用。
單片機(jī)中斷功能的強(qiáng)弱因單片機(jī)的種類不同而不同,51單片機(jī)的中斷功能相對簡單,內(nèi)部有5個(gè)中斷源,像一些高級的單片如飛思卡爾有上百個(gè)中斷源。但知識(shí)都是相通的,51單片機(jī)中斷的概念弄懂白了,其它單片機(jī)的也就是一個(gè)了解和熟悉的過程。
51單片機(jī)內(nèi)部總共有5個(gè)中斷源,分別外部中斷0、定時(shí)器中斷0、外部中斷0、定時(shí)器中斷1、串行中斷。后面的章節(jié)我們分別的進(jìn)行介紹,這一課我們以主要外部中斷0進(jìn)行介紹。
這里我們先介紹一些基本的概念、
一、中斷的概念
我們先來舉日常生活中的一個(gè)例子,如圖1所示,你正在專心看書,突然電話鈴響,于是你記下正在看的書的頁數(shù),去接電話,接完電話后再回來接著看書。這實(shí)際就是中斷的一個(gè)例子。
在單片機(jī)中,CPU在處理某一事件A時(shí),發(fā)生了另一事件B(中斷發(fā)生);CPU暫時(shí)中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B(中斷響應(yīng)和中斷服務(wù));處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回),這一過程稱為中斷,如圖2。
圖1 日常生活中中斷例子 圖2 單片機(jī)中中斷例子
下面有幾個(gè)中斷的概念需要記住:
中斷源:將能引起中斷的事件稱為中斷源,如電話鈴響,51單片機(jī)共有5個(gè)中斷源,分別為外部中斷0、定時(shí)器中斷0、外部中斷1、定時(shí)器中斷1、串口中斷。
斷點(diǎn):中斷發(fā)生的地方稱為斷點(diǎn)。
主程序:CPU現(xiàn)行運(yùn)行的程序稱為主程序,如看書。
中斷服務(wù)子程序:處理隨機(jī)事件的程序稱為中斷服務(wù)子程序,如接電話。
中斷系統(tǒng):實(shí)現(xiàn)中斷功能的部件稱為中斷系統(tǒng)。
二、MCS-51的中斷系統(tǒng)
51單片機(jī)中斷系統(tǒng)的結(jié)構(gòu)圖如圖3所求,總共有51個(gè)中斷源,分別如下。
圖3 51單片機(jī)中斷系統(tǒng)結(jié)構(gòu)圖
(1)INT0-外部中斷0,由P3.2端口引入,可設(shè)置為低電平觸發(fā)或下降沿觸發(fā)。
(2)INT1-外部中斷1,由P3.3端口引入,可設(shè)置為低電平觸發(fā)或下降沿觸發(fā)。
(3)T0-定時(shí)器/計(jì)數(shù)器中斷0,由內(nèi)部計(jì)數(shù)器計(jì)滿溢出觸發(fā)。
(4)T1-定時(shí)器/計(jì)數(shù)器中斷1,由內(nèi)部計(jì)數(shù)器計(jì)滿溢出觸發(fā)。
(5)TI/RI-串行口中斷,由串行口完成一幀字符發(fā)送/接受后觸發(fā)。
中斷系統(tǒng)是單片機(jī)內(nèi)部一個(gè)種要的功能模塊,從程序開發(fā)的角度講,對單片機(jī)內(nèi)部功能模塊結(jié)構(gòu)上不需要掌握得太深,因?yàn)橐尭鞴δ苣K發(fā)揮其強(qiáng)大的功能,只需要正確設(shè)置相應(yīng)寄存器就可以了,所以這里我們中斷的具體結(jié)構(gòu)這里我不過多分析,下面介紹相關(guān)的寄存器。
三、51單片機(jī)相關(guān)寄存器
51單片機(jī)內(nèi)部共有21個(gè)特殊功能寄存器, 編程時(shí)如用C語言編程中我們只需要撐握IP、IE、SCON、TCON、P1、P2、P3、P4、PCON TMOD、TL0、TH0、TL1、TH1、SBUF15個(gè)寄存器,如圖4所示,已用紅線和藍(lán)線標(biāo)出,注意紅線的能進(jìn)行位操作,藍(lán)線的不能進(jìn)行位操作。
圖4 51單片機(jī)特殊功能寄存器
這15寄存器中,根據(jù)前面講的51單片機(jī)內(nèi)部四大功能模塊又可分為四大部分:
I/O口相關(guān):P1、P2、 P3、 P4
中斷相關(guān):IP、 IE
定時(shí)器相關(guān):TMOD、 TCON、 TL0、TH0、TL1、TH1
串口通信相關(guān):SCON、 PCON、 SBUF
需要注意的是,在這四大部分中,除I/O口操作相關(guān)的P1、P2、P3、P4相對獨(dú)立外,其它11個(gè)寄存器使用時(shí)通常會(huì)相互結(jié)合使用,也就是說中斷、定時(shí)器和串口通信三者通常會(huì)結(jié)合起來用,如外部中斷時(shí),設(shè)置邊沿觸發(fā)還是電平觸發(fā)需設(shè)置TCON寄存器中的TR0和TR1位,使用定時(shí)器時(shí)又可能用到中斷,而串口通信時(shí)設(shè)置波特率又直接跟定時(shí)器相關(guān)。
這節(jié)里因?yàn)槲覀冎饕榻B外部中斷0,所以跟外部中斷相關(guān)的寄存器就只有IE、IP、TCON三個(gè),而對于初學(xué)都來說,IP寄存器(中斷優(yōu)先寄存器)一般用不到,所里這里只介紹IE(中斷允許寄存器)和TCON(定時(shí)器控制寄存器)。
(1)IE中斷允許寄存器
EA:EA=0時(shí),所有中斷禁止(即不產(chǎn)生中斷);EA=1時(shí),各中斷的產(chǎn)生由個(gè)別的允許位決定
ET2:定時(shí)2溢出中斷允許(8052用1允許, 0禁止)
ES:串行口中斷允許(1允許, 0禁止)
ET1):定時(shí)1中斷允許(1允許, 0禁止)
EX1:外中斷INT1中斷允許(1允許, 0禁止)
ET0:定時(shí)器0中斷允許(1允許, 0禁止)
EX0:外部中斷INT0的中斷允許(1允許, 0禁止)
(2)TCON定時(shí)器控制寄存器
TF1:定時(shí)器T1溢出標(biāo)志,可由程序查詢和清零,TF1也是中斷請求源,當(dāng)CPU響應(yīng)T1中斷時(shí)由硬件清零。
TF0:定時(shí)器T0溢出標(biāo)志,可由程序查詢和清零,TF0也是中斷請求源,當(dāng)CPU響應(yīng)T0中斷時(shí)由硬件清零。
TR1:T1充許計(jì)數(shù)控制位,為1時(shí)充許T1計(jì)數(shù)(定時(shí))。
TR0:T0充許計(jì)數(shù)控制位,為1時(shí)充許T0計(jì)數(shù)(定時(shí))。
IE1:外部中斷1請示源(INT1,P3.3)標(biāo)志。IE1=1,外部中斷1正在向CPU請求中斷,當(dāng)CPU響應(yīng)該中斷時(shí)由硬件清“0”IE1(邊沿觸發(fā)方式)。
IT1:外部中斷源1觸發(fā)方式控制位。IT1=0,外部中斷1程控為電平觸發(fā)方式,當(dāng)INT1(P3.3)輸入低電平時(shí),置位IE1。此位為1設(shè)置為電平觸發(fā),為0設(shè)置為下降沿觸發(fā)。
IE0:外部中斷0請示源(INT0,P3.2)標(biāo)志。IE0=1,外部中斷1正在向CPU請求中斷,當(dāng)CPU響應(yīng)該中斷時(shí)由硬件清“0”IE0(邊沿觸發(fā)方式)。
IT0:外部中斷源0觸發(fā)方式控制位。IT0=0,外部中斷1程控為電平觸發(fā)方式,當(dāng)INT0(P3.2)輸入低電平時(shí),置位IE0。此位為1設(shè)置為電平觸發(fā),為0設(shè)置為下降沿觸發(fā)。
四、外部中斷程序舉例
明白了寄存器后,下面我以外部中斷0為例寫一個(gè)程序,程序的功能為:在主程序里L(fēng)1燈常亮,當(dāng)外部腳P32檢測到有下降沿時(shí),L1燈熄滅。
我們先來分析下該程序的書寫思路。首先在主程序里我們應(yīng)該讓L1燈常亮;然后需要對中斷相關(guān)的寄存器進(jìn)行設(shè)置,主要為打開總中斷、打開外部中斷0,并且還需要設(shè)置外部中斷為低電平觸發(fā)方式;最后我們要寫一個(gè)中斷子函數(shù)。
相應(yīng)的程序如例一所示。
例一 外部中斷0程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1=P1^0;
void delay(uint z);
void main()
{
IT0=0;//設(shè)置為0低電平觸發(fā)
Eaa=1;//開總中斷
EX0=1;//開外部中斷0
while(1)
{
D1=1;
}
}
void exter0() interrupt 0
{
D1=0;
delay(500);//下降沿觸發(fā)時(shí)如果不延時(shí)觀察不到再現(xiàn)象
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
下載到實(shí)驗(yàn)板現(xiàn)象如圖5所示。
這里要注意的中斷子函數(shù)的寫法。51單片機(jī)中中斷子函數(shù)的格式如下:
void 函數(shù)名()interrupt 中斷號(hào)
{
中斷服務(wù)子程序的內(nèi)容
}
中斷函數(shù)不能返回任何值,所以前面用void;后面緊跟函數(shù)名,名字可以隨便取,但不要與C語言中的關(guān)鍵字相同;中斷函數(shù)不帶任何參數(shù),所以函數(shù)名后面的小括號(hào)內(nèi)為空;中斷號(hào)是指單片機(jī)中幾個(gè)中斷源的序號(hào),每個(gè)中斷源的中斷序號(hào)如圖6所示。這個(gè)中斷號(hào)是編譯器識(shí)別不同中斷的的唯一,必須書寫正確,否者單片機(jī)進(jìn)不了中斷子程序
圖6 52單片機(jī)的中斷號(hào)