怎么设计一个基于单片机的交通灯控制系统?

1 概述
1.1设计背景
如今随着人们生活水平的提高,车辆越来越多,交通事故频繁发生。交通信号灯的出现,使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。交通灯在城市交通中起着重要的作用,它与人们日常生活密切相关,是人们出行的安全保障。因此提供一个可靠、安全、便捷的多功能交通灯控制系统有着现实的必要性。为了解决这些问题,我们更应该提高交通控制和管理水平,合理使用现有交通设施,充分发挥其能力,提高交通效率,促进和谐交通的建立。,
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
而本系统设计一个基于单片机的交通灯控制系统。能方便的对交通灯进行控制,使交通更和谐。
1.2设计目的
通过自主设计和调试交通红绿灯系统,综合应用单片机原理、微机原理、微机接口技术等课程方面的知识,熟练掌握单片机仿真系统的使用方法,达到提高综合应用相关知识的能力,掌握单片机系统设计全部设计过程的目的。
1.3设计思路
此系统核心元件为单片机at89c51,对其编写相关程序来控制交通信号灯和数码管的时间显示。系统共采用8个发光二极管来模拟各路交通信号灯,4个显示倒计时的显示器,通过倒计时的显示这种方式显示各个方向上允许通行或禁止通行的信号灯剩余的时间。在东西和南北两个方向上这两种状态不断循环。源程序采用c语言编写,并通过kei1软件进行编译,最后倒入at89c51单片机中,运行系统。设计好后通过proteus软件仿真,并调试。
2 软件设计
2.1keil简介
keil c51是美国keil software公司出品的51系列兼容单片机c语言软件开发系统,与汇编相比,c语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。keil提供了包括c编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μvision)将这些部分组合在一起。运行keil软件需要win98、nt、win2000、winxp等操作系统。如果你使用c语言编程,那么keil几乎就是你的不二之选,即使不使用c语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
2.2proteus简介
proteus软件是英国lab center electronics公司出版的eda工具软件。它不仅具有其它eda工具软件的仿真功能,还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
proteus是英国著名的eda工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到pcb设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、pcb设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、hc11、pic10/12/16/18/24/30/dspic33、avr、arm、8086和msp430等,2010年又增加了cortex和dsp系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持iar、keil和matlab等多种编译器。
3 系统总体方案与硬件设计
3.1硬件电路各元件介绍
3.1.1核心芯片at89c51单片机的说明
1.主要特性
(1)与mcs-51兼容
(2)4k字节可编程闪烁存储器
(3)寿命:1000写/擦循环
(4)数据保留时间:10年
(5)全静态工作:0hz-24hz
(6)三级程序存储器锁定
(7)128*8位内部ram
(8)32可编程i/o线
(9)两个16位定时器/计数器
(10)5个中断源
(11)可编程串行通道
(12)低功耗的闲置和掉电模式
(13)片内振荡器和时钟电路
图3-1 at89c51
2.管脚说明
vcc:供电电压。
gnd:接地。
p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据或地址的第八位。在fiash编程时,p0口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。
p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。
p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。
p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收,输出4个
ttl门电流。p3口也可作为at89c51的一些特殊功能口
rst :复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。
ale/pr0g:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。
/psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。
/ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。
3.1.2两位共阴七段数码管
两位共阴七段式数码管其实就是将两个一位八段式数码接相应的电路组合在一起。并引出两控制端1和2,同过其电平的高低来控制两个数码管的高低位
工作。
图3-2 两段共阴七段数码管
3.1.3其他元件说明
交通信号灯:采用红、黄、绿三种颜色的二极管组成三色交通信号。
图3-3 三色二极管
3.2总体电路工作原理
十字路口要有数字显示装置,作为时间提示,以便人们更直观地把握时间。具体要求为:当某方向绿灯亮时,置定时器为某一个数值,然后以每秒减1的计数方式工作,直至减到数为0,十字路口红、绿灯交换,一次工作循环结束,进入另一个方向的工作循环。数码显示管就是用来显示东西和南北两个道口的红黄绿三种颜色的灯的倒计时时间。
南北路处于禁止通行的状态,东西路处于允许通行的状态。南北路亮红灯时,东西路亮绿灯;南北路亮绿灯时,东西路亮红灯。南北路亮红灯时,东西路亮绿灯;当绿灯时间减完之后,东西路换为黄灯,南北路仍为红灯.这样东西路与南北路的时间同时减完。减完之后,东西路换为红灯,南北路换为绿灯,再经过一个绿灯时间,南北路换为黄灯,东西路仍为红灯。这时东西路与南北路时间相同,同时减完。减完后,南北路为红灯,东西路为绿灯。如此隔环下去。
整个设计满足了任务的要求,即完成了四个状态的转换,完成了倒计时数码管的显示,所以这个系统的设计足以控制十字路口的交通灯正常变换,保证各道车辆的畅通运行。
4 程序设计
4.1系统流程图
此系统主要以东西南北红、绿、黄三种颜色的led灯来表示交通灯组成交通红绿灯管理系统,红灯等待时间为25秒,绿灯通行时间是20秒,相差的5秒时间为黄灯闪烁时间,用来提示行人和车辆,具体流程图如下:
图4-1 系统总流程图
4.2源程序代码
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define dig0 0x01
#define dig1 0x02
#define dig2 0x03
#define dig3 0x04
void delay(uint i);
void t0_init();
void max7219(uchar addr,uchar num);
void max7219_init();
void display();
sbit din=p3^0;
sbit load=p3^1;
sbit clk=p3^2;
sbit g1=p0^0;
sbit y1=p0^1;
sbit r1=p0^2;
sbit g2=p1^0;
sbit y2=p1^1;
sbit r2=p1^2;
uchar ns_s,ns_g,ew_s,ew_g;
uchar ns,ew;
uchar temp=0,i;
uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //¹²òõ¼¶êýâë¹üêý×é
void delay(uint i)
{
uint j;
for(j=0;j
}
void t0_init()
{
tmod=0x01;
th0=0xd8;
tl0=0xf0;
et0=1;
tr0=1;
}
void max_write(uchar ch)
{
uchar j,ads;
for(j=0;j<8;j++)
{
ads=ch&0x80;
clk = 0;
if(ads)
din = 1;
else
din = 0;
ch=ch<<1;
clk=1; //éïéýñø£¬dinµäêý¾ýð´èëµ½7219
}
}
void max7219(uchar addr, uchar num)
{
load = 0;
nop ();
max_write(addr);
nop ();
max_write(num);
nop ();
load = 1;
}
void max7219_init()
{
max7219(0x0c,0x01);
max7219(0x0b,0x03); //éèöãé¨ãè·¶î§dig0-3
max7219(0x0a,0x05);
max7219(0x09,0x00); //²éóãòëâë·½ê½ ,²»òëâë
}
void display()
{
ns_s=ns/10;
ns_g=ns%10;
ew_s=ew/10;
ew_g=ew%10;
max7219(dig0,table[ns_s]);
max7219(dig1,table[ns_g]);
max7219(dig2,table[ew_s]);
max7219(dig3,table[ew_g]);
}
void t0_(void)interrupt 1
{
temp++;
th0=0xd8;
tl0=0xf0;
if(temp==100)
{
temp=0;
ns--;
ew--;
if((ns==0)&&(ew==5)&&(i==0))
{
ns=5;
ew=5;
i=1;
}
if((ns==0)&&(ew==0)&&(i==1))
{
ns=25;
ew=20;
i=2;
}
if((ns==5)&&(ew==0)&&(i==2))
{
ns=5;
ew=5;
i=3;
}
if((ns==0)&&(ew==0)&&(i==3))
{
ns=20;
ew=25;
i=4;
}
}
display();
}
void main()
{
t0_init();
max7219_init();
ea=1;
ns=20;
ew=25;
while (1)
{
uint k;
display();
switch(i)
{
case 0:
r2=0;
g1=0;
break;
case 1:
g1=1;
y1=0;
for(k=0;k<3;k++)
{
y1=~y1;
delay(10000);
}
break;
case 2:
g2=0;
r2=1;
r1=0;
y1=1;
break;
case 3:
g2=1;
y2=0;
for(k=0;k<3;k++)
{
y2=~y2;
delay(10000);
}
break;
case 4:
i=0;
r1=1;
break;
}
}
}
5 仿真测试
5.1软件调试
整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序进行分别调试。
(1)keil软件中生成hex文件如图所示::
图5-1生成相应程序hex的图
(2)将keil程序下生成的文件导入at89c51中,如图所示:
图5-2导入文件图
5.2仿真调试
在keil中调试完成后,生成文件,再到proteus中进行仿真。首先在proteus中需要的元件依次找出来,根据电路所需要实现的功能画好电路原理图,当检查电路完全没有错误后,双击芯片,再将在keil中生成的hex文件导入芯片,接着点击play键开始进行电路仿真。其中,此次的交通灯整个中循环共有四个工作状态。
5.1.1
5.2.1所需软件查询展示
图5-3所需元件展示图
5.2.2四种状态展示
(1)状态一:点击play键,电路开始进行仿真,此时红绿灯显示的情况为:东西方向为绿灯亮,南北方向为红灯亮,即东西方向通行,南北方向禁止通行,大东西方向通行时间为20秒,南北禁止通行时间为25秒,交通灯显示状态如图所示。
图5-4状态一
(2)状态二:在开始仿真经过20秒后,黄灯开始闪烁,闪烁时间为5秒,红绿灯的状态将发生变化,即东西方向黄灯闪烁,显示情况如图所示。
图5-5状态二
(3)状态三:此时红绿灯显示的情况为:东西方向为红灯亮,南北方向为绿灯亮,即东西方向禁止通行,南北方向通行,东西方向禁止通行时间为25秒,南北通行时间为20秒,交通灯显示状态如图所示。
图5-6状态三
(4)状态四:经过20秒后,黄灯开始闪烁,闪烁时间为5秒,红绿灯的状态将发生变化,即南北方向黄灯闪烁,显示情况如图所示。
图5-7状态四
5.3结果分析
本次交通信号灯设计基本满足了所需要的要求,保证了行人和车辆可以顺利通过,避免出现拥挤、堵车等现象,但设计也有不足,由于程序设计较为简便,无法对具体的的路况进行适时地调整,无法通过对当前道路的状况进行智能化调节,比如;早高峰和晚高峰期间的人流和车辆较多,可以适当增加绿灯时间,减少红灯时间,以此来减少道路拥挤。而中午和夜间人流量相对较少,可以仅闪烁黄灯来进行提示。

墙壁开关什么牌子好
华为麒麟5G芯片量很大,华为Mate60上架
iPhone 12和华为Mate40已经发布,骁龙875的安卓机还远吗?
ARRAY of DB_ANY中参数实例的使用示例
两会车企代表谈汽车芯片短缺
怎么设计一个基于单片机的交通灯控制系统?
以价格为导向,高性价比Mini LED背光技术介绍
固定频率工作的降压稳压器设计
安兔兔表示:在数以万机的安兔兔手机用户中高端手机的用户占比颇高
品牌选择是重头戏 智能家居要重视生活理念的传递
荣耀9什么时候上市?荣耀9最新消息:真的配置强悍,价格还便宜嘛
5G的到来,将引领人工智能时代变革
擦伤?刮伤?那就在伤口上重新打印皮肤组织吧
TCO的历史
康佳艺术电视A2评测 高端时尚而又富有个性化
苹果iOS10.3,APFS文件系统,16G版本的福星
蓝牙耳机什么牌子好,2019必入的五款蓝牙耳机
LTE互联互通测试的成功实现
多晶硅生产流程是什么_单晶硅与多晶硅的区别
单晶多晶组件CTM差异性,你知道吗?