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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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


單片機源程序如下:
#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;//回復運行按鈕

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

/******兩個方向的時間設置,以1分鐘為總時間******/
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};//共陰數碼管段碼{0123456789}


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


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

/**************** 向HC595發送一個字節函數,控制紅綠顯示屏 ******************/
void send_595W(uint dat)
{               
        uchar i;
        for(i=0;i<16;i++)
        {
                dat <<= 1;
                DS1  = CY; //溢出位賦值數據輸出端
                SH_CP1 = 1; //移位時鐘
                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;//關閉顯示屏
                                send_595(0xfff0);//雙方向紅燈
                                ST_CP=1;
                                ST_CP=0;
                                TR0=0;//關閉定時器
                        }
                        while(!key1);//按鍵釋放
                }
                if(key2==0)
                {
                        delay(20);
                        if(key2==0)
                        {
                                TR0=1;//開啟定時器,重新開始
                                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單片機.7z (247.58 KB, 下載次數: 36)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频中文字幕 | 91aiai | 久久久久久成人 | www.国产| 亚洲欧洲视频 | 亚洲精品视频观看 | 国产精品呻吟久久av凹凸 | 福利片在线 | 亚洲在线一区二区 | 特一级毛片 | 日日摸天天添天天添破 | 国产精品综合 | 欧美亚洲另类在线 | 久久99视频这里只有精品 | 欧美一区二区免费 | 天天综合久久 | 久久久精品视频免费看 | 国产农村妇女毛片精品久久麻豆 | 久久99精品国产麻豆婷婷 | 亚洲视频 欧美视频 | 国产亚洲精品久久久优势 | 国产激情片在线观看 | 国产精品99视频 | 日韩高清av | 午夜小电影 | 久久国产精品久久国产精品 | 麻豆国产一区二区三区四区 | www.久久影视 | 九色 在线 | 国产精品久久久久久久岛一牛影视 | 欧美啊v在线观看 | 色婷婷av99xx | 超碰91在线 | 国产男女猛烈无遮掩视频免费网站 | 99这里只有精品视频 | 一本岛道一二三不卡区 | 久久久久久久一区二区 | 亚洲国产精品福利 | 99精品欧美一区二区三区综合在线 | 一区二区福利视频 | 久久久久久成人 |