新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機交通燈設計源程序

        單片機交通燈設計源程序

        作者: 時間:2014-01-13 來源:網絡 收藏
        #include reg51.h>
        #include intrins.h>
        #define uchar unsigned char
        #define uint unsigned int
        sbit k1=P1^6;
        sbit k2=P1^7;
        sbit k3=P2^7;
        sbit k4=P3^0;
        sbit yellowled_nb=P1^4; //南北黃燈
        sbit yellowled_dx=P1^1; //東西黃燈
        uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共陰
        uchar data dig; //位選
        uchar data led; //
        uchar data buf[4];
        uchar data sec_dx=20;//東西數碼指示值
        uchar data sec_nb=20;//南北數碼指示值
        uchar data set_timedx=20;
        uchar data set_timenb=20;//倒計時設置的鍵值保存
        uchar data b;//定時器中斷次數
        bit time;//燈狀態循環標志
        bit int0_time;//中斷強行標志
        bit set;//調時方向切換鍵標志
        void delay(int ms);//延時子程序
        void key();//按鍵掃描子程序
        void key_to1();//鍵處理子程序
        void key_to2();
        void display();//顯示子程序
        void main()
        {
        TMOD=0X01;
        TH0=0X3C;
        TL0=0XB0;
        EA=1;
        ET0=1;
        TR0=1;
        EX0=1;
        EX1=1;
        P1=0Xf3;// 東西通行
        while(1)
        {
        key(); //調用按鍵掃描程序
        display(); //調用顯示程序
        }
        }
        void key() //按鍵掃描子程序
        {
        if(k1!=1)
        {
        delay(10);
        if(k1!=1)
        {
        while(k1!=1);
        key_to1();
        }
        }
        if(k2!=1)
        {
        delay(10);
        if(k2!=1)
        {
        while(k2!=1);
        key_to2();
        }
        }
        if(k4!=1)
        {
        delay(10);
        if(k4!=1)
        {
        while(k4!=1);
        set=!set;
        }
        }
        if(k3!=1int0_time==1)
        {
        TR0=1; //啟動定時器
        sec_nb=20;
        sec_dx=20;
        int0_time=0;//清標志
        } else if(k3!=1int0_time==0)
        {
        TR0=1;
        set_timenb=sec_nb;
        set_timedx=sec_dx; //設置的鍵值返回保存
        }
        }
        void display()
        {
        buf[1]=sec_dx/10; //第1位 東西秒十位
        buf[2]=sec_dx%10; //第2位 東西秒個位
        buf[3]=sec_nb/10; //第3位 南北秒十位
        buf[0]=sec_nb%10; //第4位 南北秒個位
        P0=table[buf[led]];
        delay(2); //先延時,提前顯示一位了
        P2=dig;
        dig=_crol_(dig,1);
        led++;
        if (led==4)
        {led=0;
        dig=0xfe;
        }
        }
        void time0(void) interrupt 1 using 1 //定時中斷子程序
        {
        b++;
        if(b==10) // 定時器中斷次數。
        {
        b=0;
        sec_dx--;
        sec_nb--;
        /******************南北黃燈閃爍判斷*************************/
        if(sec_nb==3time==0)
        {
        yellowled_nb=1;//南北黃燈亮
        delay(300);
        yellowled_nb=0;
        }
        if(sec_nb==2time==0)
        {
        yellowled_nb=1;//南北黃燈亮
        delay(300);
        yellowled_nb=0;
        }
        if(sec_nb==1time==0)
        {
        yellowled_nb=1;
        delay(300);
        yellowled_nb=0;
        }
        /*******************東西黃燈閃判斷************************/
        if(sec_dx==3time==1)
        {
        yellowled_dx=1;//南北黃燈亮
        delay(300);
        yellowled_dx=0;
        }
        if(sec_dx==2time==1)
        {
        yellowled_dx=1;//南北黃燈亮
        delay(300);
        yellowled_dx=0;
        }
        if(sec_dx==1time==1)
        {
        yellowled_dx=1;
        delay(300);
        yellowled_dx=0;
        }
        /*******************************************/
        if(sec_dx==0||sec_nb==0) //東西或南北先到達1S時即開始重新計時
        {
        sec_dx=set_timedx;
        sec_nb=set_timenb; //第一次循環結束重置
        if(time==1)
        {
        P1=0XF3; //東西通行
        }
        else
        {
        P1=0xde; //南北通行
        }
        time=!time; //取反
        }
        }
        }
        void key_to1()
        {
        TR0=0; //關定時器
        if(set==0)
        sec_nb++; //南北加1S
        else
        sec_dx++;//東西加1S
        if(sec_nb==100)
        sec_nb=1;
        if( sec_dx==100)
        sec_dx=1;//加到100置1
        }
        void key_to2()
        {
        TR0=0;//關定時器
        if(set==0)
        sec_nb--; //南北減1S
        else
        sec_dx--; //東西減1S
        if(sec_nb==0)
        sec_nb=99;
        if( sec_dx==0 )
        sec_dx=99;//減到1重置99


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 屯留县| 旬阳县| 竹溪县| 自贡市| 平和县| 德安县| 拉孜县| 五大连池市| 新绛县| 拉萨市| 惠来县| 百色市| 那坡县| 吴旗县| 东丽区| 呼伦贝尔市| 象山县| 保定市| 太谷县| 观塘区| 旬邑县| 广东省| 开原市| 兴城市| 会东县| 珠海市| 蛟河市| 永平县| 饶河县| 云南省| 武平县| 井陉县| 安义县| 志丹县| 朝阳区| 义马市| 渝北区| 楚雄市| 久治县| 丰台区| 密山市|