當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 單片機(jī)學(xué)習(xí) > 單片機(jī)教程 > 51單片機(jī)中斷概念及操作詳解
51單片機(jī)中斷概念及操作詳解
中斷的意思就是中止當(dāng)前的工作,然后去執(zhí)行另外的任務(wù),執(zhí)行完之后再回來(lái)執(zhí)行原來(lái)的任務(wù)。比如說(shuō)你正在看書,突然電話響了,你接完電話,又接著看書,這就是中斷。上面的程序就是設(shè)置定時(shí)器中斷的,定時(shí)器中斷是這樣的,當(dāng)定時(shí)器記滿65535之后,就會(huì)溢出,溢出就會(huì)觸發(fā)中斷,中斷完成后又接著計(jì)數(shù),當(dāng)然,如果你想每次定時(shí)時(shí)間一樣長(zhǎng)的話,也要在中斷服務(wù)程序中重新裝入初值。
一.中斷的概念
中斷發(fā)生
CPU在處理某一事件A時(shí),發(fā)生了另一事件B請(qǐng)求CPU迅速去處理
中斷響應(yīng)和中斷服務(wù)
CPU暫時(shí)中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B
中斷返回
待CPU將事件B處理完畢后,再回到原來(lái)事件A被中斷的地方繼續(xù)處理事件A
這一過(guò)程稱為中斷
二.中斷過(guò)程示意圖
三.MCS51中斷系統(tǒng)的結(jié)構(gòu)
MCS51的中斷系統(tǒng)有5個(gè)中斷源(8052有 6個(gè)) ,2個(gè)優(yōu)先級(jí),可實(shí)現(xiàn)二級(jí)中斷嵌套
中斷編號(hào) 中斷名 中斷源
0 外部中斷0 IE0(P3.2)
1 定時(shí)器0溢出中斷 TF0
2 外部中斷1 IE1(P3.3)
3 定時(shí)器1溢出中斷 TF1
4 串行口中斷 RI
四.中斷寄存器
單片機(jī)有10個(gè)寄存器主要與中斷程序的書寫控制有關(guān)
中斷允許控制寄存器IE
定時(shí)器控制寄存器TCON
串口控制寄存器SCON
中斷優(yōu)先控制寄存器IP
定時(shí)器工作方式控制寄存器TMOD
定時(shí)器初值賦予寄存器(TH0/TH1,TL0/TL1)
五.部分寄存器詳解
1.中斷允許控制寄存器(IE)
EX0:外部中斷0允許位;
ET0:定時(shí)/計(jì)數(shù)器T0中斷允許位;
EX1:外部中斷1允許位;
ET1:定時(shí)/計(jì)數(shù)器T1中斷允許位;
ES :串行口中斷允許位;
EA :CPU中斷允許(總允許)位。
2.定時(shí)器/計(jì)數(shù)器控制寄存器控制寄存器(TCON)
IT0:外部中斷0觸發(fā)方式控制位
當(dāng)IT0=0時(shí),為電平觸發(fā)方式(低電平有效)
當(dāng)IT0=1時(shí),為邊沿觸發(fā)方式(下降沿有效)
IE0:外部中斷0中斷請(qǐng)求標(biāo)志位
IT1:外部中斷1觸發(fā)方式控制位
IE1:外部中斷1中斷請(qǐng)求標(biāo)志位
TF0:定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志位
TF1:定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志位
3.串行口控制寄存器(SCON)
RI:串行口接收中斷標(biāo)志位。當(dāng)允許串行口接收數(shù)據(jù)時(shí),每接收完一個(gè)串行幀,由硬件置位RI。注意,RI必須由軟件清除。
TI:串行口發(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必須由軟件清除。
4.中斷優(yōu)先級(jí)控制寄存器(IP)
PX0:外部中斷0優(yōu)先級(jí)設(shè)定位
PT0:定時(shí)/計(jì)數(shù)器T0優(yōu)先級(jí)設(shè)定位
PX1:外部中斷0優(yōu)先級(jí)設(shè)定位
PT1:定時(shí)/計(jì)數(shù)器T1優(yōu)先級(jí)設(shè)定位
PS :串行口優(yōu)先級(jí)設(shè)定位
PT2:定時(shí)/計(jì)數(shù)器T2優(yōu)先級(jí)設(shè)定位
六.中斷響應(yīng)條件
中斷源有中斷請(qǐng)求
此中斷源的中斷允許位為1
開中斷(即EA=1)
一.定時(shí)器相關(guān)寄存器
工作方式寄存器(TMOD)
該寄存器用于設(shè)置定時(shí)/計(jì)數(shù)器的工作方式,低四位用于定時(shí)器0,高四位用于定時(shí)器1。
GATE:門控位。GATE=0時(shí),只要用軟件使TCON中的TR0或TR1為1,就可以啟動(dòng)定時(shí)/計(jì)數(shù)器工作;GATA=1時(shí),要用軟件使TR0或TR1為1,同時(shí)外部中斷引腳INT0/1也為高電平時(shí),才能啟動(dòng)定時(shí)/計(jì)數(shù)器工作。即此時(shí)定時(shí)器的啟動(dòng)條件,加上了INT0/1引腳為高電平這一條件。
C/T:定時(shí)/計(jì)數(shù)模式選擇位。C/T=0為定時(shí)模式;C/T=1為計(jì)數(shù)模式。
定時(shí)器/計(jì)數(shù)器控制寄存器控制寄存器(TCON)
該寄存器的低4位用于控制外部中斷,已在前面介紹,高4位用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)和中斷申請(qǐng)。
TF1:T1溢出中斷請(qǐng)求標(biāo)志位。T1計(jì)數(shù)溢出時(shí)由硬件自動(dòng)置TF1為1。CPU響應(yīng)中斷后TF1由硬件自動(dòng)清0。
TR1:T1運(yùn)行控制位。TR1置1時(shí),T1開始工作;TR1置0時(shí),T1停止工作。TR1由軟件置1或清0。所以,用軟件可控制定時(shí)/計(jì)數(shù)器的啟動(dòng)與停止。
TF0:T0溢出中斷請(qǐng)求標(biāo)志位,其功能與TF1類同。
TR0:T0運(yùn)行控制位,其功能與TR1類同。
中斷允許控制寄存器(IE)
ET0:定時(shí)/計(jì)數(shù)器T0中斷允許位;
ET1:定時(shí)/計(jì)數(shù)器T1中斷允許位;
EA :CPU中斷允許(總允許)位。
二.定時(shí)器溢出中斷的處理過(guò)程
1、設(shè)置定時(shí)器工作方式
2、為定時(shí)器裝入初值
3、定時(shí)器中斷允許位置為1
4、開總中斷
5、開定時(shí)器,等待產(chǎn)生溢出中斷請(qǐng)求
三.實(shí)現(xiàn)簡(jiǎn)單時(shí)鐘
說(shuō)明:
1.使用動(dòng)態(tài)數(shù)碼管顯示
2.選擇工作方式1,以16位的定時(shí)器0進(jìn)行工作,即TMOD=0x01,中斷編號(hào)為1;
3.定時(shí)50ms,即每隔50ms產(chǎn)生一次中斷:
TH0=(65536-50000)/256; //16位定時(shí)器的高8位
TL0=(65536-50000)%256; //16位定時(shí)器的低8位
具體的時(shí)間與單片機(jī)的晶振有關(guān),請(qǐng)了解機(jī)器周期、指令周期、時(shí)鐘周期等相關(guān)知識(shí)。
#include
#define uchar unsigned char
#define uint unsigned int
uchar hour,min,sec;
uchar code wei[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共陰極數(shù)碼管位選編碼
uchar code duan[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x01}; //共陰極數(shù)碼管段選編碼
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void timer0_init()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
uchar i;
timer0_init();
while(1)
{
num[0]=duan[hour/10];
num[1]=duan[hour%10];
num[2]=0x40; //顯示一橫
num[3]=duan[min/10];
num[4]=duan[min%10];
num[5]=0x40; //顯示一橫
num[6]=duan[sec/10];
num[7]=duan[sec%10];
for(i=0; i<8; i++) //顯示部分
{
P0=wei[i]; //位選
P1=num[i]; //段選
delay(2);
P1=0x00; //消隱
}
}
/*啟動(dòng)定時(shí)器后,沒次計(jì)數(shù)溢出就會(huì)進(jìn)入中斷服務(wù)函數(shù),重新賦初值,再進(jìn)行計(jì)數(shù),來(lái)達(dá)到定時(shí)的效果*/
void timer0() interrupt 1 //定時(shí)器中斷服務(wù)函數(shù)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(hour==24)
hour=0;
if(min==60)
{
hour++;
min=0;
}
if(sec==60)
{
min++;
sec=0;
}
if(t==20)
{
sec++;
t=0;
}
}