剛學(xué)單片機,在中斷這塊我總是遇見問題,下面這段程序我想現(xiàn)實的效果是:開機時兩端的LED燈閃爍,當(dāng)我給單片機一個外部中斷的時候,小燈熄滅一段時間后,第二個LED燈和倒數(shù)第二個LED燈閃爍,持續(xù)2秒(用定時器中斷實現(xiàn))然后所有的燈熄滅。可是當(dāng)我給單片機一個外部中斷后,小燈確實滅了一段時間,可是過了一段時間后并沒有出現(xiàn)第二個LED燈和倒數(shù)第二個LED燈閃爍持續(xù)2秒,然后熄滅的情況,而是返回了開始兩端LED燈閃爍的情況!(好像下面代碼紅色的部分沒執(zhí)行)我都改了N+1遍了都沒有出現(xiàn)我想要的情況,都快絕望了!請大家?guī)蛶兔Γ鉀Q一下。(LED燈接P0口)
#include<reg52.h> int n,a; void delaytime(int ms) //控制小燈的閃爍 { int x,y; for(x=ms;x>0;x--) for(y=200;y>0;y--); }
void forword() //使p0.0和P0.7口閃爍(兩端的小燈閃爍) { while(1) { P0=0x7e; delaytime(20); P0=0xff; delaytime(20); } }
void back() //P0.1和P0.6口燈閃爍(第二個燈和倒數(shù)第二個燈閃爍)2秒后熄滅 { TMOD=0x01; //定時器工作在方式1 TH0=(65536-50000)/256; // 50ms定時 TL0=(65536-50000)%256; ET0=1; //允許定時器中斷 TR0=1; //開啟定時器 while(1) { if(n==40) //判斷是否到了兩秒(40*50ms),到了 關(guān)閉所有燈 { P0=0xff; // 燈滅 while(1); } P0=0xbd; //P0.1和P0.6口燈亮 delaytime(20); P0=0xff; delaytime(20); } }
void main() { a=0; IT0=1; //外部0中斷,跳沿觸發(fā)方式 EA=1; // 開總中斷 EX0=1; //允許外部0中斷 if(a!=0) //判斷a==1?,不等于則調(diào)用back(),使P0.6和P0.2口燈閃爍2秒后滅掉 back(); else forword(); //否則調(diào)用forward(),使p0.0和P0.7口燈閃爍 }
void extinter() interrupt 0 //外部中斷0函數(shù) { a++; P0=0xff; //所有的燈滅 delaytime(100); // 延時 }
void timer0() interrupt 1 //定時器0中斷函數(shù) { TH0=(65536-50000)/256; TL0=(65536-50000)%256; n++; } 起初我以為是因為中斷優(yōu)先級的問題,可是當(dāng)我把外部中斷0改為外部中斷1時還是不行。 當(dāng)我把 back()函數(shù)放在外部中斷函數(shù)里調(diào)用的時候,它的確被調(diào)用了,但是出現(xiàn)了 P0.1和P0.6口燈一直在閃爍(第二個燈和倒數(shù)第二個燈閃爍)的情況,而并沒有出現(xiàn)持續(xù)兩秒后自動熄滅的效果,好像并沒有調(diào)用定時器中斷;當(dāng)我在forward()中加入 if(a!=0) back();時出現(xiàn)的情況還是跟我提出的問題一樣,并沒有調(diào)用back()函數(shù)
[此貼子已經(jīng)被作者于2008-11-23 11:02:05編輯過]
|