找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的交通灯控制

[复制链接]
跳转到指定楼层
楼主
一、题目要求:
AT89S51 单片机引脚接有若干按键,另外还接有 12 个 LED 发光二极管和一个电磁式无源蜂鸣器, 8 个动态显示的数码管。8 个数码管 2 个一组共分 4 组,分别用于显示南北和东西方向的通行时间,12 个 LED 发光二极管为分 4 组,每组红绿黄 3 个 LED 灯,分别代表南北和东西方向的交通指示灯。
绘制仿真电路并编程实现以下功能:
⑴南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替通行,主干道每次通行时间都设为 90 秒、支干道每次通行间为 60 秒,时间可通过设置键来进行修改,每个路口灯亮的时间都用数码管进行显示(采用倒计时的方法);
⑵在绿灯转为红灯时,要求黄灯先亮 5 秒钟,才能变换运行车道。
⑶通过按键可以调整南北和东西路口的通过时间。
⑷有紧急车辆要求通过时,按下紧急通告按键,能禁止普通车辆通行,所有道路均为红灯,通行时间为 30 秒,同时蜂鸣器鸣响,让救护车/警车等紧急车辆通过。
二、实验仿真图:
三、程序源代码及仿真图

/*部分代码具体请查看附件信息*/
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int

uchar data DirectVal[4];                                        //秒显示的变量
uchar data DefaultVal_DX=60;                          //东西数默认
uchar data DefaultVal_NB=90;                        //南北默认值
uchar data setTime_DX=60;                //设置东西方向的时间
uchar data setTime_NB=90;                //设置南北方向的时间
int n;
uchar data Count,Count1;
sbit  k4=P3^1;                //禁止
sbit  k1=P3^5;                //时间加
sbit  k2=P3^6;                //时间减
sbit  k3=P3^7;     //切换方向
sbit  SPEAKER = P3^2;

sbit RED_NB=P2^6;                //南北红灯标志
sbit YELLOW_NB=P2^5;        //南北黄灯标志
sbit GREEN_NB=P2^4;     //南北绿灯标志

sbit RED_DX=P2^3;                //东西红灯标志
sbit YELLOW_DX=P2^2;        //东西黄灯标志
sbit GREEN_DX=P2^1;                //东西绿灯标志
               
bit set=0;                                //调时方向切换键标志 =1时,南北,=0时,东西
bit dx_nb=0;                        //东西南北控制位
bit Shanshuo=0;                        //闪烁标志位

uchar code TABLE[11]={        //共阴极字型码
        0x3f,  //--0
        0x06,  //--1
        0x5b,  //--2
        0x4f,  //--3
        0x66,  //--4
        0x6d,  //--5
        0x7d,  //--6
        0x07,  //--7
        0x7f,  //--8
        0x6f,  //--9
        0x00   //--NULL
};

void key();                                        //按键扫描子程序
void SegmentDisplay();                                //显示子程序
void Buzzer();


void delaylms(int ms)                //延时子程序
{
        uint j,k;
        for(j=0;j<ms;j++)                        //延时ms
           for(k=0;k<124;k++);                //大约1毫秒的延时
}

/*定时器0初始化*/
void Timer0Init(){
        TMOD |= 0X01;
        TH0 = 0X4B;
        TL0 = 0XFC;
        ET0 = 1;
        EA = 1;
        TR0 = 1;
}
/*定时器1初始化*/
void Timer1Init(){
        TMOD |= 0X10;
        TH1 = 0X4B;
        TL1 = 0XFC;
        ET1 = 1;
        EA = 1;
        TR1 = 1;
}

/*主程序*/
void main()
{
        Timer0Init();
        Timer1Init();
        TR1 = 0;
        P2=0Xc3;                                        // 默认东西绿灯,南北红灯灯   
  DefaultVal_NB=DefaultVal_DX+5; //设置南北通行时间比东西多5秒
        while(1)               
        {         
                key();
                SegmentDisplay();
        }       
}
/*按键扫描子程序*/
void key(void){
        if(k1!=1)        {
                delaylms(10);
                if(k1!=1){
                  TR0=0;
                        Shanshuo=0;
                        P2=0x00;
                        TR1=0;
                        if(set==0)//设置键按下
                                setTime_DX++;//南北加1
                        else
                                setTime_NB++;//东西加1
                        if(setTime_NB==100)
                                setTime_NB=1;
                        if(        setTime_DX==100)
                                setTime_DX=1;//加到100置1
                        DefaultVal_NB=setTime_NB ;//设置的数值赋给东西南北
                        DefaultVal_DX=setTime_DX;                       
                  do        {
                                SegmentDisplay();
                        }while(k1!=1);//松手检测
                }
        }

        if(k2!=1)        {                                                        //当K2(时间减)按键按下时
                delaylms(10);
                if(k2!=1){
                         TR0=0;
                        Shanshuo=0;
                        P2=0x00;
                        TR1=0;
                        if(set==0)
                                setTime_DX--;
                        else
                                setTime_NB--;
                        if(setTime_NB==0)
                                setTime_NB=99;       
                        if(        setTime_DX==0 )
                                setTime_DX=99;
                        DefaultVal_NB=setTime_NB ;
                        DefaultVal_DX=setTime_DX;
                  do{         
                                SegmentDisplay();
                        }
                        while(k2!=1);
                }
        }
        if(k3!=1) {
                delaylms(10);
                if(k3!=1){
                  
                         TR0=0;
                        set=!set;
                        TR1=0;
                        dx_nb=set;
                        do{
                                SegmentDisplay();
                        }                               
                        while(k3!=1);
                }
        }       

        if(k4!=1){
                delaylms(10);
                if(k4!=1){
                        TR0=0;
                        P2=0x00;
                        RED_DX=1;
                        RED_NB=1;
                        TR1=0;
                        DefaultVal_DX=30;
                        DefaultVal_NB=30;
                        TR0 = 1;
                        do{
                                SegmentDisplay();
                                SPEAKER = !SPEAKER;
                                if((DefaultVal_DX == 0)&&(DefaultVal_NB==0)){
                                        SPEAKER = 1;
                                }
                        }       
                        while(k4!=1);
                }
        }
}

1.png (86.36 KB, 下载次数: 79)

仿真图

仿真图

交通灯.rar

71.93 KB, 下载次数: 119, 下载积分: 黑币 -5

程序源代码及仿真图

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

使用道具 举报

沙发
ID:829100 发表于 2020-11-17 08:28 | 只看该作者
为什么秒表走的很快
回复

使用道具 举报

板凳
ID:854295 发表于 2020-12-5 16:45 | 只看该作者
#在这里快速回请问一下,紧急车辆通过时的程序是哪一部分,怎么实现的?复#
回复

使用道具 举报

地板
ID:1085175 发表于 2023-7-2 11:16 | 只看该作者
这个程序为什么还有bug
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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