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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

十字路口交通信號燈單片機資料-源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:350455 發表于 2018-6-12 17:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
源程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={         //共陰極數碼管碼表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0xC9,0xFF,0x40     };//設置碼,測試碼,不計時碼

void delay(uint x);//延時函數
void display(uchar,uchar,uchar,uchar);        //數碼管顯示函數
void scankeys();        //鍵盤函數
void traffic();        //交通燈函數

uchar num,num1,num2,  //1南北 2東西
shi1,ge1,shi2,ge2,
value1,value2,//南北 綠燈時間 黃燈時間
value3,value4,//東西 綠燈時間 黃燈時間
count1,count2,flag1,flag2; //南北標記 東西標記        南北設置標記 東西設置標記

void main()
{       
               
                TMOD=0x01;                        //設置定時器0位工作模式1(M1,M0位0,1)
                TH0=(65536-45872)/256;         //裝初值11.0592M晶振定時50ms數為45872
                TL0=(65536-45872)%256;
                EA=1;                //開總中斷
                ET0=1;                //開定時器0中斷
                TR0=1;                //啟動定時器0
                /*初狀態*/
                value1=40;                 //南北 黃綠燈默認值
                value2=5;          
                value3=60;          //東西 黃綠燈默認值
                value4=5;

                num1=value1; //南北數碼管先綠燈時間
                num2=value2+value1;//東西紅燈時間  20s

                P1=0x41;//初始狀態:東西紅燈 南北綠燈          20 15

                while(1){
                        if(num==20)           //定時器1s
                        {
                                num=0;
                                num1--;
                                num2--;
                                traffic();
                                       
                                shi1=num1/10;
                                ge1=num1%10;

                                shi2=num2/10;
                                ge2=num2%10;

                        }
                          scankeys();
                          display(shi1,ge1,shi2,ge2);               
                          
                }

}


/************************紅綠燈主控制程序*******************

說明:        南北方向紅綠燈時間:  紅燈 15s  綠燈 40s  黃燈        5s
                東西方向紅綠燈時間:  紅燈 20s  綠燈 60s  黃燈        5s

************************************************************/

void traffic()
{
        if(num1==0){                                                             //1南北           
                        count1++;                                                     //南北標志位
                        if(count1==1){                           //南北方向紅燈15s倒計時結束,
                                P1=0x42;                      //東西方向仍為紅燈,南北方向變為黃燈       
                                num1=value2;                                  //黃燈時間為5s
                        }
                        if(count1==2){                                          //南北方向黃燈5s倒計時結束,
                                P1=0x14;                                          //東西方向變為綠燈,南北方向變為紅燈
                                num1=value3+value4;                          //南北方法紅燈時間為15s
                        }
                        if(count1==3){                                          //南北方向紅燈15s倒計時結束,
                                P1=0x41;                                          //東西方向變為紅燈,南北方向變為綠燈
                                num1=value1;                                  //南北方向綠燈時間15s
                                count1=0;                                          //重置南北標志位               
                        }
        }
        if(num2==0){                                                        // 2東西
                        count2++;                                                   //東西標志位
                        if(count2==1){                                           //東西方向紅燈20s倒計時結束,
                                P1=0x14;                                          //東西方向變為綠燈,南北方向變為紅燈  
                                num2=value3;                                    //東西方向綠燈時間10s
                        }
                        if(count2==2){                                          //東西方向綠燈10s倒計時結束,
                                P1=0x24;                                          //東西方向變為黃燈,南北方向變為仍為紅燈
                                num2=value4;                                  //東西方向黃燈時間5s
                        }
                        if(count2==3){                                          //東西方向黃燈時間5s倒計時結束,
                                P1=0x41;                                          //東西方向變為紅燈,南北方向變為綠燈
                                num2=value1+value2;                   //東西方向紅燈時間20s
                                count2=0;                                          //重置東西標志位
                        }
                                       
        }
}

/************************************數碼管顯示子函數********************************************/

void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2)       
{               
                uchar temp;
                temp=P2;
                P2=0xfe;
                P0=table[shi1];
                delay(5);
               
                P2=0xfd;
                P0=table[ge1];
                delay(5);
       
                P2=0xfb;
                P0=table[shi2];
                delay(5);
               
                P2=0xf7;
                P0=table[ge2];
                delay(5);               
}
/*************************************延時子函數********************************************/
void delay(uint x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);
}
/*************************4*4矩陣鍵盤功能子函數********************
說明:



*******************************************************************/

