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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 866|回復: 0
收起左側

51單片機的簡易紅綠燈設計

[復制鏈接]
ID:1086293 發表于 2023-7-3 15:22 | 顯示全部樓層 |閱讀模式
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int

uchar data DirectVal[4];                                        //秒顯示的變量
uchar data DefaultVal_DX=60;                          //東西數默認
uchar data DefaultVal_NB=90;                        //南北默認值
uchar data setTime_DX=60;                //設置東西方向的時間
uchar data setTime_NB=90;                //設置南北方向的時間
int n;
uchar data Count,Count1;
sbit  k4=P3^1;                //禁止
sbit  k1=P3^5;                //時間加
sbit  k2=P3^6;                //時間減
sbit  k3=P3^7;     //切換方向
sbit  SPEAKER = P3^2;

sbit RED_NB=P2^6;                //南北紅燈標志
sbit YELLOW_NB=P2^5;        //南北黃燈標志
sbit GREEN_NB=P2^4;     //南北綠燈標志

sbit RED_DX=P2^3;                //東西紅燈標志
sbit YELLOW_DX=P2^2;        //東西黃燈標志
sbit GREEN_DX=P2^1;                //東西綠燈標志
               
bit set=0;                                //調時方向切換鍵標志 =1時,南北,=0時,東西
bit dx_nb=0;                        //東西南北控制位
bit Shanshuo=0;                        //閃爍標志位

uchar code TABLE[11]={        //共陰極字型碼
        0x3f,  //--0
        0x06,  //--1
        0x5b,  //--2
        0x4f,  //--3
        0x66,  //--4
        0x6d,  //--5
        0x7d,  //--6
        0x07,  //--7
        0x7f,  //--8
        0x6f,  //--9
        0x00   //--NULL
};

void key();                                        //按鍵掃描子程序
void SegmentDisplay();                                //顯示子程序
void Buzzer();


void delaylms(int ms)                //延時子程序
{
        uint j,k;
        for(j=0;j<ms;j++)                        //延時ms
           for(k=0;k<124;k++);                //大約1毫秒的延時
}

/*定時器0初始化*/
void Timer0Init(){
        TMOD |= 0X01;
        TH0 = 0X4B;
        TL0 = 0XFC;
        ET0 = 1;
        EA = 1;
        TR0 = 1;
}
/*定時器1初始化*/
void Timer1Init(){
        TMOD |= 0X10;
        TH1 = 0X4B;
        TL1 = 0XFC;
        ET1 = 1;
        EA = 1;
        TR1 = 1;
}

/*主程序*/
void main()
{
        Timer0Init();
        Timer1Init();
        TR1 = 0;
        P2=0Xc3;                                        // 默認東西綠燈,南北紅燈燈   
  DefaultVal_NB=DefaultVal_DX+5; //設置南北通行時間比東西多5秒
        while(1)               
        {         
                key();
                SegmentDisplay();
        }       
}
/*按鍵掃描子程序*/
void key(void){
        if(k1!=1)        {
                delaylms(10);
                if(k1!=1){
                  TR0=0;
                        Shanshuo=0;
                        P2=0x00;
                        TR1=0;
                        if(set==0)//設置鍵按下
                                setTime_DX++;//南北加1
                        else
                                setTime_NB++;//東西加1
                        if(setTime_NB==100)
                                setTime_NB=1;
                        if(        setTime_DX==100)
                                setTime_DX=1;//加到100置1
                        DefaultVal_NB=setTime_NB ;//設置的數值賦給東西南北
                        DefaultVal_DX=setTime_DX;                       
                  do        {
                                SegmentDisplay();
                        }while(k1!=1);//松手檢測
                }
        }

        if(k2!=1)        {                                                        //當K2(時間減)按鍵按下時
                delaylms(10);
                if(k2!=1){
                         TR0=0;
                        Shanshuo=0;
                        P2=0x00;
                        TR1=0;
                        if(set==0)
                                setTime_DX--;
                        else
                                setTime_NB--;
                        if(setTime_NB==0)
                                setTime_NB=99;       
                        if(        setTime_DX==0 )
                                setTime_DX=99;
                        DefaultVal_NB=setTime_NB ;
                        DefaultVal_DX=setTime_DX;
                  do{         
                                SegmentDisplay();
                        }
                        while(k2!=1);
                }
        }
        if(k3!=1) {
                delaylms(10);
                if(k3!=1){
                  
                         TR0=0;
                        set=!set;
                        TR1=0;
                        dx_nb=set;
                        do{
                                SegmentDisplay();
                        }                               
                        while(k3!=1);
                }
        }       

        if(k4!=1){
                delaylms(10);
                if(k4!=1){
                        TR0=0;
                        P2=0x00;
                        RED_DX=1;
                        RED_NB=1;
                        TR1=0;
                        DefaultVal_DX=30;
                        DefaultVal_NB=30;
                        TR0 = 1;
                        do{
                                SegmentDisplay();
                                SPEAKER = !SPEAKER;
                                if((DefaultVal_DX == 0)&&(DefaultVal_NB==0)){
                                        SPEAKER = 1;
                                }
                        }       
                        while(k4!=1);
                }
        }
}
/*數碼管顯示程序*/
void SegmentDisplay(void)
{               
        DirectVal[1]=DefaultVal_NB/10;                 // 東西秒十位
        DirectVal[2]=DefaultVal_NB%10;                 // 東西秒個位
        DirectVal[3]=DefaultVal_DX/10;                 // 南北秒十位
        DirectVal[0]=DefaultVal_DX%10;                 // 南北秒個位               
        P1=0xff;
        P0=0x00;
        P1=0xfe;
        P0=TABLE[DirectVal[1]];       
        delaylms(1);
        P1=0xff;
        P0=0x00;
                                                  
        P1=0xfd;
        P0=TABLE[DirectVal[2]];
        delaylms(1);
        P1=0xff;
        P0=0x00;
        P1=0Xfb;
        P0=TABLE[DirectVal[3]];
        delaylms(1);
        P1=0xff;
        P0=0x00;
        P1=0Xf7;
        P0=TABLE[DirectVal[0]];
        delaylms(1);
}

