单片机信号交通灯说明书.docx
《单片机信号交通灯说明书.docx》由会员分享,可在线阅读,更多相关《单片机信号交通灯说明书.docx(24页珍藏版)》请在冰点文库上搜索。
![单片机信号交通灯说明书.docx](https://file1.bingdoc.com/fileroot1/2023-5/23/afcbde39-8083-4c1e-bb9e-efb3663beff6/afcbde39-8083-4c1e-bb9e-efb3663beff61.gif)
单片机信号交通灯说明书
基于51单片机的交通灯控制系统
[摘要]近年来随着单片机芯片的发展,单片机在各个领域的应用越来越多,单片机往往作为一个核心部件来使用,在实时检测和自动控制的单片机应用系统中,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的就是交通信号灯的自动指挥系统。
交通信号灯控制方式很多。
本系统采用STC89C51单片机以及单片机最小系统和三极管驱动电路以及外围的按键和数码管显示等部件,设计一个基于51单片机的交通灯设计。
设计通过两位一体共阴极数码管显示,并能通过按键对定时进行设置。
本系统实用性强、操作简单、扩展功能强。
设计通过STC89C51单片机以及单片机最小系统和74HC245驱动数码管以及外围的按键和数码管显示等部件,数码管倒计时显示时间。
[关键词]单片机;74HC245;交通信号灯
Thetrafficlightcontrolsystembasedon51singlechipmicrocomputer
[Abstract]Inrecentyears,withthedevelopmentofsingle-chipmicrocomputer,single-chipcomputerapplicationinallfields,moreandmoresinglechipmicrocomputeroftenasacorecomponenttouse,inreal-timedetectionandautomaticcontrolofmicrocomputerapplicationsystem,onlysinglechipmicrocomputeraspectsknowledgeisnotenough,stillshouldaccordingtothespecificcombinationofhardwareandsoftware,hardwarestructure,perfected.
Crossroadstransports,bustling,bikelanes,pedestrianfootbridgehumanitarian,inanorderlyway.Sowhattodothisinorder?
Relyonistheautomaticcommandsystemoftrafficlights.Alotoftrafficsignallampcontrolway.ThissystemadoptstheSTC89C51microcontrollerandthesinglechipmicrocomputerminimumsystemandtransistordrivecircuitandperipheralkeysanddigitaltubedisplaycomponents,suchasdesignatrafficlight?
basedon51singlechipmicrocomputer.
[KeyWords]Singlechip;74HC245;Trafficlights
目录
第1章.绪论1
第2章.系统设计要求3
第3章.系统设计4
3.1系统设计总体框图4
3.2各模块原理说明4
3.2.1最小系统STC89C51模块4
3.2.274HC245芯片模块5
3.2.3显示模块功能6
3.2.4控制按钮模块6
3.3系统总原理图说明7
3.4系统的操作说明7
3.5系统操作注意事项7
参考文献8
附录10
附录一.电路总原理图10
附录二.源程序11
第1章绪论
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
由于我国经济的快速发展从而导致了汽车数量的猛增,大中型城市的城市交通,正面临着严峻的考验,从而导致交通问题日益严重,其主要表现如下:
交通事故频发,对人类生命安全造成极大威胁;交通拥堵严重,导致出行时间增加,能源消耗加大;空气污染和噪声污染程度日益加深等。
日常的交通堵塞成为人们司空见惯而又不得不忍受的问题,在这种背景下,结合我国城市道路交通的实际情况,开发出真正适合我们自身特点的智能信号灯控制系统已经成为当前的主要任务。
随着电子技术的发展,利用单片机技术对交通灯进行智能化管理,已成为目前广泛采用的方法。
第2章系统设计要求
1.用单片机STC89C51设计一个交通灯系统,并用数码管显示时间,LED指示通行。
2、用74HC245来驱动4个数码管,使数码管在白天也能清晰可见。
3.按键功能:
黄灯常亮(深夜模式)、禁行(紧急模式)、东西通行、南北通行、确定、时间加、时间减、切换。
4.用12MHz的晶振频率产生时钟信号。
5.使用共阴极八段数码管显示时间。
4.电路供电电源5V。
5.初始东西绿灯亮,南北红灯亮,东西方向通车。
6.延时25s,东西路口绿灯熄灭,黄灯闪烁3次。
7.黄灯闪烁后,东西路口红灯亮同时南北路口绿灯亮,南北方向开始通车。
8.延时35s,南北方向绿灯灭,黄灯闪烁3次,然后又切换成东西方向通车,如此重复。
9.当发生交通意外(中断产生)时,全部亮红灯,进行交通事故的处理。
当事故处理完毕(再次按中断键),重新按上述方式工作。
10.当南北路口的流量大时,可以增加南北路口亮绿灯的时间,当东西路口的流量大时,可以增加东西路口亮绿灯的时间,结束后调回正常状态。
第3章系统设计
3.1系统设计总体框图
单片机
图3-1系统设计总体框图
3.2各模块原理说明
3.2.1最小系统STC89C51模块
STC89C51是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用STC公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,STC89C51单片机在电子行业中有着广泛的应用。
STC89C51主要管脚说明:
VCC(40脚):
供电电压GND(20脚):
接地RST:
复位输入。
/EA/VPP(31脚):
当/EA为低电平时,不管是否有内部程序存储器,只选用片外存储器,外部程序存储器地址为:
0000H-FFFFH。
反之当单片机上电或复位后选用片内程序存储器。
XTAL1(19脚):
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2(18脚):
来自反向振荡器的输出。
单片机最小系统采用5V电源供电,利用晶振电路给单片机工作运行提供脉冲。
图3-2最小系统
3.2.274HC245芯片模块
74HC245是一款高速CMOS器件,74HC245引脚兼容低功耗肖特基TTL(LSTTL)系列。
74HC245八路收发器在发送和接收两个方向上都具有正相三态总线兼容输出。
74HC245的输出使能端
用于实现轻松级联,而发送/接收端(DIR)用于控制方向。
控制输出,使得总线被有效的隔离输出。
图3-374HC245芯片引脚图
3.2.3显示模块功能
显示模块分别用数码管显示和LED显示,数码管倒计时显示可以提醒驾驶员在信号灯颜色发生改变的时间、在“停止”和“通过”两者间作出合适的选择。
驾驶员和行人普遍都愿意选择有倒计时显示的信号控制方式,并且认为有倒计时显示的路口更安全。
倒计时显示是用来减少驾驶员在信号灯色改变的关键时刻做出复杂判断的一种方法,它可以提醒驾驶员灯色发生改变的时间,帮助驾驶员在“停止”和“通过”两者间作出合适的选择。
通过两种显示结合,是本设计更合理可靠。
如下图3-4所示。
图3-4显示模块功能图
3.2.4控制按钮模块
本系统要求的按键控制不多,单片机的I/0口足够,可直接采用独立式。
按键可以设置系统的运行状态,禁行状态为数码管均显示“00”,红灯全亮;复位按键可以将整个系统复位;时间加减可以设置通行和等待通行的时间;切换按键可以切换加减的方向时间。
通过按键模块的控制,使得整个系统具有灵活性,实用性。
如下图3-5所示。
图3-5控制按钮模块
3.3系统总原理图说明
当接通5v电源后,按下电源开关,南北方向数码管显示“25”。
数码管开始倒计时,到5秒的时候,将切换红绿黄灯。
系统总原理图见附1。
按键1复位、按键2黄灯常亮(深夜模式)、按键3红灯常亮(紧急模式)、按键4东西通行、按键5南北通行、按键6确定、按键7时间加、按键8时间减、按键9切换。
3.4系统的操作说明
1.接好电路中的电源供电线。
2.检查好电路板中没有短路现象、电源供电线都接好后通电使用。
3.电路安装好后,通电即可正常使用。
3.5系统操作注意事项
1.通电使用前先对照电路板与电路图是否有错焊、漏焊、短路、开路、元器件相碰等现象,有要处理好后再使用。
2.通电使用前先检查好电路板是否与电源供电线、驱动电路开关与负载供电线、负载供电线之间相互接反,不得在接错的情况下通电,要处理好后再使用。
3.应把电极片与电路板隔离,避免电极片与电路板上元器件相碰触发生短路现象。
4.通电时应把电路板放在绝缘物体上,避开其他导电物体避免发生短路现象。
5.使用时闻到烧焦味、发现元器件或集成块冒烟烧毁应立即断开电源,待
电路板查明原因处理好后才可以继续通电使用。
6.调试电路时应小心操作,避免万用表笔或其它导电工具造成人为短路,更换电路板元件、焊接时应断开电源后再操作避免造成元器件击穿或电路短路现象。
参考文献
[1]李建忠.单片机原理及应用[M].西安电子科技大学出版社,2008
[2]张毅刚.单片机原理及接口技术.哈尔滨:
哈尔滨工业大学出版社,1999
[3]徐爱钧.8051单片机实践教程[M].北京电子工业出版社,2005
[4]楼然苗,李光飞.51系列单片机设计实例[M].北京航空航天大学出版社,2006
[5]陈小忠,黄宁.单片机接口技术实用子程序[M],北京:
北京人民邮电出版社,2005
[6]全国大学生电子设计竞赛组委会.北京:
北京理工大学出版社,2004年8月.
[7]韩全立.赵德申编著.微机控制技术[M].北京:
机械工业出版社,2008
[8]王守中,聂元铭.51单片机开发入门与典型实例[M].北京:
人民邮电出版社,2009
附录
附录一:
电路总原理图
附录二:
源程序代码
#include//头文件
#defineucharunsignedchar
#defineuintunsignedint//宏定义
uchardatabuf[4];//秒显示的变量
uchardatasec_dx=20;//东西数默认
uchardatasec_nb=30;//南北默认值
uchardataset_timedx=20;//设置东西方向的时间
uchardataset_timenb=30;//设置南北方向的时间
intn;
uchardatacountt0,countt1;//定时器0中断次数
//定义6组开关
sbitk4=P3^7;//切换方向
sbitk1=P3^5;//时间加
sbitk2=P3^6;//时间减
sbitk3=P3^4;//确认
sbitk5=P3^1;//禁止
sbitk6=P1^5;//夜间模式
sbitRed_nb=P2^6;//南北红灯标志
sbitYellow_nb=P2^5;//南北黄灯标志
sbitGreen_nb=P2^4;//南北绿灯标志
sbitRed_dx=P2^3;//东西红灯标志
sbitYellow_dx=P2^2;//东西黄灯标志
sbitGreen_dx=P2^1;//东西绿灯标志
bitset=0;//调时方向切换键标志=1时,南北,=0时,东西
bitdx_nb=0;//东西南北控制位
bitshanruo=0;//闪烁标志位
bityejian=0;//夜间黄灯闪烁标志位
ucharcodetable[11]={//共阴极字型码
0x3f,//--0
0x06,//--1
0x5b,//--2
0x4f,//--3
0x66,//--4
0x6d,//--5
0x7d,//--6
0x07,//--7
0x7f,//--8
0x6f,//--9
0x00//--NULL
};
//函数的声明部分
voiddelay(intms);//延时子程序
voidkey();//按键扫描子程序
voidkey_to1();//键处理子程序
voidkey_to2();
voidkey_to3();
voiddisplay();//显示子程序
voidlogo();//开机LOGO
voidBuzzer();
//主程序
voidmain()
{
TMOD=0X11;//定时器设置
TH1=0X3C;
TL1=0XB0;
TH0=0X3C;//定时器0置初值0.05S
TL0=0XB0;
EA=1;//开总中断
ET0=1;//定时器0中断开启
ET1=1;//定时器1中断开启
TR0=1;//启动定时0
TR1=0;//关闭定时1
EX0=1;//开外部中断0
EX1=1;//开外部中断1
logo();//开机初始化
P2=0Xc3;//开始默认状态,东西绿灯,南北黄灯
sec_nb=sec_dx+5;//默认南北通行时间比东西多5秒
while
(1)//主循环
{
key();//调用按键扫描程序
display();//调用显示程序
}
}
//函数的定义部分
voidkey(void)//按键扫描子程序
{
if(k1!
=1)//当K1(时间加)按下时
{
display();//调用显示,用于延时消抖
if(k1!
=1)//如果确定按下
{
TR0=0;//关定时器
shanruo=0;//闪烁标志位关
P2=0x00;//灭显示
TR1=0;//启动定时1
if(set==0)//设置键按下
set_timedx++;//南北加1S
else
set_timenb++;//东西加1S
if(set_timenb==100)
set_timenb=1;
if(set_timedx==100)
set_timedx=1;//加到100置1
sec_nb=set_timenb;//设置的数值赋给东西南北
sec_dx=set_timedx;
do
{
display();//调用显示,用于延时
}
while(k1!
=1);//等待按键释放
}
}
if(k2!
=1)//当K2(时间减)按键按下时
{
display();//调用显示,用于延时消抖
if(k2!
=1)//如果确定按下
{
TR0=0;//关定时器0
shanruo=0;//闪烁标志位关
P2=0x00;//灭显示
TR1=0;//关定时器1
if(set==0)
set_timedx--;//南北减1S
else
set_timenb--;//东西减1S
if(set_timenb==0)
set_timenb=99;
if(set_timedx==0)
set_timedx=99;//减到1重置99
sec_nb=set_timenb;//设置的数值赋给东西南北
sec_dx=set_timedx;
do
{
display();//调用显示,用于延时
}
while(k2!
=1);//等待按键释放
}
}
if(k3!
=1)//当K3(确认)键按下时
{
display();//调用显示,用于延时消抖
if(k3!
=1)//如果确定按下
{
TR0=1;//启动定时器0
sec_nb=set_timenb;//从中断回复,仍显示设置过的数值
sec_dx=set_timedx;//显示设置过的时间
TR1=0;//关定时器1
if(set==0)//时间倒时到0时
{
P2=0X00;//灭显示
Green_dx=1;//东西绿灯亮
Red_nb=1;//南北红灯亮
sec_nb=sec_dx+5;//回到初值
}
else
{
P2=0x00;//南北绿灯,东西红灯
Green_nb=1;
Red_dx=1;
sec_dx=sec_nb+5;
}
}
}
if(k4!
=1)//当K4(切换)键按下
{
display();//调用显示,用于延时消抖
if(k4!
=1)//如果确定按下
{
TR0=0;//关定时器0
set=!
set;//取反set标志位,以切换调节方向
TR1=0;//关定时器1
dx_nb=set;
do
{
display();//调用显示,用于延时
}
while(k4!
=1);//等待按键释放
}
}
if(k5!
=1)//当K5(禁止)键按下时
{
display();//调用显示,用于延时消抖
if(k5!
=1)//如果确定按下
{
TR0=0;//关定时器
P2=0x00;//灭显示
Red_dx=1;
Red_nb=1;//全部置红灯
TR1=0;
sec_dx=00;//四个方向的时间都为00
sec_nb=00;
do
{
display();//调用显示,用于延时
}
while(k5!
=1);//等待按键释放
}
}
if(k6!
=1)//当K6(夜间模式)按下
{
display();//调用显示,用于延时消抖
if(k6!
=1)//如果确定按下
{
TR0=0;//关定时器
P2=0x00;
TR1=1;
sec_dx=00;//四个方向的时间都为00
sec_nb=00;
do
{
display();//调用显示,用于延时
}
while(k6!
=1);//等待按键释放
}
}
}
voiddisplay(void)//显示子程序
{
buf[1]=sec_nb/10;//第1位东西秒十位
buf[2]=sec_nb%10;//第2位东西秒个位
buf[3]=sec_dx/10;//第3位南北秒十位
buf[0]=sec_dx%10;//第4位南北秒个位
P1=0xff;//初始灯为灭的
P0=0x00;////灭显示
P1=0xfe;//片选LED1
P0=table[buf[1]];//送东西时间十位的数码管编码
delay
(1);//延时
P1=0xff;//关显示
P0=0x00;//灭显示
P1=0xfd;//片选LED2
P0=table[buf[2]];//送东西时间个位的数码管编码
delay
(1);//延时
P1=0xff;//关显示
P0=0x00;//关显示
P1=0Xfb;//片选LED3
P0=table[buf[3]];//送南北时间十位的数码管编码
delay
(1);//延时
P1=0xff;//关显示
P0=0x00;//关显示
P1=0Xf7;//片选LED4
P0=table[buf[0]];//送南北时间个位的数码管编码
delay
(1);//延时
}
voidtime0(void)interrupt1using1//定时中断子程序
{
TH0=0X3C;//重赋初值
TL0=0XB0;//12m晶振50ms//重赋初值
TR0=1;//重新启动定时器
countt0++;//软件计数加1
if(countt0==10)//加到10也就是半秒
{
if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1))//东西黄灯闪
{
Green_dx=0;
Yellow_dx=0;
}
if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1))//南北黄灯闪
{
Green_nb=0;
Yellow_nb=0;
}
}
if(countt0==20)//