CPU在執行的過程中,一般來說都是在執行主程序(main函數里面的代碼)。如果希望處理其他的功能,可以通過查詢的方式進行,判斷是否需要處理或者通過中斷的方式,進入中斷服務函數程序里面執行。
前者是在主程序中判斷條件是否成立,如果成立則執行其他功能,否則不執行;后者是CPU在執行過程中,判斷是否有中斷標志位,響應中斷進入中斷服務函數,執行相關功能。
MCS-51 單片機中,有兩個外部中斷(INT0與INT1),中斷有兩種方式低電平觸發與負跳變(下降沿)觸發。
下面通過講INT0說明外部中斷,INT1同理。
原理圖:
P0連接8個LED,INT0引腳連接一個按鈕連接到地。
在中斷系統中,INT0設計的寄存器中有IE、IP、TCON,在C51規定特殊寄存器的地址為8的倍數均可以位尋址。IE寄存器地址為:0xA8;IP寄存器地址為0xB8;TCON寄存器地址為0x88;因此它們可以被位尋址。
以下是它們的位定義。
/* TCON */
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
/* IE */
sbit EA = IE^7;
sbit ET2 = IE^5; //8052 only
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
/* IP */
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
如果需要使用外部中斷,需要滿足以下條件
1)中斷中允許設置(置1)EA = 1;
2)中斷源允許設置(置1)Ex0 = 1;
3)中斷觸發方式設置(置1或置0) IT0 =1 或者 IT0 = 0;
4)中斷服務函數
代碼實現
#include "reg52.h"
#include "stdio.h"
void main(){
IT0 = 1;
EA = 1;
EX0 = 1;
while(1){};
}
void irq0(void) interrupt 0
{
P0=~P0;
}
注:由于IT0 =1;設置中斷觸發方式為負跳變(下降沿),CPU相應中斷后清除中斷標志位。而由于IT0 =0;設置中斷觸發方式為低電平觸發,CPU相應中斷后不會清除中斷標志位。
在上面的中斷服務功能中表現,按一下LED燈亮,再按一次LED燈滅;
如果將IT0設置為0,則按下時LED會閃爍。因為中斷標志位沒有清除,不斷進入中斷服務函數。
如果需要設置外部中斷1,負跳變觸發。只需要改上面代碼的三條語句即可。
IT0 = 1; ---- > IT1 = 1;
EX0 = 1; ---- > EX1 = 1;
void irq0(void) interrupt 0 -- > 修改終端號,將0 修改為2;
void irq0(void) interrupt 2 ---- >函數名irq0,可根據需要修改或不改
-
單片機
+關注
關注
6037文章
44559瀏覽量
635512 -
寄存器
+關注
關注
31文章
5343瀏覽量
120401 -
cpu
+關注
關注
68文章
10868瀏覽量
211844 -
51單片機
+關注
關注
274文章
5704瀏覽量
123647 -
外部中斷
+關注
關注
1文章
131瀏覽量
15828
發布評論請先 登錄
相關推薦
評論