所謂的中斷就是:
做事:
在做A事情的時候,被打斷去做B事情,回來后再返回繼續(xù)做A事情。
程序:
在執(zhí)行A程序的時候,打斷轉(zhuǎn)而執(zhí)行B程序,完成后B程序后繼續(xù)返回執(zhí)行A程序。
簡而言之,如下:
52單片機一共有6個中斷源,他們的符號、名稱及產(chǎn)生的條件分別解釋如下:
6個中斷源中,其默認的中斷級別如下:
中斷允許寄存器_IE
EA=1;開全局中斷
ET2=1;打開T2中斷(僅52有T2中斷)
ES=1;打開串行口中斷
ET1=1;打開T1中斷
EX1=1;打開外部中斷1中斷
EX0=1;打開外部中斷0中斷
中斷優(yōu)先級寄存器_IP
PS=1;串行口中斷定義為高優(yōu)先級
PT1=1;定時器/計數(shù)器1中斷定義為高優(yōu)先級
PX1=1;外部中斷1中斷定義為高優(yōu)先級
PT0=1;定時器/計數(shù)器0定義為高優(yōu)先級中斷
PX0=1;外部中斷0中斷定義為高優(yōu)先級
注意:當以上值為零時,則自然被定義為低優(yōu)先級中斷。
定時器/計數(shù)器工作方式寄存器_TMOD
GATE:門控位
C/T:模式選擇,計數(shù)器方式:C/T=1;定時器模式:C/T=0
M0M1:工作方式選擇
每個定時器/計數(shù)器均有4種工作方式,其主要有M0M1確定:
定時器/計數(shù)器控制寄存器_TCON
TF1:定時器1溢出標志位
當定時器1計數(shù)滿時,有硬件置位,并申請中斷,進入中斷后,由硬件自動清零。
備注:使用定時器中斷,改為無需人工操作,如使用軟件查詢的時候,查詢到改位為1,徐軟件清零。
TR1=1;啟動定時器1
TF0;定時器0溢出標志,同TF1。
TR0=1;啟動定時器0
IE1;IT1=0時,電平觸發(fā),INT1腳為底時置1。IT1=1時,跳變沿觸發(fā),第一個機器周期采樣INT1為低IE置1
IT1=0;電平觸發(fā)方式,引腳INTI1上低電平有效
IT1=1;跳變沿觸發(fā)方式,引腳INTI1上的電平從高到低的負跳變沿有效
IE0;外部中斷0請求標志,同IE1
IT0:外部中斷0觸發(fā)方式選擇位同IT1。
通常定時器初始化過程如下:
對TMOD賦值,以確定T0和T1的工作方式
計算初值,并將初值寫入TH0、TL0和TH1、TL1
中斷方式時,則對IE賦值,開放中斷
使TR0或者TR1置位,啟動定時器/計數(shù)器定時或者計數(shù)
程序?qū)缦拢?br/>//定時器0工作方式1
TMOD=0X01; //定時器0工作方式1(M1M0為01)
TH0=(65536-45872)/256; //裝初值,11.0592MHz晶振定時50ms,數(shù)為45872
TL0=(65536-45872)%6;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
while(1){}; //程序停止在此處等待中斷發(fā)生
//定時器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){}; //程序停止在此處等待中斷發(fā)生
備注:(8192-4607)/32對32求模是因為定時器方式0為13位計數(shù)器,
計數(shù)時只用了TL0的低五位。
五位最多裝在32個數(shù),再加1便會進位。與16為計數(shù)器裝在256個數(shù)不同。因此此處對32求模。
//定時器0工作方式2
TMOD=0X02; //定時器0工作方式0(M1M0為02)
TH0=6; //裝初值
TL0=6;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
while(1){}; //程序停止在此處等待中斷發(fā)生
//定時器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){}; //程序停止在此處等待中斷發(fā)生
注:TL0占用定時器T1的中斷請求標志,因此為了避免沖突,設計程序時,T0的方式3不可用在有中斷的場合。
中斷方式的寫法:
void T0_time() interrupt 1//定時器0中斷
{
}
void T1_time() interrupt 3 //定時器1中斷
{
}
定時器T2的介紹
其為16位的定時器計數(shù)器。
通過設置特殊功能寄存器T2CON的C/T2位,可以將其設定為定時器或者計數(shù)器
通過T2CON中的工作模式選擇位,可將定時器2設置為三種工作模式:捕獲、自動重新裝載、波特率發(fā)聲器。
捕獲:捕捉某一瞬間的值,通常用他來測量外部某個脈沖的寬度或周期,使用捕獲功能可以非常準確的測試脈沖寬度和周期。
定時器2控制器存器_T2CON
TF2;定時器2溢出時置位,必須由軟件清零,當RCLK=1或TCLK=1時,TF2 將不會置位。
EXF2;當EXEN2=1且T2EX(單片機P1.1口)的負跳變產(chǎn)生捕獲或重裝時,EXF2置位。
定時器2中斷使能時,EXF2=1將是CPU進入定時器2的中斷服務程序。
EXF2必須用軟件清零。在遞增(遞減)計數(shù)模式(DCEN=1),EXF2不會引起中斷
RCLK;接收時鐘標志
RCLK=1時,定時器2的溢出脈沖作為串行口模式1或模式3的接收時鐘,
RCLK=0時,將定時器1的溢出脈沖作為接收時鐘。
TCLK;發(fā)送時鐘標志
TCLK=1時,定時器2的溢出脈沖作為串行口模式1或模式3的發(fā)送時鐘,
TCLK=0時,將定時器1的溢出脈沖作為發(fā)送時鐘。
EXEN2;定時器2外部使能標志
EXEN2=1且定時器2未作為串行口時鐘時,允許T2EX的負跳變產(chǎn)生捕獲獲重裝,
EXEN2=0時,T2EX的跳變對定時器2無效
TR2;置1啟動定時器,置零停止定時器2
C/T2;T2的定時器/計數(shù)器選擇位
C/T2=1,外部事件計數(shù)器(下降沿觸發(fā))
C/T2=0,內(nèi)部定時器
CP/RL2;捕獲重裝標志
CP/RL2=1且EXEN2=1,T2EX的負跳變產(chǎn)生捕獲
CP/RL2=0且EXEN2=0,定時器2溢出或T2EX的負跳變都可是定時器自動重裝,
當RCLK=1或TCLK=1時,該位無效且定時器強制為溢出時自動重裝。
定時器/計數(shù)器2的三中工作模式
定時器2模式控制寄存器
設定自動重裝模式為遞增還是遞減。
T2OE;定時器2使能輸出位
DCEN;向下計數(shù)使能位
波特率發(fā)聲器_T2定時器
寄存器T2CON的TCLK和RCLK允許從定時器1或定時器2獲得串行口接收和發(fā)送的波特率
TCLK=0,定時器1作為串行口發(fā)送波特率發(fā)生器
TCLK=1,定時器2作為串行口發(fā)送波特率發(fā)生器
除了波特率發(fā)聲器模式,T2CON不包含TR2位的設置,TR2為需要單獨設置來啟動定時器。