<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機常見延時與中斷問題及解決方法

          單片機常見延時與中斷問題及解決方法

          作者: 時間:2013-06-06 來源:網絡 收藏

          #include

          #define uint unsigned int

          #define uchar unsigned char

          sbit p1_0=P1^0;

          sbit p1_1=P1^1;

          sbit p1_2=P1^2;

          sbit p1_3=P1^3;

          sbit p1_4=P1^4;

          sbit p1_5=P1^5;

          uchar PWM_T1 = 0;

          uchar PWM_T2 = 0;

          uint i,m;

          void delay(uint z)

          {

          for(i=z;i>0;i--)

          for(m=0;m110;m++);

          }

          void PWM_value_left(int pwm_set)

          {

          PWM_T1=pwm_set;

          }

          void PWM_value_right(int pwm_set)

          {

          PWM_T2=pwm_set;

          }

          void main(void)

          {

          bit flag = 1;

          uint n;

          TMOD=0x22;

          TH0=241;

          TH1=241;

          TL0=241;

          TL1=241;

          TR0=1;

          TR1=1;

          ET0=1;

          ET1=1;

          EA=1;

          P1=0xf0;

          delay(20);

          PWM_value_left(7);

          PWM_value_right(10);

          delay(100);

          PWM_value_left(8);

          PWM_value_right(9);

          delay(100);

          PWM_value_left(9);

          PWM_value_right(8);

          delay(100);

          PWM_value_left(10);

          PWM_value_right(7);

          }

          timer0() interrupt 1 using 2

          {

          static uint t ;

          t++;

          if(t==10)

          {

          t=0;

          p1_0=1;

          p1_1=0;

          }

          if(PWM_T1==t)

          P1=P10xfc;

          }

          timer1() interrupt 3

          {

          static uint t1 ;

          t1++;

          if(t1==10)

          {

          t1=0;

          p1_2=1;

          p1_3=0;

          }

          if(PWM_T2==t1)

          P1=P10xf3;

          }

          答:沒有主循環(huán),

          沒有等到中斷3

          程序運行一次就跑飛了!!!

          void main(void)

          {

          //...你的程序

          //在這里加 死循環(huán),等待中斷

          while(1)

          {

          ;

          }

          }

          而且,中斷響應函數(shù)里必須要清中斷標志位(你的沒有)!

          3、各位大俠幫我看一下我寫的51C程序中斷有沒有問題,執(zhí)行中斷后不能繼續(xù)執(zhí)行主程序,注:P3.2口一直接

          注:P3.2口一直接地,程序如下:

          #include

          sbit dula=P2^6;

          sbit wela=P2^7;

          sbit d0=P1^0;

          sbit d1=P1^1;

          sbit d2=P1^2;

          sbit d3=P1^3;

          sbit d4=P1^4;

          sbit d5=P1^5;

          sbit d6=P1^6;

          sbit d7=P1^7;

          #define uchar unsigned char

          #define uint unsigned int

          uchar num;

          uchar code table[]={

          0x3f,0x06,0x5b,0x4f,

          0x66,0x6d,0x7d,0x07,

          0x7f,0x6f,0x77,0x7c,

          0x39,0x5e,0x79,0x71};

          void delay(uint z);

          void main()

          {

          EA=1;

          EX0=1;

          IT0=0;

          wela=1;

          P0=0xc0;

          wela=0;

          while(1)

          {

          for(num=0;num16;num++)

          {

          dula=1;

          P0=table[num];

          dula=0;

          delay(1000);

          }

          }

          }

          void delay(uint z)

          {

          uint a,b;

          for(a=z;a>0;a--)

          for(b=110;b>0;b--);

          }

          void exter0() interrupt 0

          {

          uint c;

          for(c=0;c25000;c++);

          d0=0;

          for(c=0;c25000;c++);

          d0=1;

          for(c=0;c25000;c++);

          d1=0;

          for(c=0;c25000;c++);

          d1=1;

          for(c=0;c25000;c++);

          d2=0;

          for(c=0;c25000;c++);

          d2=1;

          for(c=0;c25000;c++);

          d3=0;

          for(c=0;c25000;c++);

          d3=1;

          for(c=0;c25000;c++);

          d4=0;

          for(c=0;c25000;c++);

          d4=1;

          for(c=0;c25000;c++);

          d5=0;

          for(c=0;c25000;c++);

          d5=1;

          for(c=0;c25000;c++);

          d6=0;

          for(c=0;c25000;c++);

          d6=1;

          for(c=0;c25000;c++);

          d7=0;

          for(c=0;c25000;c++);

          d7=1;

          }

          答:

          IT0=0;//低電平觸發(fā),只要監(jiān)測到是低電平,就觸發(fā)中斷

          你P3.2一直接地,一直是低電平,那中斷就不斷的執(zhí)行,當然回不到主程序中了。

          改成IT0=1;//下降沿觸發(fā),監(jiān)測到高電平到電平跳變,就觸發(fā)中斷

          就算P3.2一直接地,也只觸發(fā)一次,中斷執(zhí)行完了,就回到主程序中了。

          4、我的單片機這個程序為什么不能完全執(zhí)行整個程序誰能告訴我!就是沒法執(zhí)行3次亮暗的!

          2010-10-20 21:40 提問者:3865203bin3 | 懸賞分:10

          ORG 0000H

          AG:MOV A,#11111110B

          AG1:RL A

          MOV P0,A

          ACALL DELAY

          DJNZ R0,AG1

          ACALL DELAY

          MOV A,#11111111B

          MOV P1,A

          ACALL DELAY

          MOV P0,#00000000B

          ACALL DELAY

          MOV P0,#11111111B

          ACALL DELAY

          MOV P0,#00000000B

          ACALL DELAY

          MOV P0,#11111111B

          ACALL DELAY

          SJMP AG

          DELAY:MOV R3,#10

          D3:MOV R2,#200

          D1:MOV R1,#250

          D2JNZ R1,D2

          DJNZ R2,D1

          DJNZ R3,D3

          RET

          END

          我是想執(zhí)行完流水燈亮.就然后執(zhí)行全亮全暗3次 !可是就是不會跳到全亮全暗3次~~

          答:

          R0沒有賦初值!另外建議不要使用前2B個地址,因為51中斷矢量就在這個空間里。建議從0030H開始。以下程序在keil4中仿真成功。

          51單片機相關文章:51單片機教程


          c語言相關文章:c語言教程


          晶振相關文章:晶振原理


          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();