久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3685|回復: 8
打印 上一主題 下一主題
收起左側

以前沒做過單片機寫了個簡單中斷出問題了,求助啊!

[復制鏈接]
跳轉到指定樓層
樓主
50黑幣
本帖最后由 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;        


}


最佳答案

查看完整內容

剛沒發出去?#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
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:187041 發表于 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);         
                         }

        }
}


試了效果可以.你改下腳或者數組試試....
回復

使用道具 舉報

板凳
ID:145721 發表于 2017-4-27 21:36 | 只看該作者
請大家來指導指導謝謝
回復

使用道具 舉報

地板
ID:148552 發表于 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;        


}


評分

參與人數 1黑幣 +10 收起 理由
dabaojiu + 10

查看全部評分

回復

使用道具 舉報

5#
ID:187041 發表于 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);         
                         }

        }
}


回復

使用道具 舉報

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

剛剛看到,前幾天出去幾天,多謝多謝
回復

使用道具 舉報

7#
ID:145721 發表于 2017-4-30 20:16 | 只看該作者
你像風兒來了 發表于 2017-4-28 13:19
TurnLeft(); //調用數碼管左移
這個函數里面有個while(1)大循環,程序根本不會執行后面的兩個if判斷, ...

多謝多謝 看到問題了
回復

使用道具 舉報

8#
ID:111634 發表于 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文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。


回復

使用道具 舉報

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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美福利| 国产特级毛片aaaaaa喷潮 | 男人天堂网站 | 中文字幕日韩欧美 | 欧美亚洲网站 | 亚洲午夜三级 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 日本黄色的视频 | 91中文字幕在线观看 | 情侣酒店偷拍一区二区在线播放 | 九九看片 | 成人欧美一区二区三区白人 | 手机日韩 | 亚洲色图综合 | 久草欧美 | 在线观看中文字幕一区二区 | 欧美aⅴ | av片在线免费看 | 久久亚洲一区二区 | 成人在线免费观看 | 免费毛片网站在线观看 | 亚洲毛片一区二区 | 精品在线播放 | 最新日韩精品 | 中文字幕av网 | 精品国产99 | 欧美激情在线播放 | 日韩精品一区二区三区在线 | 国产精品视频在线播放 | 亚洲视频在线观看 | 18成人在线观看 | 中文字幕一区二区三区日韩精品 | 国产精品久久久久久久久久99 | 综合久| 91精品国产综合久久久久 | 日韩手机在线视频 | 一本色道精品久久一区二区三区 | 在线观看av不卡 | 国产一级视频在线观看 | 国产99久久精品一区二区永久免费 | 国产精品国产三级国产aⅴ无密码 |