1
51单片机应用实训报告
课程名称 51单片机应用
实训题目 十字路口交通信号灯
系 别 机电技术系
专业班级 机电1401
学 号
姓 名
2
基于AT89C52RC单片机的十字路口交通灯设计
1 设计目的和方案
1.1设计目的
近年来随着科技的飞速发展,一个以微电子技术、计算机技术和通信技术为先导的信息革命正在蓬勃发展。计算机技术作为三者之一,怎样与实际应用更有效的结合并发挥其作用。单片机作为计算机技术的一个分支,正在不断的应用到实际生活中,同时带动传统控制检测的更新。在实时检测和自动控制的应用系统中,单片机往往是作为一个核心部件使用,针对具体应用对象的特点,配以其它器件来加以完善。现代社会有越来越多的人开始有了自己的私家车,同时,便有了交通拥挤的问题,如何在车流量巨大的十字路口保证车辆畅行,交通灯便起到了巨大的作用。实际上,1858年,英国伦敦就有了最早的然煤气交通灯,至今,交通灯已经普及到世界各地,成为社会生活中不可或缺的装置。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
1.2设计方案
设计方案如表1所示。
表1设计方案
55s 5s 55s 5s
南北道 红灯亮 红灯亮 绿灯亮 黄灯亮 .......
东西道 绿灯亮 黄灯亮 红灯亮 红灯亮 .......
1.4设计任务
东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三个指示灯,指挥车辆和行人安全通行。红灯亮禁止通行,绿灯亮允许通行。红灯的设计时间为60秒,绿灯及左转绿灯各为55秒。黄灯为闪烁5秒。
2功能
该电子产品实现的功能:本系统除基本交通灯功能以外,还有倒计时等功能,较好的模拟了十字路口出现的状况。
具体功能如下:
(1)当东西方向为红灯,此道车辆禁止通行,东西道行人可通过;南北道为绿灯,
3
此道车辆通过,行人禁止通行。时间为60秒。
(2)黄灯闪烁5秒,警示车辆和行人红、绿灯的状态即将切换。
(3)当东西方向为绿灯,此道车辆通行;南北方向为红灯,南北道车辆禁止通过,行人通行。时间为60秒。 东西方向车流大 通行时间长。
(4)这样如上表的时间和红、绿、黄出现的顺序依次出现这样行人和车辆就能安全畅通的通行。
3硬件设施及简介
AT89C52RC单片机一片,共阳极的七段数码管,两个双向晶闸管若干,电源若干,晶振电路,紧急通行电路一个,LED红黄绿灯各三个。导线若干。
数码显示管两个:显示倒计时时间。
4 程序方框图
主程序流程图如图2所示。
信号灯控制定义中断参数南北方向绿灯亮东西方向红灯亮5s延时5s南北黄灯亮东西绿灯亮25s南北黄灯亮5启动定时器,容许中断P1.7=0?N
图2 程序方框图 4
5 电路原理及说明
5.1总电路原理图
绘制出所做作品的原理图如图3所示。
图3电路原理图
5.2 电路原理说明
电路工作原理:如附图所示,东西绿灯55s黄灯5s,南北方向红灯亮60s,倒计时结束,转向,南北方向绿灯55s,黄灯5s,东西方向红灯60s,依次循环。两个晶体管用来显示倒计时时间,6个不同颜色的LED灯显示各方向的红绿灯情况。使用51单片机作为芯片,一个紧急通行按钮。
LED 灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点亮。七段数码管连接显示不同的数字如 SP,g,f,e,d,c,b,a 。
6系统仿真及实际调试
程序仿真是基于proteus软件的,仿真结果如图4所示
5
图4仿真结果
7总结
在进行过程中遇到的问题及解决方法:
通过这次课程设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
在进行过程中,遇到很多困难与问题,例如程序不会写,仿真不出结果,结果不正确等问题,但是困难总是有办法解决的,通过查询网络,请教同学等方式,改编出了源程序,请教同学做出来了仿真结果。为以后的课设继续进行打好了基础。
作为机电一体机专业的学生,我觉得做单片机课程设计是十分有意义的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。
我认为这个收获应该说是相当大的。觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。
6
附录
程序如下
#include
sbit NS_GRE = P0^5;
sbit NS_YEL = P0^4;
sbit NS_RED = P0^3;
sbit EW_GRE = P0^2;
sbit EW_YEL = P0^1;
sbit EW_RED = P0^0;
uint8 EW_Timer = unused8;
uint8 NS_Timer = unused8;
uint8 YEL_Timer = unused8;
int main(void)
{
Timer_Init();
INT0_Init();
EA=1;
NS_GRE = OFF;
NS_YEL = OFF;
NS_RED = OFF;
EW_GRE = OFF;
EW_YEL = OFF;
EW_RED = OFF;
P3 = 0xFF;
EW_Timer = EWTime_Count; while(1)
{
if((EW_Timer != unused8) && (EW_Timer != 0))
display1(EW_Timer/10, EW_Timer%10);
EW_RED_ON();
NS_GRE_ON(); }
else if((EW_Timer != unused8) && (EW_Timer == 0) && (YEL_Timer ==
unused8))
EW_RED_ON();
NS_YEL_ON();
YEL_Timer = YELTime_Count; }
if((EW_Timer != unused8) && (YEL_Timer != unused8) && (YEL_Timer != 0))
{display1(YEL_Timer/10, YEL_Timer%10); }
if((EW_Timer != unused8) && (YEL_Timer == 0)){
EW_Timer = unused8;
YEL_Timer = unused8;
7
NS_RED_ON();
EW_GRE_ON();
NS_Timer = NSTime_Count;
}
if((NS_Timer != unused8) && (NS_Timer != 0))
{ display2(NS_Timer/10, NS_Timer%10);
EW_GRE_ON();
NS_RED_ON();
} else if((NS_Timer != unused8) && (NS_Timer == 0) &&
(YEL_Timer == unused8)){
NS_RED_ON();
EW_YEL_ON();
YEL_Timer = YELTime_Count; }
if((NS_Timer != unused8) && (YEL_Timer != unused8) && (YEL_Timer != 0)){
display2(YEL_Timer/10, YEL_Timer%10); }
if((NS_Timer != unused8) && (YEL_Timer == 0))
{ NS_Timer = unused8;
YEL_Timer = unused8;
EW_RED_ON();
NS_GRE_ON();
EW_Timer = EWTime_Count;
}
if(Flag_Key == 1){
P3 = 0xFF;
EW_RED_ON();
NS_RED_ON();
EW_Timer = unused8;
NS_Timer = unused8;
YEL_Timer = unused8;
}
}
}
sbit Key = P3^2;
uint8 Flag_Key = 0;
void INT0_Init(void)
{
EX0 = 1;
IT0 = 1;
}
void Key_Stop(void) interrupt 0
8
{
Delay10uS(200);
if(Key == 0){
Flag_Key = 1;
}
}
sbit NS_GRE = P0^5;
sbit NS_YEL = P0^4;
sbit NS_RED = P0^3;
sbit EW_GRE = P0^2;
sbit EW_YEL = P0^1;
sbit EW_RED = P0^0;
uint8 EW_Timer = unused8;
uint8 NS_Timer = unused8;
uint8 YEL_Timer = unused8;
int main(void)
{
Timer_Init();
INT0_Init();
EA=1;
NS_GRE = OFF;
NS_YEL = OFF;
NS_RED = OFF;
EW_GRE = OFF;
EW_YEL = OFF;
EW_RED = OFF;
P3 = 0xFF;
EW_Timer = EWTime_Count;
while(1)
{
if((EW_Timer != unused8) && (EW_Timer != 0))
{
display1(EW_Timer/10, EW_Timer%10);
EW_RED_ON();
NS_GRE_ON();
}else if((EW_Timer != unused8) && (EW_Timer == 0) && (YEL_Timer
== unused8))
{
EW_RED_ON();
NS_YEL_ON();