基於51單片機的紅綠燈實現(使用普中科技開發板)


C語言基礎比較薄弱,紅綠燈的倒計時和切換上,用了三個if()嵌套,總感覺應該有更好的方案,如果你恰巧知道,請教教我,在此謝過。以下是程序部分:

 

 

//紅綠燈設計:利用定時器實現LED燈亮滅,數碼管倒計時結束后切換led燈
//P2口控制led燈,38譯碼器選擇數碼管,P0口控制數碼管顯示
//定時器初始化設置,定時器溢出一次為10ms,設置一個變量a=99,a從99-->0,正好100次,也就是1s。

#include"reg52.h"

typedef unsigned int uint;      //對數據類型進行聲明定義
typedef unsigned char uchar;


sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


sbit LED0=P2^7;           //紅燈
sbit LED1=P2^6;           //綠燈
sbit LED2=P2^5;           //黃燈

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

uchar DisplayData[2];          //創建一個數組,用於存放倒計時的十位和個位
uchar a=99,flag=0,sec=15;  //a:100次等於1秒(配合定時器使用),flag:對應三種燈 sec:倒計時

//延時函數
void delay(uchar i)
{
    while(i--);

}

//數碼管顯示,這里只需要使用兩個數碼管
//通過138譯碼器選擇對應的數碼管
void Digdisplay()
{    
    uchar i;
    for(i=0;i<=1;i++)
    {
        switch(i)
        {
             case(0):
                LSA=0;LSB=0;LSC=0;break;
            case(1):
                LSA=1;LSB=0;LSC=0;break;
        }
        P0=DisplayData[i];        //將當前的時間傳遞給P0,並顯示出來
        delay(100);
        P0=0x00;                 //消隱
    }
}

 //將當前的時間和smgduan[]內已保存的16進制值對應,接着會通過Digdisplay()顯示
void Datapros()          
{

    DisplayData[0]=smgduan[sec%10];
    DisplayData[1]=smgduan[sec/10];            

}

//定時器初始化
void TimerInit()
{
    TMOD=0x01;  //選擇定時器0
    TH0=0Xd8;    //10毫秒
    TL0=0Xf0;
    EA=1;
    ET0=1;
    TR0=1;
}
void red()              //紅燈倒計時
{
    if(flag==0)           //flag初始值為0,從紅燈開始亮(紅-->綠-->黃)
    {
        LED2=1;            //黃燈滅
        LED0=0;            //紅亮
        if(a==0)        //a=0,一秒過去,倒計時sec-1
        {    
            a=99;         //重置a,開始下一秒
            sec--;         //倒計時sec-1
            if(sec==0)     //sec=0,紅燈結束,綠燈開始
            {
                flag=1;      //綠燈的flag
                sec=15;      //給綠燈定時
            }

        }    
    }    
}

void green()        //綠燈
{
    if(flag==1)
    {
        LED0=1;
        LED1=0;

        if(a==0)
        {    
            a=99;
            sec--;
            if(sec==0)
            {
                flag=3;
                sec=3;
            }

        }    
    }
}

void yellow()            //黃燈
{
    if(flag==3)
    {
        LED2=0;
        LED1=1;
        if(a==0)
        {    
            a=99;
            sec--;
            if(sec==0)
            {
                flag=0;
                sec=15;
            }

        }    
    }
}



void Timer() interrupt 1       //中斷
{
    TH0=0Xd8;    //10毫秒
    TL0=0Xf0;
    a--;             //a的初始值為100,TH0和TL0溢出一次,a-1,a=0時,正好一秒
    red();
    green();
    yellow();    
}


void main()
{
    TimerInit();    
    while(1)
    {
        Datapros();
        Digdisplay();
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM