欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 以前沒做過單片機寫了個簡單中斷出問題了,求助啊! [打印本頁]

作者: dabaojiu    時間: 2017-4-27 21:32
標題: 以前沒做過單片機寫了個簡單中斷出問題了,求助啊!
本帖最后由 dabaojiu 于 2017-5-4 10:09 編輯


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar Flag0;
uchar Flag1;
//--------------------------------------------------------------------------------------------------------------------------
void DelayMs(uint t)//定義延時函數
{
        uchar j;
        while(t--)
        {        
                for(j=0;j<113;j++);
        }


}
//--------------------------------------------------------------------------------------------------------------------------
void TurnLeft (void)  //定義LED燈做左循環
{
                  
unsigned char i;  //定義一個無符號字符型局部變量 i 取值范圍 0~255
DelayMs(500);
P1=0xfe;           //賦初始值
while (1)         //主循環
  {
for(i=0;i<8;i++)   //加入 for循環,表明for循環大括號中的程序循環執行8次
  {
   DelayMs(500);
   P1<<=1;
   P1=P1|0x01;     //左移后,最右端自動賦值0,所以需要該語句賦值1
  }
  P1=0xfe;           //重新賦初始值
  //主循環中添加其他需要一直工作的程序
  }
}
//--------------------------------------------------------------------------------------------------------------------------
void TurnRight (void)
{
                  
unsigned char k;  //定義一個無符號字符型局部變量 k 取值范圍 0~255
DelayMs(500);
P1=0x7f;           //賦初始值
while (1)          //主循環
  {
for(k=0;k<8;k++)   //加入 for循環,表明for循環大括號中的程序循環執行8次
  {
   DelayMs(500);
   P1>>=1;
   P1=P1|0x80;     //右移后,最左端自動賦值0,所以需要該語句賦值1
  }
  P1=0x7f;           //重新賦初始值
  
  }
}
//--------------------------------------------------------------------------------------------------------------------------


void FastTurnLeft (void)  //定義LED燈做快速的左循環
{
                  
unsigned char l;  //定義一個無符號字符型局部變量 l 取值范圍 0~255
DelayMs(500);
P1=0xfe;           //賦初始值
while (1)         //主循環
  {
for(l=0;l<8;l++)   //加入 for循環,表明for循環大括號中的程序循環執行8次
  {
   DelayMs(50);    //做快速左循環時調整了延時函數
   P1<<=1;
   P1=P1|0x01;     //左移后,最右端自動賦值0,所以需要該語句賦值1
  }
  P1=0xfe;           //重新賦初始值
  //主循環中添加其他需要一直工作的程序
  }
}


//--------------------------------------------------------------------------------------------------------------------------
void main(void)  //定義主函數
{
        IE=0x85;  //開放式中斷
        TCON=0x05; //邊沿方式,自清中斷標志


while(1)
  {
    TurnLeft(); //調用數碼管左移
  if(Flag0 == 1)
          {
          TurnRight();//調用數碼管右移
          }
  if(Flag1 == 1)
          {
          FastTurnLeft();//調用數碼管快速右移
          }


  }


}


//--------------------------------------------------------------------------------------------------------------------------
//兩個中斷程序控制Flag1,Flag0兩個狀態標識。
void Ex0Isr()interrupt 0  
{
        if (Flag0 == 0)Flag0 = 1;
        Flag1 = 0;
        
}
void Ex1Isr()interrupt 2
{
        if (Flag1 == 0)Flag1 = 1;
        Flag0 = 0;        


}



作者: bbg3659    時間: 2017-4-27 21:32
剛沒發出去?#include "reg51.h"
sbit K1=P3^1;
sbit K2=P3^0;

unsigned char led1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char led2[9]={0x7f,0x3f,0x9f,0xcf,0xe7,0xf3,0xf9,0xfc,0xfe};
unsigned char i,j;
void delay(unsigned int x)
{
  unsigned char a,b;
  while(x--);
  for(a=0;a<100;a++)
    {
          for(b=0;b<100;b++)
           {}
        }
}

