目錄
單片機(jī)的內(nèi)部結(jié)構(gòu)
中斷請(qǐng)求標(biāo)志寄存器
(1)TCON寄存器
(2)SCON寄存器
(3)定時(shí)器2的控制寄存器T2CON
中斷允許與中斷優(yōu)先級(jí)的控制寄存器
中斷允許寄存器IE
中斷優(yōu)先級(jí)寄存器IP
響應(yīng)中斷請(qǐng)求的條件
外部中斷響應(yīng)時(shí)間
外部中斷的觸發(fā)方式選擇
中斷請(qǐng)求的撤銷
1.定時(shí)器/計(jì)數(shù)器T0、T1中斷請(qǐng)求的撤銷
2.外部中斷請(qǐng)求的撤銷
(1)跳沿方式外部中斷請(qǐng)求的撤銷
(2)電平方式外部中斷請(qǐng)求的撤銷
3.串行口中斷請(qǐng)求的撤銷
4.定時(shí)器/計(jì)數(shù)器T2中斷請(qǐng)求的撤銷
中斷服務(wù)子程序的設(shè)計(jì)
1.中斷服務(wù)子程序設(shè)計(jì)的任務(wù)
2.采用中斷時(shí)的主程序結(jié)構(gòu)
3.中斷服務(wù)子程序的流程
(1)現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)
(2) 關(guān)中斷和開(kāi)中斷
4.外部中斷源系統(tǒng)設(shè)計(jì)
用優(yōu)先權(quán)編碼器擴(kuò)展外部中斷源
中斷系統(tǒng)是為使CPU具有對(duì)外界緊急事件的實(shí)時(shí)處理能力而設(shè)置的。
當(dāng)中央處理機(jī)CPU正在處理某件事的時(shí)候外界發(fā)生了緊急事件請(qǐng)求,要求CPU暫停當(dāng)前的工作,轉(zhuǎn)而去處理這個(gè)緊急事件,處理完以后,再回到原來(lái)被中斷的地方,繼續(xù)原來(lái)的工作,這樣的過(guò)程稱為中斷,實(shí)現(xiàn)這種功能的部件稱為中斷系統(tǒng),請(qǐng)示CPU中斷的請(qǐng)求源稱為中斷源。微型機(jī)的中斷系統(tǒng)一般允許多個(gè)中斷源,當(dāng)幾個(gè)中斷源同時(shí)向CPU請(qǐng)求中斷,要求為它服務(wù)的時(shí)候,這就存在CPU優(yōu)先響應(yīng)哪一個(gè)中斷源請(qǐng)求的問(wèn)題。通常根據(jù)中斷源的輕重緩急排隊(duì),優(yōu)先處理最緊急事件的中斷請(qǐng)求源,即規(guī)定每一個(gè)中斷源有一個(gè)優(yōu)先級(jí)別。CPU總是先響應(yīng)優(yōu)先級(jí)別最高的中斷請(qǐng)求。
中斷技術(shù)主要用于實(shí)時(shí)監(jiān)測(cè)與控制,要求單片機(jī)能及時(shí)地響應(yīng)中斷請(qǐng)求源提出的服務(wù)請(qǐng)求,并作出快速響應(yīng)、及時(shí)處理。這是由片內(nèi)的中斷系統(tǒng)來(lái)實(shí)現(xiàn)的。
當(dāng)CPU正在處理一個(gè)中斷源請(qǐng)求的時(shí)候(執(zhí)行相應(yīng)的中斷服務(wù)程序),發(fā)生了另外一個(gè)優(yōu)先級(jí)比它還高的中斷源請(qǐng)求。如果CPU能夠暫停對(duì)原來(lái)中斷源的服務(wù)程序,轉(zhuǎn)而去處理優(yōu)先級(jí)更高的中斷請(qǐng)求源,處理完以后,再回到原低級(jí)中斷服務(wù)程序,這樣的過(guò)程稱為中斷嵌套。這樣的中斷系統(tǒng)稱為多級(jí)中斷系統(tǒng),沒(méi)有中斷嵌套功能的中斷系統(tǒng)稱為單級(jí)中斷系統(tǒng)。
單片機(jī)的內(nèi)部結(jié)構(gòu)
中斷系統(tǒng)有6個(gè)中斷請(qǐng)求源(簡(jiǎn)稱中斷源),兩個(gè)中斷優(yōu)先級(jí),可實(shí)現(xiàn)兩級(jí)中斷服務(wù)程序嵌套。
每一中斷源可用軟件獨(dú)立控制為允許中斷或關(guān)中斷狀態(tài),中斷優(yōu)先級(jí)均可用軟件來(lái)設(shè)置。
(1)INT0(外部中斷0)
由圖可知,INT0可以通過(guò)兩種方式觸發(fā):
?TCON.0/IT0=0,經(jīng)過(guò)反向器后變?yōu)?,那么IE0=1,標(biāo)志此中斷即將被觸發(fā)
?TCON.0/IT1=1,經(jīng)過(guò)下降沿,由高電平變?yōu)榈碗娖?,那么IE0=1,標(biāo)志此中斷即將被觸發(fā)?
接下來(lái)將中斷允許控制寄存器中的EX0分開(kāi)關(guān)和總開(kāi)關(guān)EA閉合,再由中斷優(yōu)先級(jí)控制寄存器IP中的PX0置0或置1,控制優(yōu)先級(jí)
INT0與INT1原理相同
(2)T0:
定時(shí)器/計(jì)數(shù)器T0計(jì)數(shù)溢出發(fā)出的中斷請(qǐng)求,中斷請(qǐng)求標(biāo)志為T(mén)F0
當(dāng)TF0=1,向CPU發(fā)出申請(qǐng)中斷。
T0與T1 原理相同
(3)T2
定時(shí)器/計(jì)數(shù)器T2的中斷請(qǐng)求源,含有計(jì)數(shù)溢出 (TF2)和“捕捉”(EXF2)兩種中斷請(qǐng)求標(biāo)志,可以通過(guò)兩種方式執(zhí)行中斷服務(wù):
?在方式0下,T2作為一個(gè)16位定時(shí)器,計(jì)數(shù)器的初值從TH2和TL2中讀入,當(dāng)計(jì)數(shù)器遞增到0xFFFF時(shí),會(huì)產(chǎn)生計(jì)數(shù)溢出中斷請(qǐng)求,TF2標(biāo)志位被置為1,同時(shí)觸發(fā)中斷請(qǐng)求。此時(shí),CPU會(huì)響應(yīng)該中斷請(qǐng)求,并執(zhí)行對(duì)應(yīng)的中斷服務(wù)程序。
?在方式2下,T2作為一個(gè)16位計(jì)數(shù)器,計(jì)數(shù)器初值從TH2和TL2中讀入,計(jì)數(shù)器的遞增由外部輸入引腳P1.1(T2EX)來(lái)控制。當(dāng)P1.1引腳上的電平由低變高(即發(fā)生捕捉事件)時(shí),會(huì)產(chǎn)生捕捉中斷請(qǐng)求,EXF2標(biāo)志位被置為1,同時(shí)觸發(fā)中斷請(qǐng)求。此時(shí),CPU會(huì)響應(yīng)該中斷請(qǐng)求,并執(zhí)行對(duì)應(yīng)的中斷服務(wù)程序。
兩種中斷方式經(jīng)或門(mén)共用一個(gè)中斷矢量。因此在編寫(xiě)中斷服務(wù)程序時(shí)需要對(duì)這兩種中斷請(qǐng)求進(jìn)行區(qū)分處理??梢酝ㄟ^(guò)讀取TF2和EXF2標(biāo)志位的值來(lái)判斷中斷請(qǐng)求的來(lái)源,從而執(zhí)行相應(yīng)的處理程序。
中斷請(qǐng)求標(biāo)志寄存器
6個(gè)中斷請(qǐng)求源的中斷請(qǐng)求標(biāo)志分別由TCON、SCON和T2CON的相應(yīng)位鎖存
(1)TCON寄存器
為定時(shí)器/計(jì)數(shù)器的控制寄存器,字節(jié)地址為88H可位尋址。特殊功能寄存器TCON的格式如圖所示:
(1) TF1一定時(shí)器/計(jì)數(shù)器T1的溢出中斷請(qǐng)求標(biāo)志位。當(dāng)T1計(jì)數(shù)產(chǎn)生溢出時(shí),由硬件使TF1置“1”,向CPU申請(qǐng)中斷。CPU響應(yīng)TF1中斷時(shí),TF1標(biāo)志由硬件自動(dòng)清“0”,TF1也可由軟件清“0”。
(2)TF0一定時(shí)器/計(jì)數(shù)器TO的溢出中斷請(qǐng)求標(biāo)志位,功能與TF1類似。
(3)IE1一外部中斷請(qǐng)求1的中斷請(qǐng)求標(biāo)志位。
(4)IE0一外部中斷請(qǐng)求0中斷請(qǐng)求標(biāo)志位,功能與IE1類似。
(5)IT1一選擇外部中斷請(qǐng)求1為跳沿觸發(fā)還是電平觸發(fā)。
IT1=0,電平觸發(fā)方式,引腳 上低電平有效,并把IE1置“1”。轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件自動(dòng)把IE1清“0”
IT1=1,跳沿觸發(fā)方式,加到引腳 上的外部中斷請(qǐng)求輸入信號(hào)電平從高到低的負(fù)跳變有效,并把IE1置“1”。轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件自動(dòng)把IE1清“0”
(6)IT0一選擇外部中斷請(qǐng)求0為跳沿觸發(fā)方式還是電平觸發(fā)方式,其意義與IT1類似。
單片機(jī)復(fù)位后,TCON被清“0”,6個(gè)中斷源的中斷請(qǐng)求標(biāo)志均為0。
(2)SCON寄存器
串行口控制寄存器,字節(jié)地址為98H,可位尋址。
低二位鎖存串行口的發(fā)送中斷和接收中斷的中斷請(qǐng)求標(biāo)志TI和RI,格式如圖所示。
各標(biāo)志位的功能:
(1) TI----串行口的發(fā)送中斷請(qǐng)求標(biāo)志位。每發(fā)送完一串行數(shù)據(jù)后,TI自動(dòng)置“1”。TI標(biāo)志必須由軟件清“0”
(2) RI----串行口接收中斷請(qǐng)求標(biāo)志位。串行口接收完一個(gè)串行數(shù)據(jù)幀硬件自動(dòng)使RI中斷請(qǐng)求標(biāo)志置“1”。必須在中斷服務(wù)程序中用指令對(duì)RI清“0”
(3)定時(shí)器2的控制寄存器T2CON
特殊功能寄存器T2CON的字節(jié)地址為C8H,可位尋址,位地址為C8H~CFH。
T2CON中的最高兩位為定時(shí)器/計(jì)數(shù)器T2的中斷請(qǐng)求標(biāo)志位TF2和EXF2。
?TF2 (D7) :當(dāng)T2的計(jì)數(shù)器(TL2、TH2) 計(jì)數(shù)計(jì)滿溢出回0時(shí),由內(nèi)部硬件置位TF2(寄存器T2CON7),向CPU發(fā)出中斷請(qǐng)求。但是當(dāng)RCLK位或TCLK位為1時(shí)將不予置位。本標(biāo)志位必須由軟件清0。
?EXF2(D6):當(dāng)由引腳T2EX (P11腳)上的負(fù)跳變引起“捕捉”或“重新裝載”且EXEN2位為1,則置位EXF2標(biāo)志位(寄存器T2CON6),向CPU發(fā)出中斷請(qǐng)求,軟件清零。
中斷允許與中斷優(yōu)先級(jí)的控制寄存器
中斷允許控制由中斷允許寄存器IE控制。
中斷優(yōu)先級(jí)控制由中斷優(yōu)先級(jí)寄存器IP控制。
中斷允許寄存器IE
單片機(jī)對(duì)各中斷源的開(kāi)放或屏蔽,是由中斷允許寄存器IE控制的IE字節(jié)地址為A8H,可位尋址,格式如圖所示。
IE對(duì)中斷的開(kāi)放和關(guān)閉實(shí)現(xiàn)兩級(jí)控制
有一個(gè)總的開(kāi)關(guān)中斷控制位EA (IE.7位)
?EA=0時(shí),所有的中斷請(qǐng)求被屏蔽;
?EA=1時(shí),開(kāi)放中斷,但6個(gè)中斷源的中斷請(qǐng)求是否允許,還要由IE中的低6位所對(duì)應(yīng)的6個(gè)中斷請(qǐng)求允許控制位的狀態(tài)來(lái)決定
IE中各位功能如下:
(1)EA----中斷允許總開(kāi)關(guān)控制位。
EA=0,所有的中斷請(qǐng)求被屏蔽
EA=1,所有的中斷請(qǐng)求被開(kāi)放
(2)ET2----定時(shí)器/計(jì)數(shù)器T2的溢出中斷允許位
ET2=0,禁止T2溢出中斷。
ET2=1,允許T2溢出中斷。
(3)ES----串行口中斷允許位。
ES=0,禁止串行口中斷
ES=1,允許串行口中斷。
(4)ET1----定時(shí)器/計(jì)數(shù)器T1的溢出中斷允許位
ET1=0,禁止T1溢出中斷。
ET1=1,允許T1溢出中斷。
(5)EX1----外部中斷1中斷允許位。
EX1=0,禁止外部中斷1中斷。
EX1=1,允許外部中斷1中斷。
(6)ET0----外部中斷中斷允許位
EX0=0,禁止外部中斷0中斷。
EX0=1,允許外部中斷0中斷
(7)EX0----外部中斷0中斷允許位。
EX0=0,禁止外部中斷0中斷
EX0=1,允許外部中斷0中斷
單片機(jī)復(fù)位以后,IE被清“0”,所有的中斷請(qǐng)求被禁止。IE中與各個(gè)中斷源相應(yīng)的位可用指置“1”清“”中源的中請(qǐng)若使某一個(gè)中斷源被允許中斷,除了IE相應(yīng)的位被置“1”外,還必須使EA位置“1”,即EA位置“1”中請(qǐng)的必要條件。
改變IE的內(nèi)容,可由位操作指令來(lái)實(shí)現(xiàn)(即SETB bit; CLR bit),也可用字節(jié)操作指令實(shí)現(xiàn)。
中斷優(yōu)先級(jí)寄存器IP
AT89S52的中斷請(qǐng)求源有兩個(gè)中斷優(yōu)先級(jí),由軟件分別設(shè)置為高優(yōu)先級(jí)中斷或低優(yōu)先級(jí)中斷,可實(shí)現(xiàn): 兩級(jí)中斷嵌套
AT89S52正在執(zhí)行低優(yōu)先級(jí)中斷的服務(wù)程序時(shí),可被高優(yōu)先級(jí)中斷請(qǐng)求所中斷,待高優(yōu)先級(jí)中斷處理完畢后,再返回低優(yōu)先級(jí)中斷服務(wù)程序。兩級(jí)中斷嵌套的過(guò)程如圖所示。
各中斷源的中斷優(yōu)先級(jí)關(guān)系,可歸納為兩條基本規(guī)則:
(1)低優(yōu)先級(jí)可被高優(yōu)先級(jí)中斷,高優(yōu)先級(jí)不能低優(yōu)先級(jí)中斷。如果某一中斷源被設(shè)置為高優(yōu)先級(jí)中斷,則不能被任何其他的中斷源的中斷請(qǐng)求所中斷。
(2) 任何一種中斷一旦得到響應(yīng),不會(huì)再被它的同級(jí)中斷源所中斷中斷優(yōu)先級(jí)寄存器IP,其字節(jié)地址為B8H,可位尋址。只要用程序改變其內(nèi)容,可進(jìn)行各中斷源中斷優(yōu)先級(jí)的設(shè)置,IP寄存器的格式如圖所示。
IP各位的含義如下:如果這些位置1,高優(yōu)先級(jí),如果這些位置0,低優(yōu)先級(jí)
(1)PT2定時(shí)T2中優(yōu)先級(jí)控制位
(2)PS串行口中斷優(yōu)先級(jí)控制位
(3)PT1定時(shí)器T中斷優(yōu)先級(jí)控制位
(4)PX1一外部中斷1中斷優(yōu)先級(jí)控制位
(5)PTO定時(shí)器TO中斷優(yōu)先級(jí)控制位
(6)PXO外部中斷中優(yōu)先級(jí)控制位
在同時(shí)收到幾個(gè)同優(yōu)先級(jí)的中斷請(qǐng)求時(shí),哪一個(gè)中斷請(qǐng)求能優(yōu)先得到響應(yīng),取決于內(nèi)部的查詢順序。這相當(dāng)于在同一個(gè)優(yōu)先級(jí)內(nèi),還同時(shí)存在另個(gè)輔助優(yōu)先級(jí)結(jié)構(gòu),其查詢順序見(jiàn)表。
由此可見(jiàn),各中斷源在相同優(yōu)先級(jí)的條件下,外部中斷0的中斷優(yōu)先權(quán)最高T2溢出中斷或EXF2中斷的中斷優(yōu)先權(quán)最低
響應(yīng)中斷請(qǐng)求的條件
中斷請(qǐng)求被響應(yīng),必須滿足以下必要條件:
(1)總中斷允許開(kāi)關(guān)接通,即IE存器中的中斷總允許位EA=1。
(2)該中斷源發(fā)出中斷請(qǐng)求,即對(duì)應(yīng)的中斷請(qǐng)求標(biāo)志為“1”
(3)該中斷源的中斷允許位EA=1,即該中斷被允許。
(4)無(wú)同級(jí)或更高級(jí)中斷正在被服務(wù)。
當(dāng)CPU查詢到有效的中斷請(qǐng)求時(shí),在滿足上述條件時(shí),緊接著就進(jìn)行中斷響應(yīng)。
中斷響應(yīng)的過(guò)程
首先由硬件自動(dòng)生成一條長(zhǎng)調(diào)用指令“LCALLaddr16”。就是程序存儲(chǔ)區(qū)中相應(yīng)的中斷入口地址。
例如,對(duì)于外部中斷1的響應(yīng),硬件自動(dòng)生成的長(zhǎng)調(diào)用指令為
LCALL 0013H
首先將程序計(jì)數(shù)器PC的內(nèi)容壓入堆棧以保護(hù)斷點(diǎn),再將中斷入口地址裝入PC,使程序轉(zhuǎn)向響應(yīng)中斷請(qǐng)求的中斷入口地址。
各中斷源服務(wù)程序的入口地址(也稱中斷矢量)是固定的,如表所示。
兩個(gè)中斷入口間只相隔8字節(jié),難以安放一個(gè)完整的中斷服務(wù)程序。因此,通常在中斷入口地址處放置一條無(wú)條件轉(zhuǎn)移指令,使程序執(zhí)行轉(zhuǎn)向中斷服務(wù)程序入口。??
注:
中斷響應(yīng)是有條件的,當(dāng)遇到下列三種情況之一時(shí),中斷響應(yīng)被封鎖:
(1)CPU正在處理同級(jí)或更高優(yōu)先級(jí)的中斷。
(2)所查詢的機(jī)器周期不是當(dāng)前正在執(zhí)行指令的最后一個(gè)機(jī)器周期。只有在當(dāng)前指令執(zhí)行完畢后,才能進(jìn)行中斷響應(yīng),以確保當(dāng)前指令執(zhí)行的完整性。
(3)正在執(zhí)行的指令是RETI或是訪問(wèn)IE或IP的指令。因?yàn)榘凑誂T89S52中斷系統(tǒng)的規(guī)定,在執(zhí)行完這些指令后,需要再? 執(zhí)行完一條指令,才能響應(yīng)新的中斷請(qǐng)求。
如果存在上述三種情況之一,CPU將丟棄中斷查詢結(jié)果,不能對(duì)中斷進(jìn)行響應(yīng)。
外部中斷響應(yīng)時(shí)間
使用外部中斷時(shí),需考慮從外部中斷請(qǐng)求到轉(zhuǎn)向中斷入口地址所需的時(shí)間。
外部中斷的最短響應(yīng)時(shí)間為3個(gè)機(jī)器周期。
其中中斷請(qǐng)求標(biāo)志位查詢占1個(gè)機(jī)器周期,而這個(gè)機(jī)器周期恰好處于指令的最后一個(gè)機(jī)器周期。在這個(gè)機(jī)器周期結(jié)束后,中斷即被響應(yīng),CPU接著執(zhí)行一條硬件子程序調(diào)用指令LCALL到相應(yīng)中斷服務(wù)程序入口,需要2個(gè)機(jī)器周期
外部中斷響應(yīng)的最長(zhǎng)時(shí)間為8個(gè)機(jī)器周期。
執(zhí)行RETI或訪問(wèn)IE或IP的指令,最長(zhǎng)需要2個(gè)機(jī)器周期。接著再執(zhí)行一條指令,最長(zhǎng)指令(乘法指令MUL和除法指令DIV)來(lái)算,也只有4個(gè)機(jī)器周期。再加上硬件子程序調(diào)用指令LCALL的執(zhí)行,需要2個(gè)機(jī)器周期所以,外部中斷響應(yīng)的最長(zhǎng)時(shí)間為8個(gè)機(jī)器周期。
在CPU進(jìn)行中斷標(biāo)志查詢時(shí),剛好才開(kāi)始執(zhí)行RETI或訪問(wèn)IE或IP的指令,需執(zhí)行完指令再繼續(xù)執(zhí)行一條指令后,才響應(yīng)中斷。
外部中斷的觸發(fā)方式選擇
外部中斷的觸發(fā)方式,即INT0的兩種觸發(fā)方式,兩種觸發(fā)方式分別為:電平觸發(fā)方式和跳沿觸發(fā)方式
?
?電平觸發(fā)方式
外部中斷申請(qǐng)觸發(fā)器的狀態(tài)隨著CPU在每個(gè)機(jī)器周期采樣到的外部中斷輸入引腳的電平變化而變化。
在中斷服務(wù)程序返回之前,外部中斷請(qǐng)求輸入必須無(wú)效(即外部中斷請(qǐng)求輸入已由低電平變?yōu)楦唠娖?,否則會(huì)再次響應(yīng)中斷。
所以本方式適合于外部中斷以低電平輸入且中斷服務(wù)程序能清除外部中斷請(qǐng)求源 (即外中斷輸入電平又變?yōu)楦唠娖?的情況。
?跳沿觸發(fā)方式
外部中斷申請(qǐng)觸發(fā)器能鎖存外部中斷輸入線上的負(fù)跳變。即使不能響應(yīng),中斷請(qǐng)求標(biāo)志不丟失。
相繼連續(xù)兩次采樣,一個(gè)機(jī)器周期為高,下一個(gè)機(jī)器周期采樣為低則中斷申請(qǐng)觸發(fā)器置1,直到CPU響應(yīng)此中斷時(shí),才清0。
輸入的負(fù)脈沖寬度至少保持12個(gè)時(shí)鐘周期,才能被采樣到。適合于以負(fù)脈沖形式輸入的外部中斷請(qǐng)求。
中斷請(qǐng)求的撤銷
某個(gè)中斷請(qǐng)求被響應(yīng)后,就存在著一個(gè)中斷請(qǐng)求的撤銷問(wèn)題。
1.定時(shí)器/計(jì)數(shù)器T0、T1中斷請(qǐng)求的撤銷
硬件會(huì)自動(dòng)把中斷請(qǐng)求標(biāo)志位(TFO或TF1)清0,自動(dòng)撤銷。
2.外部中斷請(qǐng)求的撤銷
(1)跳沿方式外部中斷請(qǐng)求的撤銷
包括兩項(xiàng):中斷標(biāo)志位清0和外中斷信號(hào)的撤銷
中斷標(biāo)志位清0是在中斷響應(yīng)后由硬件自動(dòng)完成的
外中斷請(qǐng)求信號(hào)的撤銷,由于跳沿信號(hào)過(guò)后也就消失了,自動(dòng)撤銷。
(2)電平方式外部中斷請(qǐng)求的撤銷
電平方式外中斷請(qǐng)求的撤銷,其中中斷請(qǐng)求標(biāo)志自動(dòng)撤銷,但中斷請(qǐng)求信號(hào)的低電平可能繼續(xù)存在,為此,除了標(biāo)志位清“0”之外,還需在中斷響應(yīng)后把中斷請(qǐng)求信號(hào)輸入引腳從低電平強(qiáng)制改變?yōu)楦唠娖?/strong>,如圖所示:
由圖,用D觸發(fā)器鎖存外來(lái)的中斷請(qǐng)求低電平,并通過(guò)D觸發(fā)器的輸出端Q接到INT0*(或INT1*)。所以,增加的D觸發(fā)器不影響中斷請(qǐng)求。
中斷響應(yīng)后,利用D觸發(fā)器的SD端接AT89S51的P1.0端。因此,只要P1.0端輸出一個(gè)負(fù)脈沖就可以使D觸發(fā)器置“1”,撤銷低電平的中斷請(qǐng)求信號(hào)
??
3.串行口中斷請(qǐng)求的撤銷
響應(yīng)串行口的中斷后,CPU無(wú)法知道是接收中斷還是發(fā)送中斷,還需測(cè)試這兩個(gè)中斷標(biāo)志位,以判定是接收操作還是發(fā)送操作,然后才清除所以串行口中斷請(qǐng)求的撤銷只能使用軟件的方法,在中斷服務(wù)程序中進(jìn)行,即用如下指令在中斷服務(wù)程序中對(duì)串行口中斷標(biāo)志位進(jìn)行清除:
4.定時(shí)器/計(jì)數(shù)器T2中斷請(qǐng)求的撤銷
定時(shí)器/計(jì)數(shù)器T2的中斷請(qǐng)求包括兩種:TF2和EXF2
上述兩種中斷請(qǐng)求,在滿足中斷響應(yīng)條件時(shí),CPU都將響應(yīng)其中斷請(qǐng)求轉(zhuǎn)向同一個(gè)中斷矢量地址。因此,必須在T2的中斷服務(wù)程序中對(duì)TF2和EXF2兩個(gè)中斷請(qǐng)求標(biāo)志位進(jìn)行查詢,然后正確轉(zhuǎn)入對(duì)應(yīng)的中斷處理程序。
中斷結(jié)束后,中斷請(qǐng)求標(biāo)志位TF2或EXF2必須由軟件清0。所以定時(shí)器/計(jì)數(shù)器T2中斷請(qǐng)求的撤銷只能使用軟件的方法,在中斷服務(wù)程序返回前完成。
中斷服務(wù)子程序的設(shè)計(jì)
1.中斷服務(wù)子程序設(shè)計(jì)的任務(wù)
任務(wù)有下列4條:
(1)設(shè)置中斷允許控制寄存器IE,允許相應(yīng)的中斷請(qǐng)求源中斷
(2)設(shè)置中斷優(yōu)先級(jí)寄存器IP,確定所使用的中斷源的優(yōu)先級(jí)
(3)若是外部中斷源,還要設(shè)置中斷請(qǐng)求的觸發(fā)方式?jīng)Q定采用電平觸發(fā)方式還是跳沿觸發(fā)方式。
(4)編寫(xiě)中斷服務(wù)子程序,處理中斷請(qǐng)求
前3條一般放在主程序的初始化程序段中
2.采用中斷時(shí)的主程序結(jié)構(gòu)
程序必須先從主程序起始地址0000H執(zhí)行。所以,在0000H起始地址的幾個(gè)字節(jié)中,用無(wú)條件轉(zhuǎn)移指令,跳向主程序。
另外,各中斷入口地址之間依次相差8字節(jié),中斷服務(wù)子程序稍長(zhǎng)就超過(guò)8字節(jié),這樣中斷服務(wù)子程序就占用了其他的中斷入口地址,影響其他中斷源的中斷處理。為此,一般在進(jìn)入中斷后,用一條無(wú)條件轉(zhuǎn)移指令,把中斷服務(wù)子程序跳轉(zhuǎn)到遠(yuǎn)離其他中斷入口的入口地址處
常用的主程序結(jié)構(gòu)如下:
首先,PC先指向0000H,再通過(guò)長(zhǎng)跳轉(zhuǎn),跳轉(zhuǎn)到主程序入口,接著進(jìn)行外部中斷請(qǐng)求時(shí),會(huì)執(zhí)行LCALL,并且自動(dòng)跳轉(zhuǎn)到某個(gè)中斷入口,又因?yàn)槊?位就到了下一個(gè)中斷地址入口,所以再執(zhí)行一次長(zhǎng)跳轉(zhuǎn),選一個(gè)空間足夠的地址執(zhí)行中斷指令,最后通過(guò)RETI,返回原中斷入口:
注意:如果有多個(gè)中斷源,就有多個(gè)“ORG X1X2X3X4H”的入口地址多個(gè)“中斷入口地址”必須依次由小到大排列。主程序MAIN的起始地址Y1Y2Y3Y4H,根據(jù)具體情況來(lái)安排。
3.中斷服務(wù)子程序的流程
流程大致如下:
(1)現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)
現(xiàn)場(chǎng)是指單片機(jī)中某些寄存器和存儲(chǔ)器單元中的數(shù)據(jù)或狀態(tài)。為使中斷服務(wù)子程序的執(zhí)行不破壞這些數(shù)據(jù)或狀態(tài),因此要送入堆棧保存起來(lái),這就是現(xiàn)場(chǎng)保護(hù)。
現(xiàn)場(chǎng)保護(hù)一定要位于中斷處理程序的前面。中斷處理結(jié)束后,在返回主程序前則需要把保存的現(xiàn)場(chǎng)內(nèi)容從堆棧中彈出恢復(fù)原有內(nèi)容,這就是現(xiàn)場(chǎng)恢復(fù)。
現(xiàn)場(chǎng)恢復(fù)一定要位于中斷處理的后面。
是供現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)使堆棧操作指令:“PUSHdirect”和“POPdirect”,用的。要保護(hù)哪些內(nèi)容,應(yīng)根據(jù)具體情況來(lái)定。
(2) 關(guān)中斷和開(kāi)中斷
現(xiàn)場(chǎng)保護(hù)前和現(xiàn)場(chǎng)恢復(fù)前關(guān)中斷,是為防止此時(shí)有高一級(jí)的中斷進(jìn)入,避免現(xiàn)場(chǎng)被破壞。
在現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)之后的開(kāi)中斷是為下一次的中斷做好準(zhǔn)備,也為了允許有更高級(jí)的中斷進(jìn)入。這樣,中斷處理可以被打斷,但原來(lái)的現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)不允許更改,除了現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)的片刻外,仍然保持著中斷嵌套的功能。
有時(shí)候,一個(gè)重要的中斷,必須執(zhí)行完畢,不允許被其他中斷嵌套??稍诂F(xiàn)場(chǎng)保護(hù)前先關(guān)閉總中斷開(kāi)關(guān)位,待中斷處理完畢后再開(kāi)總中斷開(kāi)關(guān)位。這樣,需把上圖中的“中斷處理”步驟前后的“開(kāi)中斷”和“關(guān)中斷”去掉。
[例4-4] 根據(jù)圖流程,編寫(xiě)中斷服務(wù)程序。設(shè)現(xiàn)場(chǎng)保護(hù)只將PSW寄存器和累加器A的內(nèi)容壓入堆棧中保護(hù)。一個(gè)典型的中斷服務(wù)子程序如下:
上述程序幾點(diǎn)說(shuō)明:
(1)本例的現(xiàn)場(chǎng)保護(hù)假設(shè)僅僅涉及PSW和A的內(nèi)容,如有其他需要保護(hù)的內(nèi)容,只需在相應(yīng)位置再加幾條PUSH和POP指令即可。注意,堆棧的操作是先進(jìn)后出。
(2)“中斷處理程序段”,設(shè)計(jì)者應(yīng)根據(jù)中斷任務(wù)的具體要求,來(lái)編寫(xiě)中斷處理程序。
(3)如不允許被其他的中斷所中斷,可將“中處理段”前后的“SETBEA”和“CLR EA”兩條指令去掉。
(4)最后一條指令必須是返回指令RETI,不可缺少,CPu執(zhí)行完這條指令后,返回?cái)帱c(diǎn)處,重新執(zhí)行被中斷的主程序。
4.外部中斷源系統(tǒng)設(shè)計(jì)
實(shí)際的應(yīng)用中,兩個(gè)外部中斷請(qǐng)求源往往不夠用,需對(duì)外部中斷源進(jìn)行擴(kuò)充,如圖所示。系統(tǒng)有5個(gè)外部中斷請(qǐng)求源IR0~IR4,高電平有效。
最高級(jí)的請(qǐng)求源IR0直接接到AT89S52的一個(gè)外部中斷請(qǐng)求輸入端INT0*,其余4個(gè)請(qǐng)求源IR1~IR4通過(guò)各自的OC門(mén)(集電極開(kāi)路門(mén))連到AT89S52的另一個(gè)外中斷源輸入端INT1*,同時(shí)還連到P1口的P1.0~P1.3腳,供AT89S52查詢
如圖所示電路,除了IR0優(yōu)先權(quán)級(jí)別最高外,其余4個(gè)外部中斷源的中斷優(yōu)先權(quán)取決于查詢順序,中斷優(yōu)先權(quán)的高與低,取決于查詢順序。
查詢法擴(kuò)展外部中斷源比較簡(jiǎn)單,但是擴(kuò)展的外部中斷源個(gè)數(shù)較多時(shí)查詢時(shí)間稍長(zhǎng)。
用優(yōu)先權(quán)編碼器擴(kuò)展外部中斷源
當(dāng)需要處理的外部中斷源數(shù)目較多而又要求響應(yīng)速度很快時(shí),軟件查詢方法常常滿足不了時(shí)間上的要求。因?yàn)樵谕獠恐袛嘣春芏嗟那闆r下,響應(yīng)優(yōu)先級(jí)最高和響應(yīng)優(yōu)先級(jí)最低的中斷所需的查詢時(shí)間可能相差很大。如果采用硬件對(duì)外部中斷源進(jìn)行優(yōu)先級(jí)排隊(duì)就可避免這個(gè)問(wèn)題。下面介紹采用優(yōu)先權(quán)編碼器擴(kuò)展外部中斷源的方法。
74LS148是一種優(yōu)先權(quán)編碼器,利用74LS148擴(kuò)展AT89S52外部中斷源的電路如圖4-12所示,74LS148具有8個(gè)輸入端“07”,用作8個(gè)外部中斷請(qǐng)求IRO*~IR7*輸入端,3個(gè)編碼輸出端A2~A0與單片機(jī)的P1.3~P1.1口線相連,編碼器輸出控制端與單片機(jī)的外中斷請(qǐng)求輸入INT1*腳相連。在使能端為低電平的情況下,只要其8輸入端中任一輸入為低電平,就有一組相應(yīng)的編碼從A2AO端輸出,且同時(shí)編碼器輸出端輸出低電平。
如果8中斷源IR0*IR7*中有多個(gè)中斷請(qǐng)求時(shí) (低有效),其優(yōu)先權(quán)最高的一組編碼就出現(xiàn)在單片機(jī)的P1.3~P1.1口線上,此時(shí)CS*端為低電平,則AT89S52的INT1*端就為低電平,若INT1*中斷被允許,就可以響應(yīng)外部中斷源所提出的中斷請(qǐng)求。
74LS148的真值表見(jiàn)表
程序如下:
設(shè)置p1.3,p1.2,p1.1的值,通過(guò)@A+DPTR(起始地址),跳轉(zhuǎn)到相應(yīng)的外部中斷設(shè)備
注:
74LS148的輸入端“7”(即IR0*端)具有最高優(yōu)先權(quán),輸入端“0”(IR7*即端)優(yōu)先權(quán)最低,這相當(dāng)于給圖中的8個(gè)外部中斷請(qǐng)求源安排了一個(gè)中斷優(yōu)先級(jí)順序。因此,當(dāng)同時(shí)有多個(gè)中斷源提出中斷申請(qǐng)時(shí),AT89S52只響應(yīng)優(yōu)先權(quán)最高的那個(gè)中斷源的中斷申請(qǐng)。
上述電路結(jié)構(gòu)簡(jiǎn)單,價(jià)格低廉,但該電路無(wú)法實(shí)現(xiàn)中斷嵌套。即當(dāng)一個(gè)中斷申請(qǐng)正在被執(zhí)行時(shí),單片機(jī)不能響應(yīng)別的中斷源的中斷申請(qǐng)(僅指IR0*~IR7*)。
由于所擴(kuò)展的外中斷源都是向AT89S52提出中斷申請(qǐng),因此,這些外中斷源在使用時(shí)應(yīng)注意以下三個(gè)問(wèn)題。?
(1) 中斷響應(yīng)時(shí)間
AT89S52的外中斷響應(yīng)時(shí)間在3~8個(gè)機(jī)器周期內(nèi),由于AT89S52在真正為所擴(kuò)展的外中斷源 (IR0*~IR7*)服務(wù)之前需執(zhí)行一段引導(dǎo)程序,因此對(duì)所擴(kuò)展的外中斷源而言,中斷響應(yīng)時(shí)間還要把執(zhí)行引導(dǎo)程序所需的時(shí)間算在內(nèi)。
(2) 中斷申請(qǐng)信號(hào)低電平的寬度
擴(kuò)展的外部中斷源,中斷請(qǐng)求信號(hào)的低電平要有足夠?qū)挾?,?yīng)一直保持到AT89S52將74LS148提供的編碼取走為止,否則會(huì)出現(xiàn)錯(cuò)誤。AT89S52讀取這個(gè)編碼要執(zhí)行4條指令,需7個(gè)機(jī)器周期,若系統(tǒng)時(shí)鐘頻率為12MHz,則外中斷請(qǐng)求信號(hào)低電平的寬度至少要大于15us。
(3)堆棧深度的問(wèn)題文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-764484.html
由于AT89S52的堆棧只能設(shè)在片內(nèi)RAM,字節(jié)有限,每次響應(yīng)中斷時(shí)都要把斷點(diǎn)、現(xiàn)場(chǎng)的內(nèi)容壓入堆棧內(nèi),如果發(fā)生中斷服務(wù)子程序中又調(diào)用子程序,則極容易發(fā)生堆棧溢出或侵占其它片內(nèi)RAM內(nèi)容,從而造成程序混亂在使用中要特別注意。
除上述3種方法外,還可采用可編程中斷控制器接口芯片8259A來(lái)進(jìn)行外部中斷源的擴(kuò)展。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-764484.html
到了這里,關(guān)于AT89S52單片機(jī)------中斷系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!