void time0(void) interrupt 1 using 1
{
        TH0=0X4b;
        TL0=0Xfc;
        TR0=1;
        Count++;
        if(Count==10){
                if((DefaultVal_NB<=5)&&(dx_nb==0)&&(Shanshuo==1)){//東西黃燈閃               
                        GREEN_DX=0;
                        YELLOW_DX=0;
                }                                                  
          if((DefaultVal_DX<=5)&&(dx_nb==1)&&(Shanshuo==1)){//南北黃燈閃               
                        GREEN_NB=0;
                        YELLOW_NB=0;
                }       
        }       
        if(Count==20){
                Count=0;
                DefaultVal_DX--;                                                //東西時間減1
                DefaultVal_NB--;                                                //南北時間減1
                if((DefaultVal_NB<=5)&&(dx_nb==0)&&(Shanshuo==1)){//東西黃燈閃               
                        GREEN_DX=0;
                        YELLOW_DX=1;
                }                                                  
          if((DefaultVal_DX<=5)&&(dx_nb==1)&&(Shanshuo==1)){//南北黃燈閃               
                        GREEN_NB=0;
                        YELLOW_NB=1;
                }                                                                
                if(DefaultVal_DX==0&&DefaultVal_NB==5){//當東西倒計時到0時,重置5秒,用于黃燈閃爍時間   
                        DefaultVal_DX=5;
                        Shanshuo=1;
                }
                if(DefaultVal_NB==0&&DefaultVal_DX==5){//當南北倒計時到0時,重置5秒,用于黃燈閃爍時間   
                        DefaultVal_NB=5;
                        Shanshuo=1;
                }
                if(dx_nb==0&&DefaultVal_NB==0){//當黃燈閃爍時間倒計時到0時,
                        P2=0x00;//重置東西南背方向的紅綠燈
                        GREEN_NB=1;
                        RED_DX=1;
                        dx_nb=!dx_nb;
                        Shanshuo=0;
                        DefaultVal_NB=setTime_NB;        //重賦南北方向的起始值
                        DefaultVal_DX=setTime_NB+5;//重賦東西方向的起始值
                }               
                if(dx_nb==1&&DefaultVal_DX==0){        //當黃燈閃爍時間到
                        P2=0X00;                                        //重置東西南北的紅綠燈狀態
                        GREEN_DX=1;                                //東西綠燈亮
                        RED_NB=1;                                        //南北紅燈亮
                        dx_nb=!dx_nb;
                        Shanshuo=0;
                        DefaultVal_DX=setTime_DX;                        //重賦東西方向的起始值
                        DefaultVal_NB=setTime_DX+5;                //重賦南北方向的起始值
                }
        }       
}
void time1(void) interrupt 3{
        TH1=0X4b;
        TL1=0Xfc;
        Count1++;
        if(Count1==10)
        {
                YELLOW_NB=0;//南北黃燈滅
                YELLOW_DX=0;//東西黃燈滅
        }
        if(Count1==20){
                Count1=0;
                YELLOW_NB=1;//南北黃燈亮
                YELLOW_DX=1;//東西黃燈亮
        }       
}

屏幕截圖 2023-07-03 152045.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产精品午夜一区 | 二区欧美 | 久久亚洲一区 | 久久久精品一区二区 | 亚洲午夜精品一区二区三区他趣 | 9999精品视频| 色婷婷一区二区三区四区 | 天天爱爱网 | 狠狠入ady亚洲精品经典电影 | 国产精品69av | 欧美一级三级 | 国产中文字幕网 | 欧美日韩国产精品一区 | 国产高清精品在线 | 免费在线视频精品 | 欧美乱大交xxxxx另类电影 | 亚洲国产高清免费 | 亚洲午夜在线 | 99久久久久久久 | 亚洲午夜av | 黄色一级视频 | 日韩乱码一二三 | 日韩在线一区二区三区 | 麻豆久久精品 | 亚洲欧美日韩成人在线 | 免费观看视频www | 国产高清视频一区 | 男人天堂网站 | 亚洲精品电影在线观看 | 黄色亚洲 | 成人一区二区三区 | av网站在线播放 | 本道综合精品 | 一区二区三区在线 | 国产精品日日做人人爱 | 一区二区在线看 | 久久精品在线 | 天堂视频中文在线 | 91精品国产一二三 | 国产色婷婷精品综合在线手机播放 | 日本一区视频在线观看 |