交通信号灯设计与仿真

天津理工大学

电信学院

专业设计

项目成员 俞东

专业班级 信息二班

学 院 电信学院

完成日期 20014年,12月3日

交通信号灯设计与仿真

摘要

十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的是交通信号灯的自动指挥系统。交通信号灯控制方式很多。本系统采用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 功能在增强,内部资源在增多,引角的多功能化,以及低电压底功耗。

题目及要求

红绿灯的设计,电脑仿真 2.2实验原理图

图1 交通灯电路原理图(1)

图2交通灯电路原理图(2)

软件设置

keil uvision4软件初始化:由于KEIL 必须要新建一个项目才可以进行c51单片机编程操作,因此以下进行初始化操作。 1. 新建project

图3

2. 保存工程:新建立一个文件夹,输入工程名称。例如LED_DEMO

图4

3. 选择CPU :ATMEL->AT89C52 4. 建立main.c

5

5. 选中 Source Group 1,鼠标右击,选择Add File to Group “Source Group 1” 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 ("Proteus VSM Monitor-51 Driver" ),在keil 软件里的

"options for target"target1→Debug"选项里选中右边的use ,在下拉菜单中选择proteus vsm

simulator 。最后在 proteus 的

debug 菜单中选中 use remote debug monitor即可实现联调。

硬件原理图

图8 硬件模块

图9硬件连接

硬件介绍:

交通灯控制器实例主要使用了89C51单片机的定时器/计数器,基础知识主

要包括交通灯的变化规律、定时器/计数器的概念、定时器/计数器的相关寄存 器、定时器/计数器的4种工作方式、以及定时器/计数器的变成。

定时器/计数器

定时器/计数器是单片机中最常用、最重要的功能模块之一,本节通过交通

灯控

制器实例来演示定时器的使用,并复习如何使用散转程序。

首先介绍交通灯以及定时器/计数器的基础知识,接着介绍本实例的硬件电路构 成,然后逐步分析定时器的变成以及程序的全貌,最后总结一下本实例的技巧与 注意点。

一、 软件流程图

设计结果(仿真+实物)

状态一

状态1:南北方向绿灯通车,东西方向红灯。经过一段时间(25S ),倒计时。

图6 状态一

状态二

状态2,南北方向绿灯闪几次转亮黄灯,延时5S ,东西方向仍然红灯。

图7 状态二

状态三

状态3,东西方向绿灯通车,南北方向红灯,过一段时间(25S )倒计时。

图8 状态三

状态四

状态4,东西方向绿灯闪几次转亮黄等,延时5S ,南北方向仍然红灯。

图9 状态四

参考文献

[1]余发山 ,王福忠. 单片机原理及应用技术. 徐州:中国矿业大学出版社,2008

[2] 张靖武 ,周灵彬. 单片机原理、应用与PROTEUS 仿真. 北京: 电子工业出版社, 2009

[3] 白延敏 .51单片机典型系统开发实例精讲. 北京: 电子工业出版社, 2009

[4] 欧阳文 .ATMEL89系列单片机的原理与开发实践. 北京: 中国电力出版社, 2007 附件

#include

#define uchar unsigned char

#define uint unsigned int

//uint FUNC = 1 ; //0:数码管功能, 1:红绿灯功能

uint T_Count= 0;

uint number=0;

uint a=0,a1=0,a2=0;

uint b=0,b1=0,b2=0;

sbit LED=P1^0;

int LEDSHOW[10] = {0xC0,0xF9,0xA4,0xB0,0X99,0X92,0X82,0XF8,0X80,0x90}; //#define LED P1^0

//延时

void DelayMS(uint x)

{

uchar i;

while(x--)

{

for(i=0;i

}

}

//主程序

void main()

{

//定时器0中断初始化代码

TMOD=0x00; //定时器0 工作方式0

TH0=(8192-5000)/32; //5ms 定时

TL0=(8192-5000)%32;

IE=0x82; //允许T0 中断

TR0=1;

//开始循环

while(1)

{

if(number0)//状态一

{

//南北绿灯,东西红灯 东西 红黄绿 南北 红黄绿

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

{ //南北绿闪烁几次转黄灯,东西继续红灯 东西 红黄绿

if(number>25&&number

{

if(number%2==1)

P1=0xde;

else P1=0xfe;}

if(number>28&&number

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

{ //东西绿 南北红

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

if(number>55&&number

{

if(number%2==1)

P1=0xf3;

else P1=0xf7;}

if(number>58&&number

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 中断函数

void LED_Flash() interrupt 1

{

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;

}

}


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn