單片機(jī)中斷問(wèn)題30例
定時(shí)器1中斷:當(dāng)定時(shí)器1計(jì)數(shù)到FFFF溢出時(shí)
串口中斷:串口接收到一幀?;虬l(fā)送完一幀數(shù)據(jù)都會(huì)產(chǎn)生中斷。
你網(wǎng)上找一下TCON和SCON。什么條件讓中斷標(biāo)志位的值改變。 那么就會(huì)進(jìn)入中斷服務(wù)程序去。
23、51單片機(jī),如果中斷函數(shù)比較長(zhǎng),執(zhí)行到一半又觸發(fā)了這個(gè)中斷,程序會(huì)停止從頭執(zhí)行,還是執(zhí)行結(jié)束后響應(yīng)中
答:
51單片機(jī)中,中斷分高低兩個(gè)優(yōu)先級(jí),高優(yōu)先級(jí)的中斷能打斷低優(yōu)先級(jí)的中斷。
但同級(jí)中斷是不能打斷同級(jí)中斷的!無(wú)論該中斷函數(shù)有多長(zhǎng),在執(zhí)行到一半這個(gè)中斷又發(fā)生了,還是要等到該中斷函數(shù)執(zhí)行完畢,并再執(zhí)行了一條主程序指令后才會(huì)再次進(jìn)入該中斷。
不過(guò),若樓主恰好在這個(gè)低優(yōu)先級(jí)中斷服務(wù)程序中修改了該中斷為高優(yōu)先級(jí),那么如果該中斷函數(shù)比較長(zhǎng),執(zhí)行到一半又觸發(fā)了這個(gè)中斷,則該中斷函數(shù)就會(huì)被重新從頭開(kāi)始執(zhí)行(中斷嵌套)。這是因?yàn)槌谥袛嘁酝獾钠渌袛啵?CPU 響應(yīng)該中斷,程序轉(zhuǎn)入該中斷函數(shù)前就已經(jīng)將該中斷的中斷標(biāo)志清零了。
另外,51的串口中斷比較特別,因?yàn)樾枰浖宄谥袛鄻?biāo)志,所以只要在未清串口中斷標(biāo)志前,是不會(huì)發(fā)生上述這樣的中斷嵌套的。
24、求51單片機(jī)程序,兩個(gè)計(jì)數(shù)器,主要是中斷函數(shù)的函數(shù)名以及初始化設(shè)置
答:
void into_into() interrupt 1 定時(shí)器0中斷入口函數(shù)
{
。。。。中斷服務(wù)程序。。。。
TH0=0;//
TL0=0;// 重新給T0賜值
}
void into_into() interrupt 3 定時(shí)器1中斷入口函數(shù)
{
。。。。中斷服務(wù)程序。。。。
TH1=0;//
TL1=0;// 重新給T1賜值
}
void to_to()
{
TMOD=0x11; //頂時(shí)器T0和T1工作方式1
TH0=0;//
TL0=0;// T0賜初值
TH1=0;//
TL1=0// T1賜初值
TR0=1;// 開(kāi)始記數(shù)
ET0=1;// 允許T0中斷
TR1=1;// 開(kāi)始記數(shù)
ET1=1;// 允許T1中斷
EA=1; // 打開(kāi)總中斷
}
void main()
{
INIT_T0(); //定時(shí)器中斷初始化
while(1)
{
...........
}
25、請(qǐng)教一個(gè)單片機(jī)中斷的問(wèn)題:比如來(lái)了一個(gè)脈沖,開(kāi)始中斷,但中斷里的程序執(zhí)行到一半時(shí),又來(lái)了一個(gè)脈沖,請(qǐng)問(wèn)這時(shí)中斷里的程序是從頭開(kāi)始呢還是繼續(xù)呢?
我的意思是程序就一個(gè)中斷A,來(lái)了一個(gè)脈沖,A執(zhí)行,A執(zhí)行到一半時(shí),又來(lái)了一個(gè)脈沖,通知A執(zhí)行。這時(shí)A是從頭執(zhí)行還是先不理會(huì)呢?
答:
需要具體情況具體分析,因?yàn)椴煌膯纹瑱C(jī)在中斷機(jī)制上有細(xì)微的差別,需要查他的資料。
一般來(lái)說(shuō),一個(gè)中斷源請(qǐng)求中斷,對(duì)CPU來(lái)說(shuō),是一次性的做了一個(gè)“中斷掛號(hào)”。假如當(dāng)時(shí)因條件不滿足(例如CPU正在“關(guān)中斷”,即沒(méi)有打開(kāi)“中斷允許”),而沒(méi)有響應(yīng)中斷,則掛號(hào)信息還在,這樣,將來(lái)一旦打開(kāi)了中斷允許,仍然會(huì)響應(yīng),只是晚了一點(diǎn)而已。
而中斷響應(yīng)以后,必須有辦法把這個(gè)“中斷掛號(hào)”消除掉。有的CPU的功能是:只要響應(yīng)了這個(gè)中斷,掛號(hào)就自動(dòng)消除了。也有的CPU不能自動(dòng)清除掛號(hào),必須在中斷服務(wù)程序中編入“清除中斷掛號(hào)”的操作,否則,一旦打開(kāi)了中斷允許,它又會(huì)重復(fù)發(fā)生中斷。
現(xiàn)在的大多數(shù)單片機(jī)里,中斷控制器和CPU是在同一個(gè)芯片中,它可以做到自動(dòng)消除中斷掛號(hào)。而過(guò)去許多種CPU,所配用的中斷控制器是另外一個(gè)芯片,自然就無(wú)法自動(dòng)消除了。
也有的CPU中有另外一種“不掛號(hào)”的中斷請(qǐng)求。它必須由外界(發(fā)出中斷請(qǐng)求的那個(gè)設(shè)備)來(lái)保持一直不停申請(qǐng),等到響應(yīng)中斷的時(shí)候,再設(shè)法(例如,在中斷服務(wù)程序中發(fā)出一個(gè)輸出信號(hào))通知那個(gè)設(shè)備撤銷申請(qǐng)。
大多數(shù)的CPU中,一旦響應(yīng)中斷進(jìn)入了服務(wù)程序,就把“中斷允許”關(guān)掉了。故此時(shí)如果又有下一個(gè)中斷請(qǐng)求來(lái)了,不能立即響應(yīng),只能掛一個(gè)號(hào),等以后“開(kāi)中斷”時(shí)才能再響應(yīng)。如果程序員希望能夠“嵌套中斷”(即在一次中斷服務(wù)程序的執(zhí)行中途又進(jìn)入了另一個(gè)中斷服務(wù)程序),就需要在服務(wù)程序內(nèi)編入“開(kāi)中斷”的操作。
“嵌套中斷”原則上允許“自己嵌套自己”,也就是說(shuō),一次中斷服務(wù)程序的執(zhí)行中途又被打斷并進(jìn)入了和自己一樣的中斷服務(wù)程序,并從頭到尾執(zhí)行一遍,結(jié)束后返回到先前打斷的那一點(diǎn),并繼續(xù)執(zhí)行后半截服務(wù)程序。這種情況會(huì)產(chǎn)生什么效果,是需要程序員自己考慮的。
也有的CPU具有“優(yōu)先次序”機(jī)制,可以在某一級(jí)的中斷服務(wù)程序里禁止優(yōu)先級(jí)不比自己高的其他中斷來(lái)打斷自己。同時(shí),也提供給程序員有“放棄優(yōu)先權(quán)”以及“修改優(yōu)先級(jí)”的靈活性。
而被優(yōu)先機(jī)制暫時(shí)“屏蔽”的那些較低優(yōu)先級(jí)的中斷申請(qǐng),同樣掛號(hào)仍在,以后高優(yōu)先級(jí)的中斷結(jié)束以后,還能響應(yīng)。
不過(guò)需要注意,大多數(shù)的CPU中,“中斷掛號(hào)”是只能掛一個(gè)的。也就是說(shuō),在前一次的中斷申請(qǐng)所掛的號(hào)還沒(méi)有被清除以前,又來(lái)了下一個(gè)中斷申請(qǐng),那么,第二個(gè)掛號(hào)是掛不上的。
不過(guò)某些處理器中,中斷掛號(hào)可能分成幾個(gè)層次:CPU里面是一層,外圍針對(duì)各個(gè)具體的設(shè)備,還有另外一級(jí)“預(yù)備掛號(hào)”,那就比較復(fù)雜了。
另外多說(shuō)幾句:上面已經(jīng)說(shuō),程序員可以自己決定你的中斷服務(wù)程序允許還是不允許“嵌套”。
如果不允許,您可以采用關(guān)中斷的辦法,或者利用優(yōu)先機(jī)制,來(lái)屏蔽同一中斷源的第二個(gè)中斷請(qǐng)求。
這樣,第二個(gè)中斷就不會(huì)被響應(yīng)。但它仍可以掛上一個(gè)號(hào)(只要它發(fā)生在上一個(gè)中斷掛號(hào)已經(jīng)被清除掉以后的時(shí)間)。然后,中斷服務(wù)程序結(jié)束時(shí),一般都會(huì)開(kāi)中斷并釋放優(yōu)先級(jí)屏蔽。然后,第二個(gè)中斷請(qǐng)求就會(huì)被響應(yīng),于是再一次執(zhí)行中斷服務(wù)程序。
如果允許“嵌套”,那就會(huì)如我上面所說(shuō):
一次中斷服務(wù)程序的執(zhí)行中途又被打斷并進(jìn)入了和自己一樣的中斷服務(wù)程序,并從頭到尾執(zhí)行一遍,結(jié)束后返回到先前打斷的那一點(diǎn),并繼續(xù)執(zhí)行后半截服務(wù)程序。
評(píng)論