|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
總理解不了中斷,前輩們請(qǐng)指教 |
| 作者:guohua3946 欄目:單片機(jī) |
學(xué)單片機(jī)一段時(shí)間了,總是不能透徹的理解中斷,哪位前輩能點(diǎn)撥一下。如下面有段很短的例程,怎么理解:(LED亮滅) #include <reg52.h> #include <absacc.h> #define unit unsigned int #define uCHAR unsigned CHAR sbit L0=P2^0; sbit L1=P2^1; sbit L2=P2^2; sbit L3=P2^3; void delays(void) { uCHAR i; for(i=300;i>0;i--); } void main(void) { P2=0x0f; // 初始化端口 EA=1; IT0=1; EX0=1; // 初始化外中斷標(biāo)志位 while(1) { delays(); // 鍵的消抖延時(shí)函數(shù) } } /* 外中斷0的中斷服務(wù)子程序 */ void intersvr0(void) interrupt 0 using 1 { L3=!L3; // 燈L3狀態(tài)取反 L2=!L2; // 燈L2狀態(tài)取反 L1=!L1; // 燈L1狀態(tài)取反 L0=!L0; // 燈L0狀態(tài)取反 } 我這樣理解,在delays()中突然有中斷的話,怎么可能會(huì)起到消抖的作用呢(如果此時(shí)i--到只有幾個(gè)數(shù)時(shí),比如i=3時(shí)有中斷)? 另一種理解是,只要有中斷就進(jìn)中斷服務(wù)程序了,delays()程序與消抖沒(méi)有關(guān)系呀?`` |
| 2樓: | >>參與討論 |
| 作者: OHESE 于 2006/2/1 22:34:00 發(fā)布:
要理解中斷我感覺(jué)匯編好點(diǎn) 用C好象有些模糊,看看高人怎么解,我以前看過(guò)點(diǎn)C感覺(jué)不具體,改了匯編, |
|
| 3樓: | >>參與討論 |
| 作者: maychang 于 2006/2/1 23:49:00 發(fā)布:
這么說(shuō)好理解 你正在看書(shū),來(lái)了個(gè)客人,你放下書(shū)與客人談話,這就是中斷。放下書(shū)之前你記了書(shū)的頁(yè)碼,這叫保護(hù)現(xiàn)場(chǎng)。正談著來(lái)了電話,你暫停談話去接電話,這叫中斷嵌套。放下電話繼續(xù)談,這叫中斷返回。 只要有中斷(但要滿足一些條件,例如已開(kāi)中斷)就進(jìn)中斷服務(wù)程序了,與被中斷的程序無(wú)關(guān)。 |
|
| 4樓: | >>參與討論 |
| 作者: hujunwan 于 2006/2/2 14:39:00 發(fā)布:
delays()程序與消抖沒(méi)有關(guān)系 在while里面的程序與中斷程序沒(méi)有關(guān)系,如果要消除抖動(dòng)的話,請(qǐng)?jiān)谥袛喑绦蚶锩鎑elay(),再查詢以下外中斷的端口,如果有效就開(kāi)始相關(guān)的操作,否則認(rèn)為是抖動(dòng). |
|
| 5樓: | >>參與討論 |
| 作者: mugenwon 于 2006/2/2 15:37:00 發(fā)布:
消抖不是這樣的吧? 中斷顧名思義就是中斷。〞灢?)就是把當(dāng)前做的事停下,先干其他事。你的程序只要INT0腳一來(lái)負(fù)跳變,馬上會(huì)執(zhí)行intersvr0( ),執(zhí)行完后回到原來(lái)的地方。 當(dāng)然你這個(gè)程序很有意思,保證你的LED不聽(tīng)話,你自己試一下就知道了,然后你會(huì)明白怎樣消抖,中斷又是怎么樣的,哈哈! |
|
| 6樓: | >>參與討論 |
| 作者: guohua3946 于 2006/2/2 15:38:00 發(fā)布:
理解你的意思了 明白你的意思了,謝謝你,你說(shuō)的查詢一下外中斷的端口的意思是,再看一下端口是不是低電平,如果是就確認(rèn)中斷有效,如否的話,就認(rèn)為是抖動(dòng)? |
|
| 7樓: | >>參與討論 |
| 作者: 1dqmoon 于 2006/2/3 22:20:00 發(fā)布:
樓主是拿int來(lái)做按鍵吧 這樣做理論是沒(méi)問(wèn)題,但如 mugenwon 所說(shuō),保證你的led不聽(tīng)話,那個(gè)delay不是消顫用的 |
|
| 8樓: | >>參與討論 |
| 作者: guohua3946 于 2006/2/4 14:25:00 發(fā)布:
謝謝兩位大哥 你們說(shuō)的led不聽(tīng)話。是不是因?yàn)镮NT的抖動(dòng)。 |
|
| 9樓: | >>參與討論 |
| 作者: zhaoyu2005 于 2006/2/5 8:44:00 發(fā)布:
設(shè)置錯(cuò)誤! IT0為外部中斷0的觸發(fā)方式控制位。IT0=0,邊沿觸發(fā);IT0=1,電平觸發(fā); 只要INT0為低電平,就會(huì)反復(fù)進(jìn)入中斷,也就是說(shuō),你按一下按鍵,不知道要中斷多少下,當(dāng)然不能聽(tīng)話了 |
|
| 10樓: | >>參與討論 |
| 作者: ferry 于 2006/2/5 9:04:00 發(fā)布:
樓上說(shuō)錯(cuò)了吧 IT0=0是低電平觸發(fā),IT0=1是邊沿觸發(fā)。 |
|
| 11樓: | >>參與討論 |
| 作者: sambie 于 2006/2/5 13:46:00 發(fā)布:
用不著消抖呀,delay呀那么麻煩,只要在 中斷服務(wù)程序中disable這個(gè)中斷就行了。不管有多少抖動(dòng),INT0只執(zhí)行一次。當(dāng)然別忘了返回之前使能INT0 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |