新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機交通燈程序以及仿真

        51單片機交通燈程序以及仿真

        作者: 時間:2016-11-25 來源:網絡 收藏
        #include

        #define uint unsigned int
        #define uchar unsigned char
        sbit red_nb = P0^0;
        sbit green_nb = P0^1;
        sbit yellow_nb = P0^2;

        本文引用地址:http://www.104case.com/article/201611/321470.htm

        sbit red_dx = P0^3;
        sbit green_dx = P0^4;
        sbit yellow_dx = P0^5;

        unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段碼控制

        unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位選控制

        unsigned char LedOut[4];

        uchar switch_type = 1;
        uchar Traffic_time = 0;
        uchar ds_time = 0;
        uchar i,t;

        void delay(uint i)
        {
        char j;
        for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
        }

        void Traffic_Light() // 定義 四種狀態 顯示
        {
        switch(switch_type)
        {
        case 1:
        for( i=0; i<4; i++)
        {
        P1 = dispbit[i]; //使用查表法進行位選
        P3 = LedOut[i];

        delay(100);
        } //使數碼管在此 不斷的進行掃描顯示

        red_nb = 0;//南北紅燈亮 綠燈滅黃燈滅
        green_nb = 1;
        yellow_nb = 1;

        red_dx = 1;//東西紅燈滅綠燈亮 黃燈滅
        green_dx = 0;
        yellow_dx = 1;
        if(Traffic_time != 30)
        {
        LedOut[0]=Disp_Tab[(35 - Traffic_time)0/10]; //數碼管顯示的數據
        LedOut[1]=Disp_Tab[(35 - Traffic_time)];
        LedOut[2]=Disp_Tab[(29 - Traffic_time)0/10];
        LedOut[3]=Disp_Tab[(29 - Traffic_time)];
        return; //返回case1
        }
        Traffic_time = 0;
        switch_type = 2; //進入第二種狀態
        break;

        case 2:
        for( i=0; i<4; i++)
        {
        P1 = dispbit[i]; //使用查表法進行位選
        P3 = LedOut[i];

        delay(100);
        }
        red_nb = 0;//南北紅燈亮 綠燈滅黃燈滅
        green_nb = 1;
        yellow_nb = 1;

        red_dx = 1;//東西紅燈滅綠燈滅 黃燈亮
        green_dx = 1;

        if(Traffic_time != 6) //黃等保持的時間
        {
        if(Traffic_time != t)
        {
        t = Traffic_time;
        yellow_dx = ~yellow_dx;

        }
        {
        LedOut[0]=Disp_Tab[(5 - Traffic_time)0/10];
        LedOut[1]=Disp_Tab[(5 - Traffic_time)];
        LedOut[2]=Disp_Tab[(5 - Traffic_time)0/10];
        LedOut[3]=Disp_Tab[(5 - Traffic_time)];
        return;
        }
        return;
        }

        Traffic_time = 0;
        switch_type = 3;
        break;

        case 3:
        for( i=0; i<4; i++)
        {
        P1 = dispbit[i]; //使用查表法進行位選
        P3 = LedOut[i];

        delay(100);
        }
        red_nb = 1;//南北紅燈滅 綠燈亮黃燈滅
        green_nb = 0;
        yellow_nb = 1;

        red_dx = 0;//東西紅燈亮綠燈滅 黃燈滅
        green_dx = 1;
        yellow_dx = 1;
        if(Traffic_time != 19)
        {LedOut[0]=Disp_Tab[(24 - Traffic_time)0/10];
        LedOut[1]=Disp_Tab[(24 - Traffic_time)];
        LedOut[2]=Disp_Tab[(18 - Traffic_time)0/10];
        LedOut[3]=Disp_Tab[(18 - Traffic_time)];
        return;
        }
        Traffic_time = 0;
        switch_type = 4;
        break;

        case 4:
        for( i=0; i<4; i++)
        {
        P1 = dispbit[i]; //使用查表法進行位選
        P3 = LedOut[i];

        delay(100);
        }
        red_nb = 1;//南北紅燈滅 綠燈滅黃燈亮
        green_nb = 1;

        red_dx = 0;//東西紅燈亮綠燈滅 黃燈滅
        green_dx = 1;
        yellow_dx =1;

        if(Traffic_time != 6) //黃等保持的時間
        {
        if(Traffic_time != t)
        {
        t = Traffic_time;
        yellow_nb = ~yellow_nb;

        }
        LedOut[0]=Disp_Tab[(5 - Traffic_time)0/10];
        LedOut[1]=Disp_Tab[(5 - Traffic_time)];
        LedOut[2]=Disp_Tab[(5 - Traffic_time)0/10];
        LedOut[3]=Disp_Tab[(5 - Traffic_time)];
        return;
        }
        Traffic_time = 0;
        switch_type = 1;
        break;

        }
        }

        void main()
        {
        TMOD = 0x01;
        TH0 = (65536 - 50000)/256;
        TL0 = (65536 - 50000)%6;
        EA = 1; //開總中斷
        ET0 = 1; //開定時器0中斷
        TR0 = 1; //啟動定時器

        while(1)
        {
        Traffic_Light();


        }

        }

        void T0_time() interrupt 1
        {
        TH0 = (65536 - 50000)/256;
        TL0 = (65536 - 50000)%6;
        ds_time++;
        if(ds_time == 20)
        {
        ds_time = 0;
        Traffic_time++;

        }


        }





        評論


        技術專區

        關閉
        主站蜘蛛池模板: 蓝田县| 通城县| 察雅县| 甘洛县| 荣成市| 长海县| 诸城市| 吴旗县| 准格尔旗| 正阳县| 河池市| 花垣县| 宣威市| 琼结县| 临夏县| 天峨县| 安乡县| 涡阳县| 隆化县| 伊吾县| 新兴县| 昌图县| 米脂县| 平舆县| 冀州市| 宣恩县| 内丘县| 桑植县| 安国市| 泰宁县| 千阳县| 阿坝| 德清县| 洪雅县| 昭苏县| 平和县| 灵璧县| 万安县| 新邵县| 玉林市| 岳阳县|