天津理工大学
电信学院
专业设计
题
目
项目成员 俞东
专业班级 信息二班
学 院 电信学院
完成日期 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;
}
}
天津理工大学
电信学院
专业设计
题
目
项目成员 俞东
专业班级 信息二班
学 院 电信学院
完成日期 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;
}
}