在接下來的教程中,將會介紹定時器、串口通信等外設的基本使用,而這些外設的使用都要涉及中斷,而且中斷是單片機或嵌入式開發中一個相當重要的概念。不能掌握中斷系統,就無法靈活應用這些外設。
一、中斷定義
CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷 。
引起CPU中斷的根源,稱為中斷源。中斷源向CPU提出的中斷請求。CPU暫時中斷原來的事務A,轉去處理事件B。
對事件B處理完畢后,再回到原來被中斷的地方(即斷點),稱為中斷返回。實現上述中斷功能的部件稱為中斷系統。
二、51中斷結構
89C51/52的中斷系統有5個中斷源 ,2個優先級,可實現二級中斷嵌套 。
1、(P3.2)可由IT0(TCON.0)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.2引腳上出現有效的中斷信號時,中斷標志IE0(TCON.1)置1,向CPU申請中斷。
2、(P3.3)可由IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.3引腳上出現有效的中斷信號時,中斷標志IE1(TCON.3)置1,向CPU申請中斷。
3、TF0(TCON.5),片內定時/計數器T0溢出中斷請求標志。當定時/計數器T0發生溢出時,置位TF0,并向CPU申請中斷。
4、TF1(TCON.7),片內定時/計數器T1溢出中斷請求標志。當定時/計數器T1發生溢出時,置位TF1,并向CPU申請中斷。
5、RI(SCON.0)或TI(SCON.1),串行口中斷請求標志。當串行口接收完一幀串行數據時置位RI或當串行口發送完一幀串行數據時置位TI,向CPU申請中斷。
三、中斷配置
CPU對中斷系統的所有中斷以及某個中斷源的開發和屏蔽是由中斷允許寄存器IE控制的。
EA:中斷允許總開關控制位。(1:所有中斷請求被允許;0:所有中斷請求被屏蔽)
ES:串行口中斷允許控制位。(1:允許串口中斷;0:禁止串口中斷)
ET1:定時器/計數器T1的溢出中斷允許控制位。(1:允許T1溢出中斷;0:禁止T1溢出中斷)
EX1:外部中斷1中斷允許位。(1:允許外部中斷1中斷;0:禁止外部中斷1中斷)
ET0:定時器/計數器T0的溢出中斷允許控制位。(1:允許T1溢出中斷;0:禁止T1溢出中斷)
EX0:外部中斷0中斷允許位。(1:允許外部中斷1中斷;0:禁止外部中斷1中斷)
1、中斷請求標志
TOCN 的中斷標志IT0(TCON.0),外部中斷0觸發方式控制位。
當IT0=0時,為低電平觸發方式。
當IT0=1時,為邊沿觸發方式(下降沿有效)。
IE0(TCON.1),外部中斷0中斷請求標志位。
IT1(TCON.2),外部中斷1觸發方式控制位。
IE1(TCON.3),外部中斷1中斷請求標志位。
TF0(TCON.5),定時/計數器T0溢出中斷請求標志位。
TF1(TCON.7),定時/計數器T1溢出中斷請求標志位。
2、中斷優先級
外部中斷0(IE0)->定時/計數器0(TF0)->外部中斷1(IE1)->定時/計數器1(TF1)->串行口(R1或T1)
3、中斷源
外部中斷0(int0),對應中斷號是0,中斷入口地址0003h
定時/計數器0(t1),對應中斷號1,中斷入口地址000bh
外部中斷1(int1),對應中斷號2,中斷入口地址0013h
定時/計數器1(t1),對應中斷號3,中斷入口地址001bh
串行口中(ri/ti),對應中斷號4,中斷入口地址0023h
3、中斷相應條件
中斷源有中斷請求
此中斷源的中斷允許位為1
CPU開中斷(EA=1)
四、中斷定義
主程序中需要有以下代碼:
EA=1;//打開總中斷開關
EX0=1;//開外部中斷0
IT0=0/1;//設置外部中斷的觸發方式
中斷服務函數:
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;
}
}
-
單片機
+關注
關注
6035文章
44554瀏覽量
634653 -
定時器
+關注
關注
23文章
3246瀏覽量
114720 -
嵌入式開發
+關注
關注
18文章
1028瀏覽量
47563 -
串口通信
+關注
關注
34文章
1624瀏覽量
55508
發布評論請先 登錄
相關推薦
評論