新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)中斷問(wèn)題30例

單片機(jī)中斷問(wèn)題30例

作者: 時(shí)間:2013-05-07 來(lái)源:網(wǎng)絡(luò) 收藏

第一個(gè)送來(lái)的申請(qǐng)信號(hào),也不可過(guò)短,應(yīng)該能讓對(duì)方檢測(cè)到。

10、程序如下,我想要得到的效果是1秒左邊的電動(dòng)機(jī)轉(zhuǎn)動(dòng),同時(shí)黃燈亮,1秒右邊轉(zhuǎn)動(dòng),藍(lán)燈亮,以此循環(huán)下去,但是這個(gè)程序用上去后,左邊轉(zhuǎn)》右邊轉(zhuǎn)》左邊轉(zhuǎn)》之后就一直是左邊了,不切換了,誰(shuí)能幫我解決下問(wèn)題,感激不盡!!

#include

sbit m=P2^0;

sbit b=P2^6;

sbit y=P2^7;

unsigned char count;

void main()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

ET0=1;

EA=1;

count=0;

m=!0;

b=!1;

y=!0;

while(1)

{

if(TF0==1)

{

count++;

if(count==20)

{

m=0;

b=1;

y=0;

}

if(count==40)

{

m=!0;

b=!1;

y=!0;

}

TF0=0;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

}

}

答案

#include

sbit m=P2^0;

sbit b=P2^6;

sbit y=P2^7;

unsigned char count;

void main()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

count=0;

m=!0;

b=!1;

y=!0;

while(1) {

if(TF0==1) {

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TF0=0;

count++;

if(count==20) {

m=0; b=1; y=0;

}

if(count==40) {

count=0; //加上這句.

m=!0; b=!1; y=!0;

}

}

}

}!

用T0定時(shí)50ms,溢出20次,溢出40次,分別代表了具體的時(shí)間。 溢出40次之后,應(yīng)該從頭開(kāi)始統(tǒng)計(jì)溢出次數(shù),所以,此處應(yīng)該有count=0;。 樓主原來(lái)的程序,缺少count=0;,那么它就會(huì)繼續(xù)增加,直到65536,才自動(dòng)回到0。 這樣,時(shí)間,就難以控制了。

11、求助關(guān)于51外部中斷的問(wèn)題,小弟最近在學(xué),剛做了一個(gè)鍵盤(pán)掃描程序。發(fā)現(xiàn)如果外部中斷為電平觸發(fā),程序能正常運(yùn)行。但如果改為邊沿觸發(fā),在將鍵值送給顯示重開(kāi)中斷指令為EX0=1后,中斷竟然還會(huì)被觸發(fā)一次,這之后,再按鍵就不能觸發(fā)中斷了。如果將中斷程序中關(guān)中斷語(yǔ)句去掉,按鍵能被掃描,但引起中斷的次數(shù)不好說(shuō)了。請(qǐng)大俠們看看哪出問(wèn)題了。謝謝

uchar keynum,//定義全局變量按鍵時(shí)的鍵值

dpnum,//顯示值

time1,//延時(shí)計(jì)數(shù)值

topen,//延時(shí)計(jì)數(shù)控制

keyin;//外部中斷0向主程序傳遞有中斷標(biāo)識(shí),有鍵按下

keydeal;//按鍵程序調(diào)用標(biāo)志

uchar keytable[4][4]={7,8,9,'/',4,5,6,'*',1,2,3,'-','c',0,'=','+'};//按實(shí)際鍵盤(pán)編值

uchar keyboard();//鍵盤(pán)掃描程序,負(fù)責(zé)鍵值掃描,判斷鍵釋放由主函數(shù)完成

void display(uchar,uchar);// 顯示子程序,

sbit keysign=P3^2;//P3.2為中斷0入口,此定義用于程序判斷是否真有鍵按下及鍵是否釋放

void main()

{uchar keybiao,keybiao1;//有鍵按下標(biāo)志,鍵放開(kāi)標(biāo)志

IE=0x89;//開(kāi)總中斷,外部中斷0,定時(shí)器中斷1

IT0=1;//中斷觸發(fā)方式

PT1=1;//中斷優(yōu)先級(jí)

TMOD=0x90;//定時(shí)器1工作方式1

TH1=(65536-5000)/256;//定時(shí)器初值高8位(定時(shí)5ms)

TL1=(65536-5000)%256;

TR1=1;//開(kāi)始計(jì)時(shí)

P2=0xf0;//給鍵盤(pán)列高電平,行低電平

keydeal=0x00;//讓鍵處理初值為0,既未處理

while(1)

{if(keyin==1) //可能有鍵按下

{

if(time1>=2)//已延時(shí)10ms;計(jì)數(shù)2次,

{if(keysign==0keydeal==0)

{keynum=keyboard();

keybiao=1;

keydeal=1;

topen=0;//關(guān)延時(shí)計(jì)數(shù)

}//判斷是否真有鍵按下,調(diào)用鍵盤(pán)掃描程序

else if(keybiao==0time1>=2keybiao1==0)

{EX0=1;

keyin=0;

topen=0;

}//如果沒(méi)鍵按下,重開(kāi)外部中斷0,中斷標(biāo)志清0

}

if(keybiao==1keysign!=0)

{keybiao=0;

time1=0;

keybiao1=1;//為防止前一次time1的影響而設(shè)的標(biāo)志

topen=1;

}

if(keybiao1==1time1>=2)

{keybiao1=0;

topen=0;

EX0=1;

keyin=0;//重開(kāi)外部中斷0,中斷標(biāo)志清0

keydeal=0;//重開(kāi)鍵未處理,讓程序可調(diào)用處理程序

dpnum=keynum;//將鍵值傳給顯示

}

}

}

}

void display(uchar x,uchar i)//中斷控制顯示,顯示一直持續(xù)到下次中斷到

uchar keyboard()

{uchar con1,con2,i,j;

con1=P2|0x0f;//只保留P2口高四位,便于switch

switch(con1)//通過(guò)cp可得到列為0的位

{case 0x7f:j=3;break;//j為列值

case 0xbf:j=2;break;

case 0xdf:j=1;break;

case 0xef:j=0;break;

}

for(i=0;i=3;i++)

{P2=_crol_(0xfe,i);//依次給行賦0

con2=P2|0x0f;// 只保留P2口高四位,便于比較

if(con2!=0xff) break;

}

P2=0xf0;//給鍵盤(pán)列高電平,行低電平

return(keytable[i][j]);

}

void T1_time()interrupt 3

{TH1=(65536-5000)/256;//定時(shí)器初值高8位(定時(shí)5ms)

TL1=(65536-5000)%256;

time1++;

if(topen!=1) time1=0;//如果延時(shí)標(biāo)志不為1,不開(kāi)始計(jì)時(shí)

display(dpnum,5);

}

void int0()interrupt 0

{EX0=1;

keyin=1;//向主程序傳遞鍵按下



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