找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1633|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机的交通灯控制代码和Proteus仿真原理图

[复制链接]
跳转到指定楼层
楼主
要求
基于AT89S52单片机设计交通灯控制系统,实现以下功能:
正常模式:南北方向通行:左转灯亮25S后黄灯亮5S,直转灯亮45S后黄灯亮5S,
东西方向红灯亮50S
正常模式:东西放向通行:左转灯亮25S后黄灯亮5S,直转灯亮45S后黄灯亮5S,南北方向红灯亮50S
紧急模式:按下S1,所有红灯闪烁;
夜间模式:按下S2,所有黄灯闪烁
恢复到正常模式:按下S3
参数:
1.模拟十字路口交通灯情况,设计左转绿灯、前进绿灯、黄红绿灯控制,具有倒计时显示。
2.数码管作为作为显示器;
3.具有紧急控制功能,紧急控制按键后,四个方向的红灯闪烁全部禁止通行,以便交警人工指挥。
4.具有夜间控制功能,夜间控制按键后,四个方向的黄灯闪烁,晚上车少人少,不需要用到交通灯

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机代码如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

#define SHU1 c=1;b=1;a=1
#define SHU2 c=1;b=1;a=0
#define SHU3 c=1;b=0;a=1
#define SHU4 c=1;b=0;a=0
#define SHU5 c=0;b=1;a=1
#define SHU6 c=0;b=1;a=0
#define SHU7 c=0;b=0;a=1
#define SHU8 c=0;b=0;a=0

void EW_ZUOTONG();
void EW_ZHITONG();
void EW_TING();
void SN_ZUOTONG();
void SN_ZHITONG();
void SN_TING();



sbit a=P2^0;
sbit b=P2^1;
sbit c=P2^2;


sbit EW_ZUO=P1^0; //东西左转灯
sbit EW_ZHI=P1^1;  //东西直行灯
sbit EW_HONG=P1^2;  //东西红灯
sbit EW_HUANG=P1^3;  //东西黄灯

sbit SN_ZUO=P1^4;  //南北左转灯
sbit SN_ZHI=P1^5;  //南北直行灯
sbit SN_HONG=P1^6;  //南北红灯
sbit SN_HUANG=P1^7; //南北黄灯

uint x=0,y=0,z=0,Time_EW=30,Time_SN=30; //定义初始值



uchar code seg[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uchar code led[2]={0xbb, 0x77};

void delay(uint ms)
{
       uint i;
       while(ms--)
       for(i=0;i<123;i++);
}


void display()
{
if((z==0)||(z==1)||(z==2)||(z==3))
{
    SHU8;
    P0 = seg[Time_EW/10];  //东西倒计时
    delay(1);

    SHU7;
    P0 = seg[Time_EW%10];  //东西倒计时
    delay(1);

    SHU6;
    P0 = 0x40;
    delay(1);

    SHU5;
    P0 = 0x40;
    delay(1);

    SHU4;
    P0 = 0x40;
    delay(1);

    SHU3;
    P0 = 0x40;
    delay(1);

    SHU2;
    P0 = seg[Time_SN/10]; //南北倒计时
    delay(1);

    SHU1;
    P0 = seg[Time_SN%10]; //南北倒计时
    delay(1);
}
}

void init()
{

    TMOD = 0x01;
    TH0 = (65536-50000)/256;   
    TL0 = (65536-50000)%256;
    EA=1;   
    ET0=1;      
    TR0=1;
}

void time0() interrupt 1
{

    TH0 = (65536-50000)/256;
    TL0 = (65536-50000)%256;
    x++;
    if(x==20) //50ms*20=1s

          {
    x=0;        
    Time_EW--;
    Time_SN--;
          }

          if((Time_EW==-1)&&(Time_SN==-1))
    {
    z++;
    if(z==1)
    {
    Time_EW=50;
    Time_SN=50;
    }
    if(z==2)
    {
    Time_EW=30;
    Time_SN=30;
    }
    if(z==3)
    {
    Time_EW=50;
    Time_SN=50;
    }
    if(z==4)
    {
    z=0;
    Time_EW=30;
    Time_SN=30;
    }
    }

}


uchar key_scan(void)
{
static bit kp=0;
if(P3!=0xff)
{
if((P3!=0xff)&&(kp==0))
{
kp=1;
if(P3==0xfe)return 1;
if(P3==0xfd)return 2;
if(P3==0xfb)return 3;
if(P3==0xf7)return 4;
}
}
else kp=0;
return 0;
}


void main()
{
        uchar key_val;
        init();   
        while(1)
{
        display();
        EW_ZUOTONG();
        EW_ZHITONG();
        EW_TING();
        SN_ZUOTONG();
        SN_ZHITONG();
        SN_TING();
        key_val=key_scan();


        if(key_val==1)
        {
        z=-1;
        EA=0;
        ET0=0;      
        TR0=0;
        P0=0X00;
        }
        if(z==-1)
        {
        P1=0xbb;
        delay(80);
        P1=0xff;
        delay(80);
        }


        if(key_val==2)
        {
        z=-2;
        EA=0;
        ET0=0;      
        TR0=0;
        P0=0X00;
        }
        if(z==-2)
        {
        P1=0x77;
        delay(80);
        P1=0xff;
        delay(80);
        }


        if(key_val==3)
        {
        z=-3;
        EA=1;
        ET0=1;      
        TR0=1;
        }
        if(z==-3)
        {
        z=0;
        Time_EW=30;
        Time_SN=30;
        }



}
}


void EW_ZUOTONG()
{
if(z==0)
{
if((6<=Time_EW)&&(Time_EW<=30))
{
EW_ZUO=0;
EW_ZHI=1;
EW_HONG=1;
EW_HUANG=1;
}
if((0<=Time_EW)&&(Time_EW<=5))
{
EW_ZUO=1;
EW_ZHI=1;
EW_HONG=1;
EW_HUANG=0;
}
}
}

void EW_ZHITONG()
{
if(z==1)
{
if((6<=Time_EW)&&(Time_EW<=50))
{
EW_ZUO=1;
EW_ZHI=0;
EW_HONG=1;
EW_HUANG=1;
}
if((0<=Time_EW)&&(Time_EW<=5))
{
EW_ZUO=1;
EW_ZHI=1;
EW_HONG=1;
EW_HUANG=0;
}
}
}

void EW_TING()
{
if((z==2)||(z==3))
{
EW_ZUO=1;
EW_ZHI=1;
EW_HONG=0;
EW_HUANG=1;
}
}


void SN_TING()
{
if((z==0)||(z==1))
{
SN_ZUO=1;
SN_ZHI=1;
SN_HONG=0;
SN_HUANG=1;
}
}

void SN_ZUOTONG()
{
if(z==2)
{
if((6<=Time_SN)&&(Time_SN<=30))
{
SN_ZUO=0;
SN_ZHI=1;
SN_HONG=1;
SN_HUANG=1;
}
if((0<=Time_SN)&&(Time_SN<=5))
{
SN_ZUO=1;
SN_ZHI=1;
SN_HONG=1;
SN_HUANG=0;
}
}
}

void SN_ZHITONG()
{
if(z==3)
{
if((6<=Time_SN)&&(Time_SN<=50))
{
SN_ZUO=1;
SN_ZHI=0;
SN_HONG=1;
SN_HUANG=1;
}
if((0<=Time_SN)&&(Time_SN<=5))
{
SN_ZUO=1;
SN_ZHI=1;
SN_HONG=1;
SN_HUANG=0;
}
}
}

Keil代码与Proteus仿真下载: 交通的仿真和代码.rar (101.51 KB, 下载次数: 70)

评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表