void mint()
  {
     unsigned char a,b;
          if(i==1&&j==0)
          {       
            switch(a)
                {
            case 0:P2=led1[0];a++;delay(20000);break;
                case 1:P2=led1[1];a++;delay(20000);break;
                case 2:P2=led1[2];a++;delay(20000);break;
                case 3:P2=led1[3];a++;delay(20000);break;
                case 4:P2=led1[4];a++;delay(20000);break;
                case 5:P2=led1[5];a++;delay(20000);break;
                case 6:P2=led1[6];a++;delay(20000);break;
                case 7:P2=led1[7];a=0;delay(20000);break;
                default:  break;
           }
          }
          if(j==1&&i==0)
             {       
                 switch(b)
                 {
                case 0:P2=led2[0];b++;        delay(20000);break;
                case 1:P2=led2[1];b++;        delay(20000);break;
                case 2:P2=led2[2];b++;        delay(20000);break;
                case 3:P2=led2[3];b++;        delay(20000);break;
                case 4:P2=led2[4];b++;        delay(20000);break;
                case 5:P2=led2[5];b++;        delay(20000);break;
                case 6:P2=led2[6];b++;        delay(20000);break;
                case 7:P2=led2[7];b++;        delay(20000);break;
                case 8:P2=led2[8];b=0;        delay(20000);break;
                 default:  break;
                  }
                 }
  }

void main()
{

  while(1)
    {
          mint();
          if(K1==0)
             {
                  delay(10);
                  if(K1==0)
                    {
                         i=1;
                         j=0;
                        }
                        while(!K1);
                 }
                 if(K2==0)
                     {
                          delay(10);
                          if(K2==0)
                            {
                                 j=1;
                                 i=0;
                                }
                  while(!K2);         
                         }

        }
}


試了效果可以.你改下腳或者數組試試....
作者: dabaojiu    時間: 2017-4-27 21:36
請大家來指導指導謝謝
作者: 你像風兒來了    時間: 2017-4-28 13:19
TurnLeft(); //調用數碼管左移
這個函數里面有個while(1)大循環,程序根本不會執行后面的兩個if判斷,所以你中斷里標志改變了也沒有用,因為程序一直執行TurnLeft(); //調用數碼管左移

程序我幫你修改了


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar Flag0=0;
uchar Flag1=0;
//--------------------------------------------------------------------------------------------------------------------------
void DelayMs(uint t)//定義延時函數
{
        uchar j;
        while(t--)
        {        
                for(j=0;j<113;j++);
        }


}
//--------------------------------------------------------------------------------------------------------------------------
void TurnLeft (void)  //定義LED燈做左循環
{
                  
unsigned char i;  //定義一個無符號字符型局部變量 i 取值范圍 0~255
DelayMs(500);
P1=0xfe;           //賦初始值
//while (1)         //主循環
  {
for(i=0;i<8;i++)   //加入 for循環,表明for循環大括號中的程序循環執行8次
  {
   DelayMs(500);
   P1<<=1;
   P1=P1|0x01;     //左移后,最右端自動賦值0,所以需要該語句賦值1
  }
  P1=0xfe;           //重新賦初始值
  //主循環中添加其他需要一直工作的程序
  }
}
//--------------------------------------------------------------------------------------------------------------------------
void TurnRight (void)
{
                  
unsigned char k;  //定義一個無符號字符型局部變量 k 取值范圍 0~255
DelayMs(500);
P1=0x7f;           //賦初始值
//while (1)          //主循環
  {
for(k=0;k<8;k++)   //加入 for循環,表明for循環大括號中的程序循環執行8次
  {
   DelayMs(500);
   P1>>=1;
   P1=P1|0x80;     //右移后,最左端自動賦值0,所以需要該語句賦值1
  }
  P1=0x7f;           //重新賦初始值
  
  }
}
//--------------------------------------------------------------------------------------------------------------------------


void FastTurnLeft (void)  //定義LED燈做快速的左循環
{
                  
unsigned char l;  //定義一個無符號字符型局部變量 l 取值范圍 0~255
DelayMs(500);
P1=0xfe;           //賦初始值
//while (1)         //主循環
  {
for(l=0;l<8;l++)   //加入 for循環,表明for循環大括號中的程序循環執行8次
  {
   DelayMs(50);    //做快速左循環時調整了延時函數
   P1<<=1;
   P1=P1|0x01;     //左移后,最右端自動賦值0,所以需要該語句賦值1
  }
  P1=0xfe;           //重新賦初始值
  //主循環中添加其他需要一直工作的程序
  }
}


//--------------------------------------------------------------------------------------------------------------------------
void main(void)  //定義主函數
{
        IE=0x85;  //開放式中斷
        TCON=0x05; //邊沿方式,自清中斷標志
          

while(1)
  {


  if((Flag0==0)&&(Flag1 == 0))
  {
    TurnLeft(); //調用數碼管左移
  }

  if(Flag0 == 1)
          {
           TurnRight ();
          }
  if(Flag1 == 1)
          {
         FastTurnLeft();//調用數碼管快速右移
          }
  }


}


