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