51交通灯设计单片机课程设计报告大学论文.docx
《51交通灯设计单片机课程设计报告大学论文.docx》由会员分享,可在线阅读,更多相关《51交通灯设计单片机课程设计报告大学论文.docx(19页珍藏版)》请在冰豆网上搜索。
![51交通灯设计单片机课程设计报告大学论文.docx](https://file1.bdocx.com/fileroot1/2023-1/6/446a888e-771c-440f-945f-756d8749ae5b/446a888e-771c-440f-945f-756d8749ae5b1.gif)
51交通灯设计单片机课程设计报告大学论文
广西大学
电气工程学院
单片机课程设计报告
题目51交通灯设计
专业电气工程及其自动化
班级
学号
学生姓名
基于51单片机的交通灯控制系统设计
摘要:
在日常生活中,交通信号灯的使用,市交通得以有效管理,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
交通灯控制系统由89C52单片机、LED显示、交通灯延时组成。
系统除具有基本交通灯功能外,还具有LED信息显示功能,使交通实现有效控制。
关键词:
交通灯,单片机,自动控制
1、引言
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,针对具体应用对象的特点,配以其它器件来加以完善.伴随人口车辆的日益增长,那么十字路口车辆穿梭,行人熙攘,如何才能使交通井然有序呢?
靠的就是交通信号灯的自动指挥系统。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。
左右转弯车辆都必须让正在路口内直行的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
本系统采用MSC-51系列单片机来设计交通灯控制器,实现了各方向车辆、行人轮流通行的功能,此外还设置人性化倒计时显示。
同时还具有南北、东西方向强制通行功能。
二、概要设计
2.1设计思路
利用单片机实现交通灯的控制,该任务分以下几个方面:
a实现红、绿、黄灯的循环控制,并且交通灯系统带有左转信号灯。
要实现此功能需要表示三种不同颜色的共16个LED灯,每两个一组分别接在51单片机的不同管脚,用软件实现控制。
b用数码管显示倒计时。
采用2个两位共阴极数码管,利用动态显示,通过单片机IO口控制位选,段选动态显示时间情况。
c实现急通车。
这需要人工实现,编程时利用到中断才能带到目的,当有按钮按下时,可以使东西方向(南北方向)显示绿灯,另一个方向显示红灯,禁止车辆通行。
当情况解除,通过复位按键使交通灯重新恢复工作。
2.2设计的主要内容和要求
交通灯处在十字路口上。
它有红﹑黄﹑绿三种颜色的灯组成。
红灯亮时道路上的车辆停止运行;黄灯是一种过渡用的信号灯,当它亮时,表示道路上的红绿色信号灯即将进行转换。
下面拿东西南北四个方向来说明。
当东西方向允许行车(或者左转)的时候,南北方向就禁止行车,即此时东西方向的绿灯亮红灯灭,而南北方向的绿灯灭红灯亮。
反之当南北方向允许行车(或者左转)的时候,东西方向就禁止行车,即此时南北方向的绿灯亮红灯灭,而东西方向的绿灯灭红灯亮。
交通灯配置示意图如图1所示。
同时当有特殊的情况发生时,能手动控制各个方向的信号灯。
设计任务就是将这一电路用单片机来实现具体的控制。
图1十字路口交通灯配置示意图
2.3总体设计框图
见图2:
三、硬件设计
3.1LED循环电路设计
89C52单片机概述
MCS-51单片机内部结构:
89C52是MCS-51系列单片机的典型产品,现在以这一代表性的机型进行系统的讲解。
89C52单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等极大单元及数据总线、地址总线和控制总线等三大总线。
89C52主要功能特性:
·标准MCS-51内核和指令系统
·片内8kROM(可扩充64kB外部存储器)
·32个双向I/O口
·256x8bit内部RAM(可扩充64kB外部存储器)
·3个16位可编程定时/计数器
·时钟频率3.5-12/24/33MHz
·向上或向下定时计数器
·改进型快速编程脉冲算法
·6个中断源
·5.0V工作电压
·全双工串行通信口
·布尔处理器
—帧错误侦测
·4层优先级中断结构
—自动地址识别
·兼容TTL和CMOS逻辑电平
·空闲和掉电节省模式
·PDIP(40)和PLCC(44)封装形式
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。
MCS-51系统的引脚说明:
MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,图3是它们的引脚配置,40个引脚中,正电源和底线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
图3
89C51的复位方式可以自动复位,也可以是手动复位,见下图。
除此之外,RESET/Vpd还是一复用脚,Vcc掉电其间,此脚可以接上没用电源,以保证单片机内部RAM的数据不丢失。
在编程时,EA/Vpp脚还需加上21V的编程电压。
3.2LED循环说明
为了便于说明,不妨将东西方向允许直行命名为状态1,东西方向允许左转命名为状态2,东西方向行车到南北方向行车的转换阶段命名为状态3,将南北方向允许直行命名为状态4,南北方向允许左转命名为状态5,南北方向行车到东西方向方向行车的转换阶段命名为状态6。
假定左转绿灯点亮的时间为25s,直行绿灯点亮的时间为20s,黄灯点亮的时间为5s,则对方红灯的点亮时间为50秒。
黄灯每隔500ms亮一次,之后灭500ms(亮灭一次叫作闪烁一次),一共闪烁5次,持续5s。
各个状态之间的变换情况如下:
状态1
状态2
状态3
状态4
状态5
状态6
状态1
具体显示周期如下:
25s
20s
5s
50s
状态1
状态2
状态3
状态4
状态5
状态6
南北路口
直行
绿灯亮
左转
绿灯亮
黄灯亮
缓行
红灯亮禁行
东西路口
红灯亮禁行
直行
绿灯亮
左转
绿灯亮
黄灯亮
缓行
50s
25s
20s
5s
图4
3.3
单片机I/O口控制交通灯电路:
protel电路原理图:
LED灯采用共阳极接法,所有的LED灯阳极都接在5V电压一端,加上限流电阻,阴极接单片机的IO口,当IO口输出低电平时LED亮,通过设置不同的输出来改变LED的亮灭,实现交通灯的控制。
上图为51单片机的最小系统,包括51的晶振电路和上电复位电路。
3.4倒计时显示电路
Protel电路原理图:
数码管采用共阴极数码管,位选端口直接接在IO口上,段码端口通过8个上拉电阻接在IO口上,通过IO口控制数码管显示时间。
3.4紧急情况按钮电路
为了实现此功能,利用单片机中断达到目的。
利用两个手动开关分别接至单片机外部中断0和中断1,同时在软件设计时将其设为最高优先级。
当开关S3按下,南北方向为红灯;开关S4按下,东西方向为红灯。
按复位键退出中断,重新开始。
电路图如下图。
3.5整体电路图
Protel电路原理图:
上图是利用AltiumDesignerRelease10做出的整体设计原理图
Protel电路原理图的PCB图:
上图是利用AltiumDesignerRelease10做出的51交通灯的印制电路板PCB图。
Proteus仿真电路图:
上图是利用proteus搭建的51交通灯仿真电路,截图状态为仿真运行开始状态。
四软件设计
4.1程序流程图:
4.2LED红绿灯显示
当P1端口输出高电平,即P1各端口=1时,根据发光二极管的单向导电性可知,这是发光二极管熄灭;当P1个端口输出低电平,即P1各端口=0时,发光二极管亮。
通过设置P1口不同时段输出电平的不同来控制发光二极管模拟交通灯的各种状态。
4.3倒计时显示
数码管的显示采用共阴极数码管的动态显示,通过P2口的P2.0至P2.3分别控制东西南北方向的数码管位选信号,然后通过P0口作为数码管的段选信号,通过位选信号的分时选择来控制数码管的个位,十位分别显示,又由于这期间的时间间隔很短,所以我们看起来数码管的个位十位是同时亮的。
然后利用定时器倒计时,通过数码管显示出来。
4.4急通车控制
将一按钮接到单片机外部中断0端口。
另一端接地,通过在程序里设置外部中断0为最高优先级。
当检测到有按钮按下时,产生中断,停止刚才的程序,转向中断执行。
4.5程序代码
见附录。
五总结
回顾起此次单片机课程设计,我仍感慨颇多,学到了很多的东西。
同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。
在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。
一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。
对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。
因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。
通过此次实践,我更加了解到自己对专业知识的不足,在课堂上我只能学习到理论知识,但实际动手能力却很差。
在硬件设计中还是没有很大困难的。
最困难的就是编写程序,加上对C语言程序的生疏,从一开始根本就不知道从何入手。
对于所编写的程序,自己感觉从理论上是可以的,但一应用到硬件上就不行了。
通过这次实习,使我的理论知识上升到了一个实践的过程。
同时在实践中也加深了我们对理论知识的理解。
总之,虽然实习的时间很短,但对我来说,收获是很大的。
我会更加珍惜我的学习,并且用实习的心得时时激励自己。
在这次设计中我得到了同学很多的帮助,我非常感谢他们,而且在设计过程中得到了老师们的帮助,衷心感谢老师给我们提供了这次难得的实践机会!
附录:
/*****************************************************
十字路口交通灯控制C程序
******************************************************/
#defineucharunsignedchar
#defineuintunsignedint
#include
/*****定义控制位**********************/
sbitEW_LED2=P2^3;//东西数码管个位
sbitEW_LED1=P2^2;//东西数码管十位
sbitSN_LED2=P2^1;//南北数码管个位
sbitSN_LED1=P2^0;//南北数码管十位_
sbitSN_Yellow=P1^2;//南北黄灯
sbitEW_Yellow=P1^6;//东西黄灯
sbitEW_Red=P1^7;//东西红灯
sbitSN_Red=P1^3;//南北红灯
//sbitBusy_Btton=P3^2;
bitFlag_SN_Yellow;//南北黄灯标志位
bitFlag_EW_Yellow;//东西黄灯标志位
charTime_EW;//东西方向倒计时单元
charTime_SN;//南北方向倒计时单元
ucharEW=50,SN=25,EWL=20,SNL=20;//程序初始化赋值,正常模式
ucharEW1=50,SN1=25,EWL1=20,SNL1=20;//用于存放修改值的变量
uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x0,0x40};//数字段码
ucharS[4]={0x7e,0x7d,0xe7,0xd7};
/**********************延时子程序************************/
voidDelay(uchara)
{
uchari;
i=a;
while(i--){;}
}
/*****************显示子函数**************************/
voidDisplay(void)
{
charh,l;
h=Time_EW/10;
l=Time_EW%10;
P0=table[l];
EW_LED2=0;
Delay(200);
EW_LED2=1;
P0=table[h];
EW_LED1=0;
Delay(200);
EW_LED1=1;
h=Time_SN/10;
l=Time_SN%10;
P0=table[l];
SN_LED2=0;
Delay(200);
SN_LED2=1;
P0=table[h];
SN_LED1=0;
Delay(200);
SN_LED1=1;
}
/**********************T0中断服务程序*******************/
voidtimer0(void)interrupt1using1
{
staticucharcount;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==10)
{
if(Flag_SN_Yellow==1)//南北黄灯标志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1)//东西黄灯标志位
{EW_Yellow=~EW_Yellow;}
}
if(count==20)
{
Time_EW--;
Time_SN--;
if(Flag_SN_Yellow==1)//南北黄灯标志位
{Time_SN=Time_EW;
{
SN_Yellow=~SN_Yellow;}
}
if(Flag_EW_Yellow==1)//东西黄灯标志位
{Time_EW=Time_SN;
{
EW_Yellow=~EW_Yellow;
}
}
count=0;
}
}
/*********************主程序开始**********************/
voidmain(void)
{
IT0=0;//定义外部中断触发方式
IT1=0;
TMOD=0x01;//定时器工作于方式1
TH0=(65536-50000)/256;//定时器赋初值
TL0=(65536-50000)%256;
EA=1;//CPU开中断总允许
ET0=1;//开定时中断
EX1=1;//开外部INTO中断
EX0=1;
TR0=1;//启动定时
P2=0xff;
while
(1)
{/*******S1状态**********/
Flag_EW_Yellow=0;//EW关黄灯显示信号
Time_EW=EW;
Time_SN=SN;
while(Time_SN>0)
{P1=S[0];//SN通行,EW红灯
Display();}
/*******S2状态**********/
Flag_SN_Yellow=0;//SN关黄灯显示信号
Time_SN=SNL;
while(Time_SN>0)
{P1=S[1];//SN左拐绿灯亮,EW红灯
Display();}
/*******S3状态**********/
P1=0xff;
while(Time_EW>0)
{Flag_SN_Yellow=1;//SN开黄灯信号位
EW_Red=0;//SN黄灯亮,等待停止信号,EW红灯
Display();
}
/***********赋值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
/*******S4状态**********/
Flag_SN_Yellow=0;//SN关黄灯显示信号
Time_EW=SN;
Time_SN=EW;
while(Time_EW>0)
{P1=S[2];//EW通行,SN红灯
Display();}
/*******S5状态**********/
Flag_EW_Yellow=0;//EW关黄灯显示信号
Time_EW=EWL;
while(Time_EW>0)
{P1=S[3];//EW左拐绿灯亮,SN红灯
Display();}
/*******S6状态**********/
P1=0Xff;
while(Time_SN>0)
{Flag_EW_Yellow=1;//EN开黄灯信号位
SN_Red=0;//EW黄灯亮,等待停止信号,SN红灯
Display();}
/***********赋值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
}
}
voidxint1()interrupt2//外部中断INT1控制南北通行东西禁止
{
P1=0xe7;
Display();
Delay(200);
while
(1)
{}
}
voidxint0()interrupt0//外部中断INT0控制东西通行南北禁止
{
P1=0x7e;
Display();
Delay(200);
while
(1)
{}
}