51單片機中斷響應(yīng)過程舉例
CPU響應(yīng)中斷時,首先把當(dāng)前指令的下一條指令(就是中斷返回后將要執(zhí)行的指令)的地址送入堆棧,然后根據(jù)中斷標(biāo)記,將相應(yīng)的中斷入口地址送入PC,PC是程序指針,CPU取指令就根據(jù)PC中的值,PC中是什么值,就會到什么地方去取指令,所以程序就會轉(zhuǎn)到中斷入口處繼續(xù)執(zhí)行。這些工作都是由硬件來完成的,不必我們?nèi)タ紤]。這里還有個問題,大家是否注意到,每個中斷向量地址只間隔了8個單元,如0003-000B,在如此少的空間中如何完成中斷程序呢?很簡單,你在中斷處安排一個LJMP指令,不就可以把中斷程序跳轉(zhuǎn)到任何地方了嗎?
一個完整的主程序看起來應(yīng)該是這樣的:內(nèi)容來自單片機之家www.dpj100.com
ORG0000H
LJMPSTART內(nèi)容來自單片機之家www.dpj100.com
ORG0003H內(nèi)容來自單片機之家www.dpj100.com
LJMPINT0;轉(zhuǎn)外中斷0
ORG000BH
RETI;沒有用定時器0中斷,在此放一條RETI,萬一 “不小心“產(chǎn)生了中斷,也不會有太大的后果。
中斷程序完成后,一定要執(zhí)行一條RETI指令,執(zhí)行這條指令后,CPU將會把堆棧中保存著的地址取出,送回PC,那么程序就會從主程序的中斷處繼續(xù)往下執(zhí)行了。注意:CPU所做的保護工作是很有限的,只保護了一個地址,而其它的所有東西都不保護,所以如果你在主程序中用到了如A、PSW等,在中斷程序中又要用它們,還要保證回到主程序后這里面的數(shù)據(jù)還是沒執(zhí)行中斷以前的數(shù)據(jù),就得自己保護起來。





