找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2703|回復(fù): 5
收起左側(cè)

51單片機(jī)花樣流水燈怎么用中斷控制啟停和切換模式

[復(fù)制鏈接]
ID:1012017 發(fā)表于 2022-6-3 09:42 | 顯示全部樓層 |閱讀模式
如題
回復(fù)

使用道具 舉報(bào)

ID:1024371 發(fā)表于 2022-6-3 16:50 | 顯示全部樓層
可以根據(jù)這個(gè)程序改自己想要的
#include<reg52.h>

sbit beep=P1^5;
sbit k1=P3^1;
sbit k3=P3^2;//外部中斷0 p32
sbit led=P2^0;
#define N P2
typedef unsigned int ui;
typedef unsigned char uc;
uc num;
uc zd_bz;

void delay(ui i)
{
        while(i--);
}
void fmq()//蜂鳴器
{
        beep=~beep;
        delay(100);
}
void led0()//流水燈
{
        N=0xff;
        N=0xfe;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
       
        N=0xfd;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
       
        N=0xfb;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
       
        N=0xf7;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
       
        N=0xef;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
       
        N=0xdf;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;

        N=0xbf;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;

        N=0x7f;
        fmq();
        delay(50000);
       
       
  if(num!=0){return;}
        P0=0xfe;
}

void led1()//led對稱亮
{
        while(1)
        {
                N=0x7e;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xbd;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xdb;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xe7;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xe7;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xdb;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xbd;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0x7e;
                fmq();
                delay(35000);
                //delay(35000);
               
                if(num!=1){break;}
                P0=0xfc;
  }
}
void led2()//led分別單雙數(shù)亮
{
        while(1)
        {
                N=0xaa;
                fmq();
                delay(50000);
                delay(50000);
                if(num!=2){break;}
                P0=0xf8;
               
                N=0x55;
                fmq();
                delay(50000);
                delay(50000);
                P0=0xf8;
                if(num!=2){break;}
                P0=0xf8;
}
       
}
void led3()//通過按鍵k1使led一個(gè)一個(gè)亮
{
        ui i;
        N=0xfe;
        while(1)
        {
                if(k1==0)
                {  
                  switch(i)
                        {
                         case(0):N=0xfd;fmq();i++;break;
                         case(1):N=0xfb;fmq();i++;break;
                         case(2):N=0xf7;fmq();i++;break;
                         case(3):N=0xef;fmq();i++;break;
                         case(4):N=0xdf;fmq();i++;break;
                         case(5):N=0xbf;fmq();i++;break;
                         case(6):N=0x7f;fmq();i++;break;
                         case(7):N=0xff;fmq();i++;break;
                        }
                  while(!k1);
                       
                }
               
                if(i>=8){i=0;break;}
                P0=0xf0;
                if(num!=3){break;}
        }
}

void init()//中斷初始化
{
        IT0=1;//外部中斷0 跳變觸發(fā)
        EX0=1;//外部中斷0 p32
        EA=1;
}
void main()
{
               
        init();
       
        while(1)
        {
               
                        switch(num)
                        {
                         case(0):led0();
                                       P0=0xfe;
                                      break;
                         case(1):led1();
               P0=0xfc;                               
                                      break;
                         case(2):led2();
                                       P0=0xf8;
                                       break;//num++;
                         case(3):led3();
                                       P0=0xf0;
                                        break;
                         
                        }
                       
        }
       
}
               
void init0() interrupt 0//中斷程序 k3
{
        //EX0=0;
       
        if(num==0){P0=0xfe;}
        num=num+1;
       
        if(num==1){P0=0xfc;}
        if(num==2){P0=0xf8;}
        if(num==3){P0=0xf0;}
       
  if(num>3){num=0;}
       
        //EX0=1;
}

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2022-6-4 10:48 | 顯示全部樓層
什么中斷? 定時(shí)器還是外部中斷?
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2022-6-6 09:59 | 顯示全部樓層
1、將N個(gè)流水燈切割成M個(gè)顯示狀態(tài)。
2、每次中斷時(shí)顯示一個(gè)狀態(tài)就可以了。
就看你如何切割了。
回復(fù)

使用道具 舉報(bào)

ID:1032691 發(fā)表于 2022-6-6 19:41 | 顯示全部樓層
使用兩個(gè)中斷函數(shù)分別控制啟停
回復(fù)

使用道具 舉報(bào)

ID:1004455 發(fā)表于 2022-6-6 22:28 | 顯示全部樓層
分別寫兩個(gè)中斷函數(shù),一個(gè)用來暫停,一個(gè)用來開始,仿真再弄兩個(gè)外部中斷按鍵
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表