单片机交通灯课程设计报告.docx
《单片机交通灯课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机交通灯课程设计报告.docx(19页珍藏版)》请在冰点文库上搜索。
单片机交通灯课程设计报告
单片机原理及系统课程设计
评语:
考勤(10)
守纪(10)
过程(40)
设计报告(30)
答辩(10)
总成绩(100)
专业:
zzzzzzzzzzzzzzzz
班级:
zzzzzzzzzzzzzz
姓名:
zzzzzzzzzzzz
学号:
zzzzzzzzz
指导教师:
zzzzzzzzzzz
2013年3月7日
基于单片机的交通灯设计
摘要
交通在人们的日常生活中占有重要的地位。
交通信号灯的出现,对于提高道路通行能力、减少交通事故有明显效果。
本系统采用单片机AT89C51为中心器件,包括手动按键控制电路、LED数码管显示电路、共阴极数码管显示电路等几大部分组成。
系统分为硬件控制和软件控制两大部分。
硬件部分,采用proteus软件来仿真硬件连接,软件部分则通过keilc来进行程序设计,使硬件在软件的控制下,协调运行。
关键词:
AT89C51;交通灯;LED
Abstract
ThetrafficisveryimportantinPeople'sDailylife.Theemergenceofthetrafficlights,forimprovingroadtrafficcapacity,reducetrafficaccidentshaveobviouseffect.ThissystemadoptssinglechipmicrocomputerAT89C51asthecenter,includingamanualbuttoncontrolcircuit,LEDdigitaltubedisplaycircuit,digitaltubedisplaycircuitandsoonseveralcommoncathode.Systemisdividedintohardwareandsoftwarecontroloftwoparts.Hardwarepart,usestheproteussimulationsoftwaretothehardwareconnection,softwarepartbykeilcprogramdesign,thehardwareundersoftwarecontrol,coordinationofoperation.
KeyWords:
AT89C51,Trafficlights,LED
1引言
本设计是基于单片机交通灯控制系统。
其核心器件是AT89C51单片机。
LED显示红灯,黄灯,绿灯来指挥车辆和行人,其中红灯亮表示该条道路上禁止通行;黄灯亮表示该条道路上未过停车线的车辆停止通行,已过停车线的车辆继续通行;绿灯亮表示该条道路上允许通行。
两位共阴极数码管显示时间。
六个按键用来对交通灯进行控制。
本系统为实现交通道路的管理,分析应用了单片机实现交通灯管制的控制系统以及该系统软件、硬件的设计方法。
2设计方案及原理
2.1总体设计方案
本系统由AT89C51单片机,手动按键控制部分,共阴极数码管显示部分,LED灯显示部分组成。
2.2系统原理框图(如图1所示)
图1系统设计框图
2.3系统工作原理
系统通过LED灯(红灯、黄灯、绿灯)来指挥车辆和行人,AT89C51的P2口用来驱动LED灯显示;74LS245芯片驱动两位共阴极数码管的8位段码显示,P1.0口和P1.1口驱动两位共阴极数码管的位码显示,两位共阴极数码管显示时间;六个按键对交通灯进行控制。
3硬件设计
电路图共有六个按键,每个按键都对交通灯进行不同的控制。
每个按键及其对应的功能如表1所示。
表1按键及对应的功能
按键
对应的功能
P1.6
加时间
P1.7
减时间
P2.7
确认
P3.1
紧急停车
P3.2
强制东西通行
P3.3
强制南北通行
3.1两位共阴极数码管显示设计
两位共阴极数码管用来显示时间,74LS245驱动数码管显示,其中74LS245的B0~B7驱动ABCDEFG及DP八个段码显示,AT89C51驱动1和2这两个位码显示。
连接图如图2所示。
图2两位共阴极数码管连接图
3.2LED灯显示设计
分东西南北方向,每个方向分别有红灯、黄灯和绿灯。
其中红灯亮表示该条道路上禁止通行;黄灯亮表示该条道路上未过停车线的车辆停止通行,已过停车线的车辆继续通行;绿灯亮表示该条道路上允许通行。
连接图如图3所示。
图3LED灯显示连接图
3.3整体硬件连接图
本系统由单片机总控制器部分,手动按键控制部分,共阴极数码管显示部分以及LED灯显示部分组成。
其整体硬件连接图如图4所示。
图4整体硬件连接图
4软件设计
4.1主程序流程图
程序主要包括:
主程序、按键处理子程序、显示子程序和中断程序。
其中主程序设定为定时器0,工作方式1(TMOD=0X01),开总中断(EA=0),打开定时器0(ET0=1),启动定时器0(TR0=1),开外部中断0(EX0=1),开外部中断1(EX1=1)等。
主要控制LED灯的显示,LED灯开始默认状态为东西绿灯,南北红灯,开始倒计时,倒计时完毕,东西黄灯闪烁5秒,东西变为红灯,南北变为绿灯,开始倒计时,倒计时至5秒黄灯开始闪烁(因为程序中南北的时间比东西多5秒),闪烁结束后东西变为绿灯,南北变为红灯,开始倒计时,依次循环。
主程序流程图如图5所示。
图5主程序流程图
4.2按键处理子程序流程图
系统共有六个按键,程序中有按键扫描子程序函数voidkey()和按键处理子程序函数voidkey_to(),分别对按键进行扫描和处理。
按键处理子程序流程图如图6所示。
4.3数码管显示子程序流程图
程序中共阴极数码管显示用voiddisplay()函数,其流程图如图7所示。
图6按键处理子程序流程图图7数码管显示子程序流程图
5系统仿真及实际调试
系统初始默认为东西亮绿灯,南北亮红灯。
开始倒计时(倒计时的时间可以根据车流量进行设定),东西绿灯倒计时为零就开始闪烁5秒钟的黄灯,而南北仍为红灯。
当东西黄灯闪烁完毕,南北就变为亮绿灯,东西变亮红灯。
然后开始倒计时,倒计时至5秒南北就开始闪烁黄灯(因为程序中南北的时间比东西多5秒)。
南北黄灯闪烁完毕,东西变亮绿灯,南北变亮红灯。
这便是一个循环周期,以后按次周期依次循环。
六个按键可以对交通灯及数码管显示的时间进行控制。
按键P1.6和P1.7可以根据车流量加、减时间;P3.1是紧急停车按键,例如当十字路口发生交通事故时,可以按下P3.1键,使东西南北同时显示红灯;按键P2.7是确认按键。
按键P3.2是强制东西通行按键,按键P3.3是强制南北通行按键。
当救护车、消防车等有非常紧急事情的车辆通行时,可以给控制中心打电话,控制中心就会按下P3.2或P3.3键,从而保证这些紧急车辆一路绿灯。
仿真图为东西闪烁黄灯,南北为红灯,倒计时至3秒,如图8所示。
图8仿真图
6总结
本文是基于单片机的交通灯设计。
在设计过程中,我遇到了一些问题:
首先是在keilc中运行程序时出现了一些错误,经检查是一些变量没有定义和一些标点符号的不合理造成的;其次在protues中画硬件连接图时多费了些时间,比如有些器件很难找到,但是上网查阅都解决了。
最后把kailc中生成的目标代码导入硬件连接图中成功显示。
参考文献
[1]马忠梅.单片机应用程序设计(第四版)[M].北京:
北京航空航天大学出版社,2010年5月:
20-50.
[2]赵俊生.单片机技术原理与实训[M].北京:
电子工业出版社,2009年3月:
217-231.
[3]冯先成.单片机应用系统设计(第一版)[M].北京:
北京航空航天大学出版社,2009:
22-27.
[4]苏玉萍.基于单片机的交通灯控制系统设计[J].甘肃科技,2011(10):
2-5.
附录源程序代码
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardatabuf[4];
uchardatasec_dx=20;//东西数默认
uchardatasec_nb=25;//南北默认值
uchardataset_timedx=20;
uchardataset_timenb=25;
intn;
uchardatab;//定时器中断次数
sbitk1=P1^6;//定义4组开关
sbitk2=P1^7;
sbitk3=P2^7;
sbitk4=P3^1;
sbitYellow_nb=P2^5;//南北黄灯标志
sbitYellow_dx=P2^2;//东西黄灯标志
sbitGreen_nb=P2^4;
sbitGreen_dx=P2^1;
bittime=0;//灯状态循环标志
bitset=1;//调时方向切换键标志
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();//显示子程序
//主程序
voidmain()
{
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
EA=1;
ET0=1;
TR0=1;
EX0=1;
EX1=1;
P2=0Xc3;//开始默认状态,东西绿灯,南北红灯
sec_nb=sec_dx+5;
while
(1)
{
key();//调用按键扫描程序
display();//调用显示程序
}
}
//函数的定义部分
voidkey()//按键扫描子程序
{
if(k1!
=1)
{
delay(10);
if(k1!
=1)
{
while(k1!
=1)
{
key_to1();
for(n=0;n<40;n++)
{display();}
}
}
}
if(k2!
=1)
{
delay(10);
if(k2!
=1)
{
while(k2!
=1)
{
key_to2();
for(n=0;n<40;n++)
{display();}
}
}
}
if(k3!
=1)
{
TR0=1;//启动定时器
sec_nb=set_timenb;//从中断回复,仍显示设置过的数值
sec_dx=set_timedx;
if(time==0)
{P2=0X99;sec_nb=sec_dx+5;}
else{P2=0xC3;sec_dx=sec_nb+5;}
}
if(k4!
=1)
{
delay(5);
if(k4!
=1)
{
while(k4!
=1)
key_to3();
}
}
}
voiddisplay()//显示子程序
{
buf[1]=sec_dx/10;//第1位东西秒十位
buf[2]=sec_dx%10;//第2位东西秒个位
buf[3]=sec_nb/10;//第3位南北秒十位
buf[0]=sec_nb%10;//第4位南北秒个位
P1=0xff;//初始灯为灭的
P0=0x00;
P1=0xfe;//片选LCD1
P0=table[buf[1]];
delay
(1);
P1=0xff;
P0=0x00;
P1=0xfd;//片选LCD2
P0=table[buf[2]];
delay
(1);
P1=0xff;
P0=0x00;
P1=0Xfb;//片选LCD3
P0=table[buf[3]];
delay
(1);
P1=0xff;
P0=0x00;
P1=0Xf7;
P0=table[buf[0]];//片选LCD4
delay
(1);
}
voidtime0(void)interrupt1using1//定时中断子程序
{
b++;
if(b==19)//定时器中断次数
{b=0;
sec_dx--;
sec_nb--;
if(sec_nb<=5&&time==0)//东西黄灯闪
{Green_dx=0;Yellow_dx=!
Yellow_dx;}
if(sec_dx<=5&&time==1)//南北黄灯闪
{Green_nb=0;Yellow_nb=!
Yellow_nb;}
if(sec_dx==0&&sec_nb==5)
sec_dx=5;
if(sec_nb==0&&sec_dx==5)
sec_nb=5;
if(time==0&&sec_nb==0)
{P2=0x99;time=!
time;sec_nb=set_timenb;sec_dx=set_timenb+5;}
if(time==1&&sec_dx==0)
{P2=0Xc3;time=!
time;sec_dx=set_timedx;sec_nb=set_timedx+5;}
}
}
voidkey_to1()//键盘处理子程序之+
{
TR0=0;//关定时器
if(set==0)
set_timenb++;//南北加1S
else
set_timedx++;//东西加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;
}
voidkey_to2()//键盘处理子程序之-
{
TR0=0;//关定时器
if(set==0)
set_timenb--;//南北减1S
else
set_timedx--;//东西减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;
}
voidkey_to3()//键盘处理之紧急车通行
{
TR0=0;
P2=0Xc9;
sec_dx=00;
sec_nb=00;
}
voidint0(void)interrupt0using1//只允许东西通行
{
TR0=0;
P2=0Xc3;
sec_dx=00;
sec_nb=00;
}
voidint1(void)interrupt2using1//只允许南北通行
{
TR0=0;
P2=0X99;
sec_nb=00;
sec_dx=00;
}
voiddelay(intms)//延时子程序
{
uintj,k;
for(j=0;jfor(k=0;k<124;k++);
}