1、前言
1、十字路口的交通控制系统指挥着人和各种车辆的安全运行,对交叉口实行科学的管理与控制是交通控制工程的重要研究课题,是保障交叉口的交通安全和充分发挥交叉口的通行能力的重要措施,是解决城市交通问题的有效途径。交通灯信号灯的出现是人类历史上的一次重大改革,使人类的聚居生活,产生了深远的影响。使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市高速道路,缓解主干道与匝道、城区同周边地区的交通拥堵状况,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。随着电子技术的发展,利用单片机技术对交通灯进行智能化管理,已成为目前广泛采用的方法。
2、此十字路口交通灯控制系统,分东西道和南北道,设东西道为A道,南北道为B道。规定:A道放行时间为2分钟,B道放行1.5分钟;绿灯放行,红灯停止;绿灯转红灯时,黄灯亮2秒钟;若有紧急车辆要求通过时,此系统应能禁止普通车辆,而让紧急车辆通过。
3、应用单片机实现对交通灯的控制,在十字路口用红,黄,绿的指示灯,加上四个以倒计时显示的数码管来控制交通。考虑到紧急车辆,设计紧急车辆开关。
2、正文
2.1 芯片介绍
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:
·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
2.2 交通灯状态
S1:东西通行,南北禁止 S2:东拐南,西拐北通行
S3:南北通行,东西禁止 S4:北拐东,南拐西通行
S1状态120秒,S2状态20秒,S3状态90秒,S4状态20秒,循环执行。
2.3 设计步骤
1,利用proteus 7.5 sp3仿真软件绘制仿真实例
1用traffic lights和一个绿色LED灯表示红、黄、绿,以及允许左拐的信号灯。
2用P0口控制交通灯,用P1口控制数码管的段选,P2口控制数码管的位选。
3P3.6和P3.7接收中断信号并返回给INT0接口处理。
2,利用Keil软件按要求编写程序实现相应功能。
三、硬件设计
3.1 通过proteus 7.5 sp3设计如下仿真图:
S1状态:
黄灯亮:
S2状态:
黄灯亮:
S3状态:
黄灯亮:
S4状态:
黄灯亮:
系统仿真调试
系统的仿真调试借助于PROTEUS仿真器,在进行系统仿真的连续调试之前要先进行软件的初调,就是要使各个子程序模块运行正确,程序的运行流程正确,生成hex文件。
附:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit Button_A=P3^6;
//sbit Button_B=P3^7;
uchar table[ ]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //共阴段码表0--9
char Time_EW; //东西方向倒计时
char Time_SN; //南北方向倒计时
uchar EW=89,SN=89,EWJ=29,SNJ=29,EWL=19,SNL=19; //程序初始化赋值
uchar count=0;
/********************************************************/
void delay(unsigned char i) //延时i ms
{
unsigned char j;
while(i--)
{
for(j=0;j<115;j++);
}
}
/******************************************************/
void Display(void)
{
P2=0x08;
P1=table[Time_EW/10];
delay(2);
P2=0x04;
P1=table[Time_EW%10];
delay(2);
P2=0x02;
P1=table[Time_SN/10];
delay(2);
P2=0x01;
P1=table[Time_SN%10];
delay(2);
}
/******************T0中断*************************************/
void time_0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==20)
{
Time_SN--;
Time_EW--;
count=0;
}
}
void int0(void) interrupt 0
{
while(Button_A==0)
{
P0=0x09; //所有都是红灯
P1=0; //关数码管
}
}
/******************主程序*******************************/
void main()
{
TR0=1; //启动定时器0
TMOD=0x01; //定时器工作于方式1
TH0=(65536-50000)/256; //定时器赋初值
TL0=(65536-50000)%256;
EA=1; //CPU开中断总允许
ET0=1; //开定时中断
EX0=1; //开外部INTO中断
IT0=1; //INT0负跳变触发
while(1)
{
/*S1*****A道放行*******/ //S1状态
Time_EW=EW; //90s
Time_SN=SN; //90s
while(Time_EW>=0)
{
P0=0x0c;
Display();
}
/******A道+30s********/
Time_SN=SNJ; //SNJ=29
Time_EW=EWJ; //EWJ=29
while(Time_EW>=2)
{
P0=0x0c;
Display();
}
/******A道黄灯********/
while(Time_EW>=0)
{
P0=0x0a;
Display();
}
/*S2*****A道左拐******/ //S2状态
Time_SN=SNL; //20 s
Time_EW=EWL; //20 s
while(Time_EW>=2)
{
P0=0x80;
Display();
}
/******A道黄灯*******/
while(Time_EW>=0)
{
P0=0x0a;
Display();
}
/*S3*****B道放行*****/ //S3状态
Time_EW=EW; //90s
Time_SN=SN; //90s
while(Time_EW>=2)
{
P0=0x21;
Display();
}
/******B道黄灯*******/
while(Time_EW>=0)
{
P0=0x11;
Display();
}
/*S4*****B道左拐*****/ //S4状态
Time_SN=SNL; //20 s
Time_EW=EWL; //20 s
while(Time_EW>=2)
{
P0=0x40;
Display();
}
/******B道黄灯******/
while(Time_EW>=0)
{
P0=0x11;
Display();
}
}
}