//--------------------------------------------------------------------------------------------------------------------------
//兩個中斷程序控制Flag1,Flag0兩個狀態標識。
void Ex0Isr()interrupt 0  
{
        if (Flag0 == 0)Flag0 = 1;
        Flag1 = 0;
               
        
}
void Ex1Isr()interrupt 2
{
        if (Flag1 == 0)Flag1 = 1;
        Flag0 = 0;        


}



作者: bbg3659    時間: 2017-4-28 14:23
這樣在跑for()的時候,你跳不出吧.必須要它跑完.
我寫了一個,試了一下可以跑兩個流水,中間也可以跳出來.你改下腳或者數組試試...我也在學習中

#include "reg51.h"
sbit K1=P3^1;
sbit K2=P3^0;

unsigned char led1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char led2[9]={0x7f,0x3f,0x9f,0xcf,0xe7,0xf3,0xf9,0xfc,0xfe};
unsigned char i,j;
void delay(unsigned int x)
{
  unsigned char a,b;
  while(x--);
  for(a=0;a<100;a++)
    {
          for(b=0;b<100;b++)
           {}
        }
}

void mint()
  {
     unsigned char a,b;
          if(i==1&&j==0)
          {       
            switch(a)
                {
            case 0:P2=led1[0];a++;delay(20000);break;
                case 1:P2=led1[1];a++;delay(20000);break;
                case 2:P2=led1[2];a++;delay(20000);break;
                case 3:P2=led1[3];a++;delay(20000);break;
                case 4:P2=led1[4];a++;delay(20000);break;
                case 5:P2=led1[5];a++;delay(20000);break;
                case 6:P2=led1[6];a++;delay(20000);break;
                case 7:P2=led1[7];a=0;delay(20000);break;
                default:  break;
           }
          }
          if(j==1&&i==0)
             {       
                 switch(b)
                 {
                case 0:P2=led2[0];b++;        delay(20000);break;
                case 1:P2=led2[1];b++;        delay(20000);break;
                case 2:P2=led2[2];b++;        delay(20000);break;
                case 3:P2=led2[3];b++;        delay(20000);break;
                case 4:P2=led2[4];b++;        delay(20000);break;
                case 5:P2=led2[5];b++;        delay(20000);break;
                case 6:P2=led2[6];b++;        delay(20000);break;
                case 7:P2=led2[7];b++;        delay(20000);break;
                case 8:P2=led2[8];b=0;        delay(20000);break;
                 default:  break;
                  }
                 }
  }

void main()
{

  while(1)
    {
          mint();
          if(K1==0)
             {
                  delay(10);
                  if(K1==0)
                    {
                         i=1;
                         j=0;
                        }
                        while(!K1);
                 }
                 if(K2==0)
                     {
                          delay(10);
                          if(K2==0)
                            {
                                 j=1;
                                 i=0;
                                }
                  while(!K2);         
                         }

        }
}



作者: dabaojiu    時間: 2017-4-30 20:15
bbg3659 發表于 2017-4-28 14:23
這樣在跑for()的時候,你跳不出吧.必須要它跑完.
我寫了一個,試了一下可以跑兩個流水,中間也可以跳出 ...

剛剛看到,前幾天出去幾天,多謝多謝
作者: dabaojiu    時間: 2017-4-30 20:16
你像風兒來了 發表于 2017-4-28 13:19
TurnLeft(); //調用數碼管左移
這個函數里面有個while(1)大循環,程序根本不會執行后面的兩個if判斷, ...

多謝多謝 看到問題了
作者: zl2168    時間: 2017-5-1 08:14
本帖最后由 zl2168 于 2017-5-1 17:28 編輯

鍵控流水循環燈。
① 8個發光二極管從上到下(K0斷開)依次循環點亮,每次點亮時間約為0.5秒。
② 按下K0,流水方向從下至上滾動點亮。
③ 按下K1(K2斷開),每循環一次后間隔時間縮短0.1秒,直至最短間隔0.1秒后保持不變。
④ 按下K2(K1斷開),每循環一次后間隔時間增加0.1秒,直至最長間隔1秒后保持不變。
⑤ K1、K2同時斷開或同時閉合,保持原滾動間隔時間不變。



Proteus仿真一下,確認有效。
實例7 鍵控流水循環燈.rar (36.04 KB, 下載次數: 6)
以上摘自張志良編著《80C51單片機Proteus仿真設計實例教程》清華大學出版社ISBN 978-7-302-41682-1仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。



作者: dabaojiu    時間: 2017-5-1 20:24
zl2168 發表于 2017-5-1 08:14
鍵控流水循環燈。
① 8個發光二極管從上到下(K0斷開)依次循環點亮,每次點亮時間約為0.5秒。
② 按下K0 ...

好的好的,我看看,謝謝了。




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1