在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

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

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

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

      第一個送來的申請信號,也不可過短,應(yīng)該能讓對方檢測到。

      10、程序如下,我想要得到的效果是1秒左邊的電動機(jī)轉(zhuǎn)動,同時黃燈亮,1秒右邊轉(zhuǎn)動,藍(lán)燈亮,以此循環(huán)下去,但是這個程序用上去后,左邊轉(zhuǎn)》右邊轉(zhuǎn)》左邊轉(zhuǎ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定時50ms,溢出20次,溢出40次,分別代表了具體的時間。 溢出40次之后,應(yīng)該從頭開始統(tǒng)計溢出次數(shù),所以,此處應(yīng)該有count=0;。 樓主原來的程序,缺少count=0;,那么它就會繼續(xù)增加,直到65536,才自動回到0。 這樣,時間,就難以控制了。

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

      uchar keynum,//定義全局變量按鍵時的鍵值

      dpnum,//顯示值

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

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

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

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

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

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

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

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

      void main()

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

      IE=0x89;//開總中斷,外部中斷0,定時器中斷1

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

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

      TMOD=0x90;//定時器1工作方式1

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

      TL1=(65536-5000)%256;

      TR1=1;//開始計時

      P2=0xf0;//給鍵盤列高電平,行低電平

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

      while(1)

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

      {

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

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

      {keynum=keyboard();

      keybiao=1;

      keydeal=1;

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

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

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

      {EX0=1;

      keyin=0;

      topen=0;

      }//如果沒鍵按下,重開外部中斷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;//重開外部中斷0,中斷標(biāo)志清0

      keydeal=0;//重開鍵未處理,讓程序可調(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)//通過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;//給鍵盤列高電平,行低電平

      return(keytable[i][j]);

      }

      void T1_time()interrupt 3

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

      TL1=(65536-5000)%256;

      time1++;

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

      display(dpnum,5);

      }

      void int0()interrupt 0

      {EX0=1;

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



      評論


      相關(guān)推薦

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

      關(guān)閉