52单片机交通灯课程设计

单片机交通灯课程设计

1. 实验目的和器件

1.1实验目的

(1)通过单片机课程设计,熟练掌握C语言的编写方法,将理论联系到实际中去,提高我们的动手和动脑能力。
(2)通过交通信号灯控制系统的设计,掌握定时器/计数器及中断的使用方法,和简单的程序编写,最总提高我们的逻辑抽象能力。

2.2实验器件

AT89C52、电源、红绿灯、导线若干

2.设计任务和性能指标

2.1设计任务

东西、南北干道交与一个十字路口,各干道有一组红、黄、绿三色的指示灯,指示车辆和行人安全通行。红灯亮禁止通行,绿灯亮允许通行。黄灯亮提示人们注意绿灯的状态即将切换,切黄灯燃亮时间为东西南北两干道的公共停车时间。指示灯燃亮的方案如下所示。
10s 5s 3s 2s ……
东西道 红灯亮 红灯亮 红灯亮 红灯亮 ……
南北道 绿灯亮 绿灯闪 黄灯闪 红灯亮 ……

2.2性能指标

(1)利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭,并用LED灯显示倒计时间。用控制按钮控制两个中断:1、东西红南北绿。2、南北红东西绿。
(2)当东西方向为红灯,此道车辆禁止通行,东西道行人可通行;南北道为绿灯,此道车辆通过,行人禁止通行,通行时间为15S。
(3)当东西方向为绿灯,此道车辆通行;南北道为红灯,此道车辆禁止通行,行人通行,通行时间为15S。

3.设计方案

3.1任务分析

在交通灯控制系统中,东西南北四个方向各有红黄绿三种颜色的指示灯各一盏,共计12盏指示灯,用以来指挥车辆和行人交通安全通行。当红色指示灯亮的时候表示禁止该方向的车辆和行人通行,当黄色指示灯亮的时候提示人们绿灯的状态即将切换。并且黄灯燃亮时为东西和南北两干道的公共停车时间。初始状态0为东西南北都红灯亮。然后转为状态1南北绿灯通车,东西红灯亮。过一段时间后,转为状态2,南北绿灯灭,黄灯闪几下变红灯,东西还是红灯。再转为状态3, 南北红灯亮,东西绿灯通车。过一段时间后转为状态4,东西绿灯灭,闪几下黄灯后转为红灯,南北还是为红灯亮,一段时间后,又循环至状态1。为了达到上述设计要求,可以用一片AT89C52单片机实现。可以用一个AT89C52的P1(P1.0-P1.6)别接上垂直两个道口的6盏信号灯,由AT89C52单片机的P1口送交通信号信息,在这个系统中采取的是共阴极红绿灯,所以当P1口的各引脚输出为高电平时,显示红、绿、黄灯的燃亮情况。用AT89C52的P0口显示绿、黄灯的燃亮的倒计时时间,时间由定时器来控制,由P1口作为倒计时时间的个位:数码,用四个数码管的显示用动态显示方法实现。P3口用来接应急开关K3、K4,对特殊情况的处理,当按下开关时交通显示东西红南北绿或北红东西绿,使殊车辆通过。

3.2硬件设计

根据以上的设计思路分析可以得到十字路口交通灯控制系统的硬件电路设计图。
在这里插入图片描述

3.3软件设计

1)主流程图

通过设计思路的分析,得到主流程如下。
在这里插入图片描述
在这里插入图片描述

4.程序清单

#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit led1r=P1^0; //红
sbit led1g=P1^1; //绿
sbit led1y=P1^2; //黄
sbit led2r=P1^4; //红
sbit led2g=P1^5; //绿
sbit led2y=P1^6; //黄
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code SegCode[]={0x3F,0x06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00}; //数码管段选号
u8 num=0,DisplayDate[8];
u16 i;

void delay500ms() //500ms延时函数
{
unsigned char a,b,c;
for(c=23;c>0;c–)
for(b=152;b>0;b–)
for(a=70;a>0;a–);
}

void Time1Init()
{ //定时器1
TMOD|=0x10;
TH1=0X3C;
TL1=0XAF;
ET1=1;
EA=1;
TR1=1;
}
void Int0Tnit() //外中断0
{
IT0=0; //低电平有效
EX0=1;
EA=1;
}

void Int1Tnit() //外中断1
{
IT1=0; //低电平有效
EX1=1;
EA=1;
}

void main()
{

Int0Tnit();
Time1Init();
Int1Tnit();
while(1);

}

