所謂的中斷就是:
做事:
在做A事情的時候,被打斷去做B事情,回來后再返回繼續做A事情。
程序:
在執行A程序的時候,打斷轉而執行B程序,完成后B程序后繼續返回執行A程序。
簡而言之,如下:

52單片機一共有6個中斷源,他們的符號、名稱及產生的條件分別解釋如下:

6個中斷源中,其默認的中斷級別如下:

中斷允許寄存器_IE

EA=1;開全局中斷
ET2=1;打開T2中斷(僅52有T2中斷)
ES=1;打開串行口中斷
ET1=1;打開T1中斷
EX1=1;打開外部中斷1中斷
EX0=1;打開外部中斷0中斷
中斷優先級寄存器_IP

PS=1;串行口中斷定義為高優先級
PT1=1;定時器/計數器1中斷定義為高優先級
PX1=1;外部中斷1中斷定義為高優先級
PT0=1;定時器/計數器0定義為高優先級中斷
PX0=1;外部中斷0中斷定義為高優先級
注意:當以上值為零時,則自然被定義為低優先級中斷。
定時器/計數器工作方式寄存器_TMOD

GATE:門控位
C/T:模式選擇,計數器方式:C/T=1;定時器模式:C/T=0
M0M1:工作方式選擇
每個定時器/計數器均有4種工作方式,其主要有M0M1確定:

定時器/計數器控制寄存器_TCON

TF1:定時器1溢出標志位
當定時器1計數滿時,有硬件置位,并申請中斷,進入中斷后,由硬件自動清零。
備注:使用定時器中斷,改為無需人工操作,如使用軟件查詢的時候,查詢到改位為1,徐軟件清零。
TR1=1;啟動定時器1
TF0;定時器0溢出標志,同TF1。
TR0=1;啟動定時器0
IE1;IT1=0時,電平觸發,INT1腳為底時置1。IT1=1時,跳變沿觸發,第一個機器周期采樣INT1為低IE置1
IT1=0;電平觸發方式,引腳INTI1上低電平有效
IT1=1;跳變沿觸發方式,引腳INTI1上的電平從高到低的負跳變沿有效
IE0;外部中斷0請求標志,同IE1
IT0:外部中斷0觸發方式選擇位同IT1。
通常定時器初始化過程如下:
對TMOD賦值,以確定T0和T1的工作方式
計算初值,并將初值寫入TH0、TL0和TH1、TL1
中斷方式時,則對IE賦值,開放中斷
使TR0或者TR1置位,啟動定時器/計數器定時或者計數
程序對應如下:
//定時器0工作方式1
TMOD=0X01; //定時器0工作方式1(M1M0為01)
TH0=(65536-45872)/256; //裝初值,11.0592MHz晶振定時50ms,數為45872
TL0=(65536-45872)%6;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
while(1){}; //程序停止在此處等待中斷發生
//定時器0工作方式0
TMOD=0X00; //定時器0工作方式0(M1M0為00)
TH0=(8192-4607)/32; //裝初值
TL0=(8192-4607)2;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
while(1){}; //程序停止在此處等待中斷發生
備注:(8192-4607)/32 對32求模是因為定時器方式0為13位計數器,
計數時只用了TL0的低五位。
五位最多裝在32個數,再加1便會進位。與16為計數器裝在256個數不同。因此此處對32求模。
//定時器0工作方式2
TMOD=0X02; //定時器0工作方式0(M1M0為02)
TH0=6; //裝初值
TL0=6;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
while(1){}; //程序停止在此處等待中斷發生
//定時器0工作方式3
TMOD=0X03; //定時器0工作方式0(M1M0為03)
TH0=6; //裝初值
TL0=6;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
ET1=1; //開定時器1中斷
TR0=1; //啟動定時器0
TR1=1; //啟動定時器1
while(1){}; //程序停止在此處等待中斷發生
注:TL0占用定時器T1的中斷請求標志,因此為了避免沖突,設計程序時,T0的方式3不可用在有中斷的場合。
中斷方式的寫法:
void T0_time() interrupt 1 //定時器0中斷
{
}
void T1_time() interrupt 3 //定時器1中斷
{
}
定時器T2的介紹
其為16位的定時器計數器。
通過設置特殊功能寄存器T2CON的C/T2位,可以將其設定為定時器或者計數器
通過T2CON中的工作模式選擇位,可將定時器2設置為三種工作模式:捕獲、自動重新裝載、波特率發聲器。
捕獲:捕捉某一瞬間的值,通常用他來測量外部某個脈沖的寬度或周期,使用捕獲功能可以非常準確的測試脈沖寬度和周期。
定時器2控制器存器_T2CON

TF2;定時器2溢出時置位,必須由軟件清零,當RCLK=1或TCLK=1時,TF2 將不會置位。
EXF2;當EXEN2=1且T2EX(單片機P1.1口)的負跳變產生捕獲或重裝時,EXF2置位。
定時器2中斷使能時,EXF2=1將是CPU進入定時器2的中斷服務程序。
EXF2必須用軟件清零。在遞增(遞減)計數模式(DCEN=1),EXF2不會引起中斷
RCLK;接收時鐘標志
RCLK=1時,定時器2的溢出脈沖作為串行口模式1或模式3的接收時鐘,
RCLK=0時,將定時器1的溢出脈沖作為接收時鐘。
TCLK;發送時鐘標志
TCLK=1時,定時器2的溢出脈沖作為串行口模式1或模式3的發送時鐘,
TCLK=0時,將定時器1的溢出脈沖作為發送時鐘。
EXEN2;定時器2外部使能標志
EXEN2=1且定時器2未作為串行口時鐘時,允許T2EX的負跳變產生捕獲獲重裝,
EXEN2=0時,T2EX的跳變對定時器2無效
TR2;置1啟動定時器,置零停止定時器2
C/T2;T2的定時器/計數器選擇位
C/T2=1,外部事件計數器(下降沿觸發)
C/T2=0,內部定時器
CP/RL2;捕獲重裝標志
CP/RL2=1且EXEN2=1,T2EX的負跳變產生捕獲
CP/RL2=0且EXEN2=0,定時器2溢出或T2EX的負跳變都可是定時器自動重裝,
當RCLK=1或TCLK=1時,該位無效且定時器強制為溢出時自動重裝。
定時器/計數器2的三中工作模式

定時器2模式控制寄存器

設定自動重裝模式為遞增還是遞減。
T2OE;定時器2使能輸出位
DCEN;向下計數使能位
波特率發聲器_T2定時器
寄存器T2CON的TCLK和RCLK允許從定時器1或定時器2獲得串行口接收和發送的波特率
TCLK=0,定時器1作為串行口發送波特率發生器
TCLK=1,定時器2作為串行口發送波特率發生器
除了波特率發聲器模式,T2CON不包含TR2位的設置,TR2為需要單獨設置來啟動定時器。
|