交通信号灯设计与仿真.docx
《交通信号灯设计与仿真.docx》由会员分享,可在线阅读,更多相关《交通信号灯设计与仿真.docx(21页珍藏版)》请在冰点文库上搜索。
![交通信号灯设计与仿真.docx](https://file1.bingdoc.com/fileroot1/2023-5/16/906af513-4ddc-4eb8-9e3e-9fd96b9d1925/906af513-4ddc-4eb8-9e3e-9fd96b9d19251.gif)
交通信号灯设计与仿真
宁波理工学院
专业综合课程实习
课程论文
题目基于proteus的交通信号灯设计与仿真
项目成员黄敏瑶(3100404129)
专业班级电气102
指导教师裘君
分院信息
完成日期20013.7.15
基于proteus的交通信号灯设计与仿真
摘要
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时也带动着传统控制的日新月异更新。
在自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的是交通信号灯的自动指挥系统。
交通信号灯控制方式很多。
本系统采用MSC-51系列单片机AT89S52为中心器件来设计交通灯控制器,实现了能根据实际车流量通过单片机芯片的P2口设置红、绿灯燃亮时间的功能;显示时间直接通过单片机的P0、P3口输出,系统实用性强、操作简单、扩展性强。
关键词:
单片机交通灯控制器
一、概述
1.1红绿灯发展史
当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。
但这一技术在19世纪就已出现了。
1858年,在英国伦敦主要街头安装了以燃煤气为光源的红,蓝两色的机械扳手式信号灯,用以指挥马车通行。
这是世界上最早的交通信号灯。
1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的议会大厦前的广场上,安装了世界上最早的煤气红绿灯。
它由红绿两以旋转式方形玻璃提灯组成,红色表示“停止”,绿色表示“注意”。
1869年1月2日,煤气灯爆炸,使警察受伤,遂被取消。
电气启动的红绿灯出现在美国,这种红绿灯由红绿黄三色圆形的投光器组成,1914年始安装于纽约市5号大街的一座高塔上。
红灯亮表示“停止”,绿灯亮表示“通行”。
1918年,又出现了带控制的红绿灯和红外线红绿灯。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。
1.2单片机概述
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:
中央处理器、存储器和I/O接口电路等。
因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,目前单片机正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引角的多功能化,以及低电压底功耗。
二、题目及要求
实现一个如下基本功能的交通灯:
按照常规我们假设一个十字路口为东西南北走向。
初始状态为状态1,南北方向绿灯通车,东西方向红灯。
经过一段时间(25S)转换状态2,南北方向绿灯闪几次转亮黄灯,延时5S,东西方向仍然红灯。
再转换到状态3,东西方向绿灯通车,南北方向红灯。
过一段时间(25S)转换到状态4,东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯。
最后循环至南北绿灯,东西红灯。
在这些状态下,有时钟倒数计时。
(35分)附加功能得分(15分)
如按键、蜂鸣器等
2.1实验目的
●掌握MCS-51单片机定时器/计数器、外部中断、LED数码管显示及I/O口的综合应用。
●了解交通灯的工作原理及设计方法。
●掌握单片机应用系统分析、设计、调试方法。
2.2实验原理图
图1交通灯电路原理图
(1)
图2交通灯电路原理图
(2)
三、软件设置
keiluvision4软件初始化:
由于KEIL必须要新建一个项目才可以进行c51单片机编程操作,因此以下进行初始化操作。
1.新建project
图3
2.保存工程:
新建立一个文件夹,输入工程名称。
例如LED_DEMO
图4
3.选择CPU:
ATMEL->AT89C52
4.建立main.c
图5
5.选中SourceGroup1,鼠标右击,选择AddFiletoGroup“SourceGroup1”
6.选择main.c工程文件列表框出现main.c,则表示成功,便可在程序框里填写程序。
7.设置生成HEX文件,最后烧入程序与硬件相配合实现交通灯功能。
keilc与proteus联调:
1.在proteus里画好下图:
图6
2.双击proteus里的单片机出现下图:
图7
选择刚刚用keil编译后的HEX文件,点击运行按钮发光管一闪一闪。
然后用记事本打开keil目录下的tools.ini,在[C51]栏目下加入TDRV9=BIN\VDM51.DLL("ProteusVSMMonitor-51Driver"),在keil软件里的"optionsfortarget"target1→Debug"选项里选中右边的use,在下拉菜单中选择proteusvsmsimulator。
最后在proteus的debug菜单中选中useremotedebugmonitor即可实现联调。
四、硬件原理图
图8硬件模块
图9硬件连接
硬件介绍:
交通灯控制器实例主要使用了89C51单片机的定时器/计数器,基础知识主
要包括交通灯的变化规律、定时器/计数器的概念、定时器/计数器的相关寄存
器、定时器/计数器的4种工作方式、以及定时器/计数器的变成。
4.1定时器/计数器
定时器/计数器是单片机中最常用、最重要的功能模块之一,本节通过交通灯控
制器实例来演示定时器的使用,并复习如何使用散转程序。
首先介绍交通灯以及定时器/计数器的基础知识,接着介绍本实例的硬件电路构
成,然后逐步分析定时器的变成以及程序的全貌,最后总结一下本实例的技巧与
注意点。
4.2定时器/计数器的概念
89C51单片机内有两个可编程的定时器/计数器T0、T1。
当定时器/计数器用作“定时器”时,每经过1个机器周期(12个时钟周期),
计数器加1。
4.3定时器/计数器的相关寄存器
与定时器/计数器相关的寄存器有定时器/计数器工作方式寄存器(TMOD)、定
时器/计数器控制寄存器(TCON)。
TCON已经在2.5节受控输出实例中介绍过,
因此,在本例中主要介绍TMOD寄存器。
定时器/计数器工作方式寄存器(TMOD),字节地址89H,不可进行位寻址。
定时器/计数器工作方式寄存器(TMOD)的8位分为两组,高4位控制T1,低4
位控制T0。
4.5定时器/计数器的4种工作方式
定时器/计数器的4种工作方式下的逻辑结构如表所示。
M1
M2
工作方式
0
0
方式0,为13位定时器/计数器
0
1
方式1,为16位定时器/计数器
1
0
方式2,为初值自动重装的8位定时器/计数器
1
1
方式3,仅T0有效,将T0分为两个8位定时器/计数器
4.6定时器/计数器的编程
(1)初始化
定时器/计数器的初始化编程包括以下几个部分。
根据要求给定时器/计数器方式寄存器(TMOD)送一个方式控制字,以设定定时
器/计数器的工作方式。
根据需要给TH和TL寄存器送初值,以确定需要的定时时间或计数的初值。
根据需要给中断允许寄存器(IE)送中断控制字,以开放相应的中断和设定中断
优先级。
给TCON寄存器送命令字以启动或禁止定时/计数器的运行。
(2)定时器/计数器初值的计算。
定时5ms:
T=(8192-5000)*Tcy;
Tcy=1us;
所以:
TH0=(8192-5000)/32;//5ms定时
TL0=(8192-5000)%32
计数器初值:
设计算器的模值位M,所需的计数值为C,计数初值设定为TC,则TC=M-C。
五、软件流程图
开始
初始化
中断初始化
中断触发
Y
Y
状态一
01s中断
N
Number+1
Y
状态二
25N
N
N>60
Y
状态三
Y
30N
Y
N
55状态四
N=1
六、设计结果(仿真+实物)
6.1状态一
状态1:
南北方向绿灯通车,东西方向红灯。
经过一段时间(25S),倒计时。
图6状态一
6.2状态二
状态2,南北方向绿灯闪几次转亮黄灯,延时5S,东西方向仍然红灯。
图7状态二
6.3状态三
状态3,东西方向绿灯通车,南北方向红灯,过一段时间(25S)倒计时。
图8状态三
6.4状态四
状态4,东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯。
图9状态四
七、个人心得
回顾起此次单片机课程设计,我仍感慨颇多,学到了很多的东西。
同时不仅
巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。
在
实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入
的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。
一切
问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的
提升。
对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计中的问
题,而程序设计是一个很灵活的东西。
因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。
八、参考文献
[1]余发山,王福忠.单片机原理及应用技术.徐州:
中国矿业大学出版社,2008
[2]张靖武,周灵彬.单片机原理、应用与PROTEUS仿真.北京:
电子工业出版社,2009
[3]白延敏.51单片机典型系统开发实例精讲.北京:
电子工业出版社,2009
[4]欧阳文.ATMEL89系列单片机的原理与开发实践.北京:
中国电力出版社,2007
九、附件
#include
#defineucharunsignedchar
#defineuintunsignedint
//uintFUNC=1;//0:
数码管功能,1:
红绿灯功能
uintT_Count=0;
uintnumber=0;
uinta=0,a1=0,a2=0;
uintb=0,b1=0,b2=0;
sbitLED=P1^0;
intLEDSHOW[10]={0xC0,0xF9,0xA4,0xB0,0X99,0X92,0X82,0XF8,0X80,0x90};
//#defineLEDP1^0
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
voidmain()
{
//定时器0中断初始化代码
TMOD=0x00;//定时器0工作方式0
TH0=(8192-5000)/32;//5ms定时
TL0=(8192-5000)%32;
IE=0x82;//允许T0中断
TR0=1;
//开始循环
while
(1)
{
if(number<=25&&number>0)//状态一
{
//南北绿灯,东西红灯东西红黄绿南北红黄绿
P1=0xde;
//显示倒计时
b=30-number+1;
b1=b/10;
b2=b%10;
a=25-number+1;
a1=a/10;
a2=a%10;
P2=0X01;//00001110//南北1
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X02;//00001101//南北2
P0=LEDSHOW[a2];
DelayMS(5);
P2=0X04;//00001011//东西1
P0=LEDSHOW[b1];
DelayMS(5);
P2=0X08;//00000111//东西2
P0=LEDSHOW[b2];
DelayMS(5);
}
if(number>25&&number<=30)//状态2
{//南北绿闪烁几次转黄灯,东西继续红灯东西红黄绿南北红黄绿
if(number>25&&number<=28)
{
if(number%2==1)
P1=0xde;
elseP1=0xfe;}
if(number>28&&number<=30)
P1=0Xee;
a=30-number+1;//显示
a1=a/10;
a2=a%10;
P2=0X01;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X02;
P0=LEDSHOW[a2];
DelayMS(5);
P2=0X04;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X08;
P0=LEDSHOW[a2];
DelayMS(5);
}
if(number>30&&number<=55)//状态3
{//东西绿南北红
P1=0xf3;//东西红黄绿南北红黄绿
a=55-number+1;//显示
a1=a/10;
a2=a%10;
b=60-number+1;
b1=b/10;
b2=b%10;
P2=0X01;
P0=LEDSHOW[b1];
DelayMS(5);
P2=0X02;
P0=LEDSHOW[b2];
DelayMS(5);
P2=0X04;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X08;
P0=LEDSHOW[a2];
DelayMS(5);
}
if(number>55&&number<=60)//状态4
{//东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯东西红黄绿南北红黄绿
if(number>55&&number<=58)
{
if(number%2==1)
P1=0xf3;
elseP1=0xf7;}
if(number>58&&number<60)
P1=0Xf5;
a=60-number+1;//显示
a1=a/10;
a2=a%10;
P2=0X01;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X02;
P0=LEDSHOW[a2];
DelayMS(5);
P2=0X04;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X08;
P0=LEDSHOW[a2];
DelayMS(5);
}
}
}
//T0中断函数
voidLED_Flash()interrupt1
{
TH0=(8192-5000)/32;//恢复初值
TL0=(8192-5000)%32;
if(++T_Count==200)//1s开关一次LED
{
number++;
if(number>60)
number=1;
//FUNC=++FUNC%2;
//LED=~LED;
T_Count=0;
}
}