void Time1() interrupt 3 //红绿灯正常运行
{

TH1=0X3C;
TL1=0XAF;
i++;

if(i<=200)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[10];
led1g=1;
led1r=0;
led1y=0;

led2r=1;
led2y=0;
led2g=0;
}
else
{
if(i<=210)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[8];
led1g=1;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=220)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[8];
led1g=0;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{

if(i<=230)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[7];
led1g=1;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{

if(i<=240)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[7];
led1g=0;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=250)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[6];
led1g=1;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=260)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[6];
led1g=0;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=270)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[5];
led1g=1;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=280)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[5];
led1g=0;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{ if(i<=290)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[4];
led1g=1;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=300)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[4];
led1g=0;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=310)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[3];
led1g=0;
led1y=1;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=320)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[3];
led1g=0;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=330)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[2];
led1g=0;
led1y=1;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=340)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[2];
led1g=0;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=350)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[1];
led1g=0;
led1y=1;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{
if(i<=360)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[1];
led1g=0;
led1y=0;
led1r=0;
led2r=1;
led2g=0;
led2y=0;
}
else
{ if(i<=400)
{
LSA=0;LSB=0;LSC=0;
P0=SegCode[10];
led1g=0;
led1y=0;
led1r=1;
led2r=1;
led2g=0;
led2y=0;
}
else
{
switch(i/10)
{
case 40: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 41: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 42: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 43: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 44: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 45: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 46: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 47: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 48: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 49: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 50: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 51: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 52: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 53: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 54: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 55: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 56: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 57: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 58: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 59: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 60: LSA=0;LSB=0;LSC=0;P0=SegCode[8];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 61: LSA=0;LSB=0;LSC=0;P0=SegCode[8];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=0;break;
case 62: LSA=0;LSB=0;LSC=0;P0=SegCode[7];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 63: LSA=0;LSB=0;LSC=0;P0=SegCode[7];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=0;break;
case 64: LSA=0;LSB=0;LSC=0;P0=SegCode[6];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 65: LSA=0;LSB=0;LSC=0;P0=SegCode[6];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=0;break;
case 66: LSA=0;LSB=0;LSC=0;P0=SegCode[5];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 67: LSA=0;LSB=0;LSC=0;P0=SegCode[5];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=0;break;
case 68: LSA=0;LSB=0;LSC=0;P0=SegCode[4];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=1;break;
case 69: LSA=0;LSB=0;LSC=0;P0=SegCode[4];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=0;break;
case 70: LSA=0;LSB=0;LSC=0;P0=SegCode[3];led1r=1;led1y=0;led1g=0;led2r=0;led2y=1;led2g=0;break;
case 71: LSA=0;LSB=0;LSC=0;P0=SegCode[3];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=0;break;
case 72: LSA=0;LSB=0;LSC=0;P0=SegCode[2];led1r=1;led1y=0;led1g=0;led2r=0;led2y=1;led2g=0;break;
case 73: LSA=0;LSB=0;LSC=0;P0=SegCode[2];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=0;break;
case 74: LSA=0;LSB=0;LSC=0;P0=SegCode[1];led1r=1;led1y=0;led1g=0;led2r=0;led2y=1;led2g=0;break;
case 75: LSA=0;LSB=0;LSC=0;P0=SegCode[1];led1r=1;led1y=0;led1g=0;led2r=0;led2y=0;led2g=0;break;
case 76: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=1;led2y=0;led2g=0;break;
case 77: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=1;led2y=0;led2g=0;break;
case 78: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=1;led2y=0;led2g=0;break;
case 79: LSA=0;LSB=0;LSC=0;P0=SegCode[10];led1r=1;led1y=0;led1g=0;led2r=1;led2y=0;led2g=0;break;
case 80: i=0;break;
}
}

}}}}}}}}}}}}}}}}}}

void Int0() interrupt 0 //1方向为红灯,2方向为绿灯
{
while(!k3)
{
if(led1g==1) //判断之前1方向是否为绿
{
LSA=0;LSB=0;LSC=0; //如果为绿则变成黄灯闪烁3次
P0=SegCode[3];
led1r=0;
led1g=0;
led1y=1;
led2r=0;
led2g=1;
led2y=0;
delay500ms();
led1y=0;
delay500ms();
P0=SegCode[2];
led1y=1;
delay500ms();
led1y=0;
delay500ms();
P0=SegCode[1];
led1y=1;
delay500ms();
led1y=0;
delay500ms();
}
LSA=0;LSB=0;LSC=0;
P0=SegCode[10];
led1r=1;
led1g=0;
led1y=0;
led2r=0;
led2g=1;
led2y=0;

}
led1r=1;																//退出中断时2方向绿灯变成黄灯闪烁3次
led2g=0;
led2y=1;
P0=SegCode[3];
delay500ms();
led2y=0;
delay500ms();
led2y=1;
P0=SegCode[2];
delay500ms();
led2y=0;
delay500ms();
led2y=1;
P0=SegCode[1];
delay500ms();
led2y=0;
delay500ms();
i=0;

}

void Int1() interrupt 2 //1方向为绿灯,2方向为红灯
{
while(!k4)
{
if(led2g==1) //判断2方向之前是否为绿
{
LSA=0;LSB=0;LSC=0; //如果为绿则变成黄灯闪烁3次
P0=SegCode[3];
led1r=0;
led1g=1;
led1y=0;
led2r=0;
led2g=0;
led2y=1;
delay500ms();
led2y=0;
delay500ms();
P0=SegCode[2];
led2y=1;
delay500ms();
led2y=0;
delay500ms();
P0=SegCode[1];
led2y=1;
delay500ms();
led2y=0;
delay500ms();
}
LSA=0;LSB=0;LSC=0;
P0=SegCode[10];
led1r=0;
led1g=1;
led1y=0;
led2r=1;
led2g=0;
led2y=0;

}
led2r=1;															  //退出中断时1方向绿灯变成黄灯闪烁3次
led1g=0;
led1y=1;
P0=SegCode[3];
delay500ms();
led1y=0;
delay500ms();
led1y=1;
P0=SegCode[2];
delay500ms();
led1y=0;
delay500ms();
led1y=1;
P0=SegCode[1];
delay500ms();
led1y=0;
delay500ms();
i=400;

}

  • 5
    点赞
  • 0
    评论
  • 13
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值