8051的CPU在每個機器周期期間,順序采樣每個中斷源,CPU在下一個機器周期按優(yōu)先級順序查詢中斷標志,如查詢到某個中斷標志為1,將在下一個機器周期期間按優(yōu)先級來進行中斷處理。在下列任一種情況存在時,中斷申請將被封鎖。
1、CPU正在執(zhí)一個同級或高級的中斷服務程序2、當前機器周期不是當前指令周期的最后一個機器周期,即要保證把當前指令執(zhí)行完。
CPU響應中斷, 由硬件自動將相應的中斷矢量地址裝入程序程序計數(shù)器PC,轉入該中斷服務程序進行處理。
對于有些中斷源,CPU在響應中斷后會自動清除中斷標志,如定時器溢出標志TF0,TF1,以及部中斷標志IE0,IE1。
而有些中斷標志,不會自動清除,只能由用戶用戶軟件清除,如串行口接收發(fā)送中斷標志RI,T1。CPU執(zhí)行中斷服務程序之前,自動將程序計數(shù)器PC內容壓入堆棧保護,然后將對應的中斷矢量裝入程序計數(shù)器PC,使程序轉向該中斷矢量地址單元中,以執(zhí)行中斷服務程序,中斷服務程序從矢量地址開始執(zhí)行,一直到返回指令“RETI”為止?!癛ETI”指令的操作,一方面告訴中斷系統(tǒng)中斷服務程序以執(zhí)行完畢,另一方面把原來壓入堆棧保護的斷電地址從棧頂彈出,裝入程序計數(shù)器PC,使程序返回被中斷的程序斷點處,以便繼續(xù)執(zhí)行。
外部中斷響應時間外部中斷INT0和INT1的電平在每個機器周期,經(jīng)反向后鎖存到IE0和IE1的標志位,CPU在下一個機器周期才會查詢到新置入的IE0和IE1,這時如果滿足響應條件,CPU響應中斷時,要用二個機器周期執(zhí)行一條硬件長調用指令“LCALL”。所以,從產(chǎn)生外部中斷到開始執(zhí)行中斷程序至少需要三個完整的機器周期。如果在中斷申請時,CPU正在長指令,如乘法和除法指令等四周期指令,則額外等待時間增加三個周期;若正在執(zhí)行“RETI”指令或訪問IE,IP的指令,則額外等待時間又增加兩個周期。綜上估計,在單一中斷系統(tǒng)里,外部中斷響應時間約在3-8個機器周期之間。
下面我們仍以打印機為例來說明外中斷源的使用方法 。硬件連接和查詢方式基本一致,只是因為程序中對外中斷進行了初始化,所以,8051的端口引腳P3.2在這個例子中不再是一個普通的端口而是外中斷的輸入,另一個,打印機多了一個選通信號STB。對打印機來說,這個信號是個輸入信號,其意義為:當打印機檢測到該引腳上出現(xiàn)一個負跳變,即由高電平時,表示單片機以把打印數(shù)據(jù)送上數(shù)據(jù)總線,則打印機將BUSY引腳設置為1,告訴單片機打印機正在打印,然后,開始打印。
本例中,單片機并行接口P3的一位T0輸出作為該信號的輸入,打印緩沖區(qū)仍就在內部數(shù)據(jù)存儲器的10H-11H單元,共三字節(jié)。下面我們來看看程序:
第一條指令ORG 0000H是一條偽指令,意義是:告訴編譯系統(tǒng)緊跟其后的那條指令從程序存儲器的0000H單元開始存放。
第二條指令LJMP MAIN的意義是:跳轉到標號為MAIN的地址去運行。
第三條指令ORG 0003H是一條偽指令,意義是:告訴編譯系統(tǒng)緊跟其后的那條指令從程序存儲器的0003H單元開始存放。
指令LJMP SUBO的意義是:跳轉到標號為SUBO的地址去運行。
指令ORG 0050H的意義是:告訴編譯系統(tǒng)緊跟其后的那條指令從程序存儲器的0050H單元開始存放。
MAIN是一個標號。
指令SETB EA意義為:對位地址EA置1,EA是8051單片機中斷系統(tǒng)是總允許位,所以,該指令的物理意義是開放8051的中斷系統(tǒng)。
指令CLR EX0意義為:對EX0位置1,其物理意義為允許外中斷0中斷。
指令CLR IT0意義為:對IT0位清1,其物理意義是設置外中斷0的觸發(fā)方式為邊沿觸發(fā)。
指令MOV R0,#11H的意義是:將數(shù)據(jù)11H送入工作寄存器R0中,物理意義為設定在中斷服務程序中發(fā)送的一個數(shù)據(jù)的地址,即打印機緩沖區(qū)的第二字節(jié) 。因為必須在主程序上發(fā)送第一個字節(jié)之后,打印機才能發(fā)出第一次中斷請求,如果單片機將所有數(shù)據(jù)都放在中斷服務程序中發(fā)送,則會引起單片機和打印機相互等待,即打印機等待單片機將數(shù)據(jù)送上數(shù)據(jù)總線,并通過T0引腳發(fā)送一個負脈沖選通信號到打印機的STB引腳,打印機要在檢測到該引腳上的負脈沖前沿后,才開始打印 。另一方面,單片機卻在等待打印機打印完一個數(shù)據(jù)后,提出中斷申請,才能在中斷服務程序中發(fā)送第一個數(shù)據(jù)。
指令MOV P2,10H的意義是:將內部數(shù)據(jù)存儲器10H單元送上并行接口P2,其物理意義是發(fā)送第一打印數(shù)據(jù)。
指令CLR P3.4的意義為:對端口P3.4,即T0引腳清0,其物理意義向打印機發(fā)送選通信號的前沿,打印機檢測到選通信號的前沿后,置引腳BUSY的狀態(tài)為高電平,然后開始打印。
指令SETB P3.4的意義為:對端口P3.4置1,其其物理意義向打印機發(fā)送選通信號的后沿。
指令LJMP §的意義是:跳轉到本條指令,即主程序到此就進入死循環(huán)。請大家注意只要用戶不關機的話,CPU就會不停的運行下去,不會因為用戶程序到此結束,如果沒有這條死循環(huán)指令的話,CPU就會從程序存儲器的下一個單元取出一個數(shù),把它當下一個指令的操作碼處理,這樣,程序就會出錯,甚至死機 。所以,如果一個系統(tǒng)中本身沒有死循環(huán)的話,一定要在主程序的最后認為加上一條死循環(huán)指令。
SUBO是一個標號,表示外中斷0的真正起始地址。
指令MOV P2,@R0的意義是,把R0的內容作為內部數(shù)據(jù)存儲器的地址,再把該地址的數(shù)據(jù)去出來送到端口P2,起物理意義是發(fā)送第二個打印數(shù)據(jù)。
指令CLR P3.4的意義是,對端口P3.4清0,物理意義是發(fā)送STB選通信號的前沿,打印機檢測到該信號,置引腳BUSY為高電平,然后開始打印。
指令SETB P3.4的意義是 ,對端口P3.4置1,物理意義是發(fā)送STB選通信號的后沿。
指令INC R0的意義是:對R0的內容加1,物理意義是改變打印緩沖區(qū)中下一個待打數(shù)據(jù)的指針,這條指令運行后,R0中的內容為12H,即下一個待打印數(shù)據(jù)在12H單元中。
指令CJNE RO,#13H LAB1的意義是:判斷R0的內容是否為13H,如是則繼續(xù)往下運行,否則跳轉到標號為LAB1的地方,物理意義為如果待打印數(shù)據(jù)的指針向13H,即表示所有的數(shù)據(jù)都打印完畢,則運行關中斷指令,否則表示數(shù)據(jù)末打印完,則跳過關中斷指令。
LAB1是一個標號。
指令RETI的意義是:中斷返回,物理意義是清除外中斷0的中斷請求標志,并返回主程剛才被中斷的地方,這是本程序經(jīng)編譯后的機器碼指令,用仿真器把它固化到程序存儲器后,就可以運行了。