void scankeys()  
{
        uchar temp,key;
        P3=0xfe;                        //第一行線
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);                   //按鍵去抖
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                                temp=P3;
                                switch(temp)
                                {
                                        case 0xee:        key=0;         break;
                                        case 0xde:        key=1;         break;
                                        case 0xbe:        key=2;         break;
                                        case 0x7e:        key=3;         break;
                                }
                                while(temp!=0xf0)
                                {
                                        temp=P3;
                                        temp=temp&0xf0;
                                }
                        if(key==0)                                    //按鍵1:
                        {                       
                                TR0=~TR0;                             //定時器取反
                                flag1=~flag1;                   //南北能夠設置標志 0有效
                                flag2=~flag2;          //東西能夠設置標志
                        }
       
                        if(key==1&&flag1==0)           //按鍵2:
                        {       
                                TR0=0;
                                P1=0x44;                           //禁止東南西北車輛 全為紅燈 可以設置
                                shi1=ge1=shi2=ge2=16;  //數碼管顯示設置符號
                        }
       
                        if(key==2&&flag2==0)           //按鍵3:
                        {       
                                TR0=1;
                                num=0;                                    //定時器初始化
                                P1=0x41;                            //重新開始初狀態
                                num1=value1;                    //南北數碼管綠燈時間
                                num2=value2+value1;    //東西數碼管紅燈時間
                                shi1=num1/10;                  
                                ge1=num1%10;
                                shi2=num2/10;
                                ge2=num2%10;
                        }
       
                        if(key==3&&P1==0x44){         //按鍵4:
                                P1=0xff;
                                delay(1000);
                                P1=~P1;
                                shi1=ge1=shi2=ge2=17;
                                P1=0x44;
                        }
       
                }
        }

        P3=0xfd;//第二行線
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0){
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed: key=0; break;
                                case 0xdd: key=1; break;
                                case 0xbd: key=2; break;
                                case 0x7d: key=3; break;
                        }
                while(temp!=0xf0)
                {
                        temp=P3;
                        temp=temp&0xf0;
                }
                 
                if(key==0&&P1==0x44){        //按鍵5:

                        num1=value1;
                        if(num2!=159){ //@@@@保證交通合理,紅燈最大值計時159s,綠燈不再增加
                                num1++;
                                value1=num1;
                        }

                        shi1=num1/10;
                        ge1=num1%10;

                        num2=value1+value2;//顯示東西紅燈時間
                        shi2=num2/10;
                        ge2=num2%10;


                }
                if(key==1&&P1==0x44){        //按鍵6:
                        num1=value2;
                        if(num2!=159)
                        {
                                num1++;
                                value2=num1;
                        }

                        shi1=num1/10;
                        ge1=num1%10;
                        num2=value1+value2;//顯示東西紅燈時間
                        shi2=num2/10;
                        ge2=num2%10;

                }
                if(key==2&&P1==0x44&&value1>3){        //按鍵7:
                        num1=value1;

                        num1--;
                        value1=num1;

                        shi1=num1/10;
                        ge1=num1%10;
                        num2=value1+value2;//顯示東西紅燈時間
                        shi2=num2/10;
                        ge2=num2%10;

                }
                if(key==3&&P1==0x44&&value2>3){        //按鍵8:  
                        num1=value2;

                        num1--;
                        value2=num1;

                        shi1=num1/10;
                        ge1=num1%10;
                        num2=value1+value2;//顯示東西紅燈時間
                        shi2=num2/10;
                        ge2=num2%10;

                }
                }
       
        }
   ////||||||||||||||||||

        P3=0xfb;//第三行線
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0){
                        temp=P3;
                        switch(temp)
                        {
                                case 0xeb:        key=0; break;
                                case 0xdb:        key=1; break;
                                case 0xbb:        key=2; break;
                                case 0x7b:        key=3; break;
                        }
                while(temp!=0xf0)
                {
                        temp=P3;
                        temp=temp&0xf0;
                }
                if(key==0&&P1==0x44){        //按鍵9:
       
                        num2=value3;
                        if(num1!=159){
                                num2++;
                                value3=num2;
                        }

                        shi2=num2/10;
                        ge2=num2%10;

                        num1=value3+value4;//顯示南北紅燈時間
                        shi1=num1/10;
                        ge1=num1%10;



                }
                if(key==1&&P1==0x44){        //按鍵10:
                        num2=value4;

                        if(num1!=159){
                                num2++;
                                value4=num2;
                        }

                        shi2=num2/10;
                        ge2=num2%10;
                        num1=value3+value4;//顯示南北紅燈時間
                        shi1=num1/10;
                        ge1=num1%10;

                }
                if(key==2&&P1==0x44&&value3>3){        //按鍵11:
                        num2=value3;

                        num2--;
                        value3=num2;

                        shi2=num2/10;
                        ge2=num2%10;

                        num1=value3+value4;//顯示南北紅燈時間
                        shi1=num1/10;
                        ge1=num1%10;


                }
                if(key==3&&P1==0x44&&value4>3){        //按鍵12:
                        num2=value4;

                        num2--;
                        value4=num2;

                        shi2=num2/10;
                        ge2=num2%10;
                        num1=value3+value4;//顯示南北紅燈時間
                        shi1=num1/10;
                        ge1=num1%10;


                }
                }
       
        }

        P3=0xf7;//第四行線                  2未用
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0){
                        temp=P3;
                        switch(temp)
                        {
                                case 0xe7:
                                        key=0;
                                        break;
                                case 0xd7:
                                        key=1;
                                        break;
                                case 0xb7:
                                        key=2;
                                        break;
                                case 0x77:
                                        key=3;
                                        break;
                        }
                while(temp!=0xf0)
                {
                        temp=P3;
                        temp=temp&0xf0;
                }
                if(key==0&&P1==0x44){        //按鍵13:
                        P1=0x41;
                        shi1=ge1=shi2=ge2=18;       

                }
                if(key==1&&P1==0x44){        //按鍵14:
                        P1=0x14;
                        shi1=ge1=shi2=ge2=18;       
                }
                if(key==2&&P1==0x44){//按鍵15:
                       
                }
                if(key==3&&P1==0x44){//按鍵16:
                       
                }
                }
       
        }



}
/************************定時器T0 中斷子程序*********************************/

