找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2133|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)紅綠顯示屏切換交通燈仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本交通燈程序貼合實(shí)際,除了可以顯示時(shí)間外,還可以切換紅綠顯示。原理圖利用595控制數(shù)碼管位,減少IO口的占用。如果想減少595,也可以將雙向同色顯示屏的位接在一起。注意:仿真必須用proteus8.12版本才能打開。!
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit duanla=P2^6;
sbit weila =P2^7;

/******控制紅綠燈切換******/
sbit SH_CP=P2^0;
sbit DS=P2^1;
sbit ST_CP=P2^2;

/******控制紅綠顯示屏切換******/
sbit SH_CP1=P2^3;
sbit DS1=P2^4;
sbit ST_CP1=P2^5;
sbit OE=P3^0;

sbit key1=P2^6;//緊急按鈕
sbit key2=P2^7;//回復(fù)運(yùn)行按鈕

uchar count,time;//中斷次數(shù),時(shí)間分段
uchar a,b;//顯示時(shí)間變量

/******兩個(gè)方向的時(shí)間設(shè)置,以1分鐘為總時(shí)間******/
uchar Atime_red=30,Atime_green=25,Atime_yellow=5;
uchar Btime_red=30,Btime_green=25,Btime_yellow=5;


//uchar code duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共陰數(shù)碼管段碼{0123456789}


void delay(uint z)//延時(shí)函數(shù)
{
        while(z--);
}


/**************** 向HC595發(fā)送一個(gè)字節(jié)函數(shù),控制紅綠黃燈 ******************/
void send_595(uint dat)
{               
        uchar i;
        for(i=0;i<16;i++)
        {
                dat <<= 1;
                DS  = CY; //溢出位賦值數(shù)據(jù)輸出端
                SH_CP = 1; //移位時(shí)鐘
                SH_CP = 0;
        }
}

/**************** 向HC595發(fā)送一個(gè)字節(jié)函數(shù),控制紅綠顯示屏 ******************/
void send_595W(uint dat)
{               
        uchar i;
        for(i=0;i<16;i++)
        {
                dat <<= 1;
                DS1  = CY; //溢出位賦值數(shù)據(jù)輸出端
                SH_CP1 = 1; //移位時(shí)鐘
                SH_CP1 = 0;
        }
}


void init()
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TMOD=0X01;
        EA=1;
        ET0=1;
        TR0=1;
        SH_CP=0;
        ST_CP=0;
        SH_CP1=0;
        ST_CP1=0;
        OE=0;
        
}


void display_SN_R_EW_G()//南北紅燈-東西綠燈
{
        send_595W(0xffbe);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[a/10];
        delay(500);
        send_595W(0xff7d);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[a%10];
        delay(500);
        
        send_595W(0xebff);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[b/10];
        delay(500);
        send_595W(0xd7ff);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[b%10];
        delay(500);
}

void display_SN_R_EW_Y()//南北紅—東西黃燈
{
        send_595W(0xffbe);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[a/10];
        delay(500);
        send_595W(0xff7d);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[a%10];
        delay(500);
        
        send_595W(0xffeb);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[b/10];
        delay(500);
        send_595W(0xffd7);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[b%10];
        delay(500);
}

void display_SN_G_EW_R()//南北綠燈——東西紅
{
        send_595W(0xbeff);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[a/10];
        delay(500);
        send_595W(0x7dff);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[a%10];
        delay(500);
        
        send_595W(0xffeb);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[b/10];
        delay(500);
        send_595W(0xffd7);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[b%10];
        delay(500);
}

void display_SN_Y_EW_R()//南北黃燈——東西紅
{
        send_595W(0xffbe);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[a/10];
        delay(500);
        send_595W(0xff7d);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[a%10];
        delay(500);
        
        send_595W(0xffeb);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[b/10];
        delay(500);
        send_595W(0xffd7);
        ST_CP1=1;
        ST_CP1=0;
        P0=duanma[b%10];
        delay(500);
}



void main()
{
        init();
        while(1)
        {
                if(time>=0&&time<25)display_SN_R_EW_G();
                else if(time>=25&&time<30)display_SN_R_EW_Y();
                else if(time>=30&&time<55)display_SN_G_EW_R();
                else if(time>=55&&time<60)display_SN_Y_EW_R();
                else
                {
                }
                if(key1==0)
                {
                        delay(20);
                        if(key1==0)
                        {
                                OE=1;//關(guān)閉顯示屏
                                send_595(0xfff0);//雙方向紅燈
                                ST_CP=1;
                                ST_CP=0;
                                TR0=0;//關(guān)閉定時(shí)器
                        }
                        while(!key1);//按鍵釋放
                }
                if(key2==0)
                {
                        delay(20);
                        if(key2==0)
                        {
                                TR0=1;//開啟定時(shí)器,重新開始
                                return;
                        }
                        while(!key2);
                }
        }
}


void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;        
        count++;
        if(count==20)
        {
                time++;
                if(time>=0&&time<25)
                {                                       
                        send_595(0xff5a);
                        ST_CP=1;
                        ST_CP=0;
                                                               
                        a=Atime_red--;
                        b=Btime_green--;

                }                        
                else if(time>=25&&time<30)
                {
                        send_595(0xf5fa);
                        ST_CP=1;
                        ST_CP=0;
                        Btime_green=25;
                        a=Atime_red--;
                        b=Btime_yellow--;

                }
                else if(time>=30&&time<55)
                {
                        send_595(0xffa5);
                        ST_CP=1;
                        ST_CP=0;        
                        Atime_red=30;
                        Btime_yellow=5;
                        a=Atime_green--;
                        b=Btime_red--;

                }
                else if(time>=55&&time<60)
                {               
                        send_595(0xfaf5);
                        ST_CP=1;
                        ST_CP=0;
                        Atime_green=25;
                        a=Atime_yellow--;
                        b=Btime_red--;

                }
                else
                {
                        time=0;
                        Atime_yellow=5;
                        Btime_red=30;
                }
                count=0;
        }
        
}


Keil代碼與Proteus仿真下載:
注意:仿真必須用proteus8.12版本才能打開,如果沒有8.12的話就不要下載了
交通燈51單片機(jī).7z (247.58 KB, 下載次數(shù): 36)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表