void T0_time() interrupt 1        
{
        TH0=(65536-45872)/256;           //定時50ms
        TL0=(65536-45872)%256;
        num++;
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www网站在线观看 | 一级毛片,一级毛片 | 亚洲欧美在线一区 | 亚洲成人免费视频在线 | 欧美乱做爰xxxⅹ久久久 | 超碰伊人 | 四虎影音 | 日日操夜夜操天天操 | 日韩中文字幕久久 | 午夜影院在线视频 | 国产午夜精品理论片a大结局 | 色综合一区二区三区 | 韩国av一区二区 | 成人免费视屏 | 日韩视频―中文字幕 | 欧美视频在线免费 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 男女免费观看在线爽爽爽视频 | 黑人巨大精品欧美一区二区免费 | 亚洲精品99999 | 久久日韩精品一区二区三区 | 91精品欧美久久久久久久 | 久草视 | www.蜜桃av | 狠狠的干 | 国产精品国产精品国产专区不卡 | 中文字幕在线免费观看 | 99热国产在线播放 | 久久久九九 | 麻豆久久精品 | 色精品视频 | 久久国产婷婷国产香蕉 | 蜜桃在线一区二区三区 | www.yw193.com | 久久久久久久久久久久亚洲 | h片在线播放| 男人天堂网站 | 精品一区二区av | 看一级黄色毛片 | 特黄av| 国产精品一区二区久久精品爱微奶 |