题 目: 基于单片机的智能交通灯的设计
学 院 机电与信息工程学院 专 业 电子信息工程 年 级 2015级 学 号
姓 名 张晋笙、张榜 指 导 教 师 邓凌云 成 绩
2017年 12 月 27 日
摘要
随着社会主义的建设,城市的规模在不断扩大,城市的交通也在不断的提高和改进,交通的顺畅已经成为制约社会主义建设的一个重要因素。本系统采用单片机AT89S52来设计交通灯控制器,实现了能根据实际车流量通过AT89S52芯片的P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示。本系统实用性强、操作简单、扩展功能强。 关键词: AT89S52单片机;交通灯;倒计时;时间显示
Abstract
With the construction of socialism, the city scale in expanding constantly, urban traffic is also in constant improvement and improvement, traffic flow restriction of socialist construction has become one of the important factors. The system USES the monolithic integrated circuit ATAT89S52 to design and realize the traffic light controller can according to actual traffic through the mouth AT89S52 chip set red, green P1 burning time function; Traffic lights circulation lighted, with 5 seconds countdown yellow lights flashing warning. This system is practical, simple operation and function expansion is strong.
Keywords: AT89S52 microcontroller, Traffic lights, The countdown, Time display
目录
第一章 绪 论----------------------------------------------5 1.1背景----------------------------------------------- 5 1.2单片机概述 ----------------------------------------5 1.3 目的与意------------------------------------------5 1.4方案的设计与论证-----------------------------------6 第二章 总体设计---------------------------------------- 6 2.1总体设计-------------------------------------------6 2.2 单片机的选择-------------------------------------- 7
第三章 硬件设计 ----------------------------------------9 3.1 最小系统------------------------------------------9 3.2 按键电路-----------------------------------------10 3.3 显示模块电路设计---------------------------------10 3.4 pcb图-------------------------------------------11 第四章 交通信号灯控制系统的设计(软件设计)--------------12
4.1 十字路口交通信号灯具体的控制要求------------------12 4.2十字路口交通信号灯示意图---------------------------12 4.3 软件设计应用环境--------------------------------- 13 4.4 软件设计流程------------------------------------- 14 4.5 程序分段作用解释----------------------------------16 4.6 仿真----------------------------------------------16 第五章 参考文献-------------------------------------- 17 附件一:总体原理图 -----------------------------------18
第一章 绪论
1. 1背景
随着城市机动车量的不断增加,许多大城市出现了交通超负荷运行的情况,因此,自80年代后期,这些城市纷纷修建城市高速道路,在高速道路建设完成的初期,它们也曾有效地改善了交通状况。然而,随着交通量的快速增长和缺乏对高澎路的系统研究和控制,高速道路没有充分发挥出预期的作用。而城市高速道路在构造上的特点,也决定了城市高速道路的交通状况必然受高速道路与普通道路藕合处交通状况的制约。所以,如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市高速道路,缓解主干道车流量繁忙的交通拥堵状况,越来越成为交通运输管理和城市规划部门待解决的主要问题。
1.2单片机的概述
计算机系统的发展已明显地朝三个方向发展;这三个方向就是:巨型化,单片化,网络化。以解决复杂系统计算和高速数据处理的仍然是巨型机在起作用,故而,巨型机在目前在朝高速及处理能力的方向努力。单片机在出现时,Intel公司就给其单片机取名为嵌入式微控制器(embedded microcontroller)。单片机的最明显的优势,就是可以嵌入到各种仪器、设备中。这一点是巨型机和网络不可能做到的
单片机在目前的发展形势下,表现出几大趋势:
(1)可靠性及应用越来越水平高和互联网连接已是一种明显的走向。 (2)所集成的部件越来越多;NS(美国国家半导体)公司的单片机已把语音、图象部件也集成到单片机中,也就是说,单片机的意义只是在于单片集成电路,而不在于其功能了;如果从功能上讲它可以讲是万用机。原因是其内部已集成上各种应用电路。
(3)功耗越来越低和模拟电路结合越来越多。
随着半导体工艺技术的发展及系统设计水平的提高,单片机还会不断产生新的变化和进步,最终人们可能发现:单片机与微机系统之间的距离越来越小,甚至难以辨认。
1.3目的与意义
本设计以单片机为核心,以LED数码管作为倒计时指示,根据设计的要求我们考虑了各功能模块的几种设计方案,以求最佳方案,实现实时显示系统各种状态,系统还增设了根据交通拥挤情况可分别设置主干道和次干道的通行时间,以提高效率,缓减交通拥挤。系统总体设计框图如图所示。
交通灯控制的框图如下图所示,主要有控制电路、按键电路、晶振电路、复位电路、显示电路、电源电路等电路组成。
1.4方案设计
1.采用单片机控制模块提供电源。该方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
2.完全采用数码管显示。这种方案优点是实现简单,可以完成倒计时功能。缺点是功能较少,只能显示有限的符号和数码字符。根据本设计的要求,采用此方案以实现系统的显示功能。
3.直接在I/O口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的端口资源还比较多。
第二章 总体设计
2.1 总体设计
本设计以单片机为控制核心,采用模块化设计,共分以下几个功能模块:单片机控制系统、键盘及状态显示、倒计时模块等。
单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。它由单片机振荡电路、复位电路等组成。
系统采用双数码管倒计时计数功能,最大显示数字99。 灵活的控制方式、优化的物理结构是本设计的亮点。 延时函数延时函数 时钟电路 复位电路 Led控制电路 按键电路 主程函数 电源电路 单片机 数码管显示电路 定时器中断服务程序 独立按键程序 数码管选位函数 数码管显示函数 交通灯处理函数交通 东西开通时间南北开通时间函数 函数 设置函数 图2-1.总体设计框图 2.2单片机的选择 单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强I/O功能及较好的结构兼容性方向发展。其发展趋势不外乎以下几个方面:
1、多功能
单片机中尽可能地把所需要的存储器和I/O口都集成在一块芯片上,
使得单片机可以实现更多的功能。比如A/D、PWM、PCA(可编程计数器阵列)、WDT(监视定时器---看家狗)、高速I/O口及计数器的捕获/比较逻辑等。
有的单片机针对某一个应用领域,集成了相关的控制设备,以减少应用系统的芯片数量。例如,有的芯片以51内核为核心,集成了USB控制器、SMART CARD接口、MP3解码器、CAN或者I*I*C总线控制器等,LED、LCD或VFD显示驱动器也开始集成在8位单片机中。
2、高效率和高性能
为了提高执行速度和执行效率,单片机开始使用RISC、流水线和DS
P的设计技术,使单片机的性能有了明显的提高,表现为:单片机的时钟频率得到提高;同样频率的单片机运行效率也有了很大的提升;由于集成度的提高,单片机的寻址能力、片内ROM(FLASH)和RAM的容量都突破了以往的数量和限制。
由于系统资源和系统复杂程度的增加,开始使用高级语言(如C语言)来开发单片机的程序。使用高级语言可以降低开发 难度,缩短开发周期,增强软件的可读性和可移植性,便于改进和扩充功能。
3、低电压和低功耗
单片机的嵌入式应用决定了低电压和低功耗的特性十分重要。由于C
MOS等工艺的大量采用,很多单片机可以在更低的电压下工作(1.2V或0.9V),功耗已经降低到uA级。这些特性使得单片机系统可以在更小电源的支持下工作更长的时间。
4、低价格
单片机应用面广,使用数量大,带来的直接好处就是成本的降低。目
前世界各大公司为了提高竞争力,在提高单片机性能的同时,十分注意降低其产品的价格。
下面大致介绍一下单片机的主要应用领域和特点。 (1)家用电器领域
用单片机控制系统取代传统的模拟和数字控制电路,使家用电器(如洗衣机、空调、冰箱、微波炉、和电视机等)功能更完善,更加智能化和易于使用。
(2)办公自动化领域
单片机作为嵌入式系统广泛应用于现代办公设备,如计算机的键盘、磁盘驱动、打印机、复印机、电话机和传真机等。
第三章 硬件设计
3.1 最小系统
图3-1.最小系统电路图
最小系统的作用:单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.
对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路.
分四个部分:
1.晶振,至于大小由你单片机时钟周期要求而决定(用于计时,与两个电容并联使用,电容大小由你的晶振决定,一般用22pF)
2.复位电路(用于复位)
3.电源(用于供电,一般用电脑的USB口供电)
4.烧制程序的口(可用串口配合MAX232配合使用,也可以做个并口输入,这个要根据你使用单片机的种类决定,比如ATC可用并口,STC一般只用串口输入等等
3.2 按键电路
图3-2.按键电路图
说明:
按键电路的作用是用于调节红路灯的延长时间和延长模式。
3.3 显示模块电路设计
该模块由共阳LED数码管组成,利用数码管的动态扫描原理,由三极管进
行锁存,当控制数码管的IO口P20和P21为低电平时(及三极管基极为低电平),则三极管导通,VCC通三极管给数码管供电,则数码管被点亮,利用数码管点亮的余辉和人眼的视觉暂留原理,则看起来数码管是同时被点亮的。 图3-3.显示模块
从设计完成的任务与要求来看,显示通行时间必须用二位数码管,从节省硬件资源的角度考虑,可采用扫描的方式来处理,对于7段数码管,占用7个单片机的I/O口,另外设置2个电子开关对2位显示进行配合,占用2个I/O端口,十字路口共需4组红绿灯,加上转换黄灯,一共是12只灯,须用12个端口进行控制,加上两个方向的紧急通行按钮,占2个I/O端口和一个蜂鸣器端口,因此实际占用的单片机I/O口为24个,为此,我们可以选用51系列单片机中的ATAT89S52来作为中央处理器。这款单片机的I/O口作为输出时,具有较大的吸收电流能力,因此我们可以选用共阳型数码管,这样由单片机的I/O口就可以直接驱动,能简化硬件电路的设计。
3.4 pcb图
图 3-4 PCB原理图
第四章 交通信号灯控制系统的设计(软件设计)
4.1 十字路口交通信号灯具体的控制要求
(1) 交通信号灯分布于东南西北,每个路口均有三个。南北方向绿灯和东西方向的绿灯不能同时亮;如果同时亮,则应自动立即关闭信号灯系统,并立即发出报警信号。系统工作后,首先南北红灯亮并维持30s;与此同时,东西绿灯亮,并维持25s时间,到25s时,东西绿灯熄灭。在东西绿灯熄灭时,东西黄灯亮并维持5s,然后东西黄灯熄灭,东西红灯亮,同时南北红灯熄灭,南北绿灯亮;东西红灯亮并维持30s;与此同时,南北绿灯亮并维持15s;然后,南北绿灯熄灭南北绿灯熄灭时,南北黄灯亮维持5s后熄灭;同时南北红灯亮,东西绿灯亮。至此,结束一个工作循环,如下交通信号灯变化表:
交通信号灯变化表 绿灯亮 东西 25S 5S 20S 黄灯亮 红灯亮 红灯亮 南北 30S 绿灯亮 15S 黄灯亮 5S 表 4-1 信号灯变化时间 (2)在交通信号灯亮和闪烁的同时,路口设有两位七段码的显示器倒数计时,让车辆行人能够清楚地知道再过多久信号灯就会发生变化。以便于司机和行人能够在有限的时间内准确的通行。 4.2十字路口交通信号灯示意图
交通信号灯共有12盏,每个路口各有红,黄,绿三盏,具体分布如下图所示:
图 4-2 交通灯示意图 4.3 软件设计应用环境
本设计软件的设计是在Keil C51的环境下编译的。Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。C语言有以下特点:
1、语言简洁、紧凑、使用方便、灵活。C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示,压缩了一切不必要的成分。
2、运算符丰富。C的运算符包含的范围很广泛,共有34种运算符,使得C的运算类型极其丰富,表达式类型多样化,灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。
3、数据结构丰富,具有现代化语言的各种数据结构,能用来实现各种复杂的数据结构的运算。
4、具有结构化的控制语句,用函数作为程序的模块单位,便于实现程序的模块化。
5、语法限制不太严格,程序设计自由度大。
6、C语言能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此,C既具有高级语言的功能,又具有低级语言的许多功能,可用来写系统软件。C语言的这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言。
7、生成目标代码质量高,程序执行效率高。
8、用C语言写的程序可移植性好。基本上不用修改就能用于各种型号的计算机和各种操作系统。
对操作系统和系统实用程序以及需要对硬件进行操作的场合,用C语言明显地优势于其他高级语言,有的大型应用软件也用C语言来编写。
4.4 软件设计流程
软件总体设计主要完成各部分的软件控制和协调。本系统主程序模块主要完成的工作是对系统的初始化,发送显示数据,同时对键盘进行扫描,等待外部中断,以及根据所需要的功能进行相应的操作。
交通灯根据其显示情况可以分为四个状态,可以通过定时来控制每个状态的时间;通过定时也可以向LED数码管中每隔1秒送一个数,显示该状态剩余的时间。其流程图如图所示。
开 始 设置定时,显示初始化 南北绿灯亮,东西红灯亮,延时 南北黄灯闪烁,东西红灯亮,延时 南北红灯亮,东西绿灯亮,延时 南北红灯亮,东西黄灯闪烁,延时 图4-4-1 软件流程图
图4-4-2 运行状态图
4.4.1交通灯定时器模块
AT89S52单片机内部有3个定时器T0,T1和T2,本次设计中使用T0工作在方式1,即16位定时器,定时50ms,20次中断产生秒信号,从而控制红绿灯的点亮时间。
工作方式寄存器TMOD用来设置T0、T1的工作方式。这次实习中设置TMOD=0x01,即T0工作于方式0(16位定时器)。
内部定时器/计数器用作定时器时,是对机器周期计数,每个机器周期的长度是12个振荡周期。定时常数的设置可用一下方式计算:
机器周期=12/12MHz=1us
(65536-定时常数)*1.0us=50ms
所以定时常数是50000。
4.5 总原理图
图4-5 总原理图 4.6 仿真
图 4-6 仿真
第五章 参考文献
[1] 刘勇.数字电路[M].电子工业出版社.2004
[2] 杨子文.单片机原理及应用[M].西安电子科技大学出版社.2006 [3] 刘华东.单片机原理与应用(第2版)[M].电子工业出版社.2006.8 [4] 胡汉才.单片机原理及其接口技术[M].清华大学出版社,2006.
[5] 沈精虎.电路设计与制版Protel99入门与提高[M].人民邮电出版社,2004. [6] 范风强,兰婵丽.单片机语言C51应用实战集锦[M].电子工业出版社.,2001. [7] 顾曙敏.单片机与串行时钟DS1307的接口设计[J].现代电子技术,2003,26(14)85-87.
[8] 孙晓燕.基于8051单片机的交通灯控制系统设计与模拟[J].南宁职业技术学院学报,2007年03期.
[9] 陈毅,许飞,王学飞.基于单片机的交通灯智能控制系统[J].中国高新技术企业,2009年第15期.
附录一:程序
#include #define uchar unsigned char //宏定义\"uchar\"代替\"unsigned char\"。 #define uint unsigned int //宏定义\"uint\"用来定义无符号整型数。 #include uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, 0xff}; //数码管段选定义 0 1 2 3 4 5 6 7 8 9 A B C D E F 不显示 //断码 uchar dis_smg[8] = {0}; uchar smg_i = 4; //显示数码管的个位数 //数码管位选定义 sbit smg_we1 = P2^0; //数码管位选定义 sbit smg_we2 = P2^1; sbit smg_we3 = P3^6; sbit smg_we4 = P3^7; char dx_s = 0,nb_s = 0; //东西 南北 倒计时变量 sbit dx_red = P2^7; //东西红灯 sbit dx_green = P2^6; //东西绿灯 sbit dx_yellow = P2^5; //东西黄灯 sbit nb_red = P2^4; //南北红灯 sbit nb_green = P2^3; //南北绿灯 sbit nb_yellow = P2^2; //南北黄灯 uchar flag_jtd_mode; //交通灯的模式 根据时间 bit flag_1s = 0; bit flag_500ms; bit flag_dx_nb = 0; //东西南北模式 uchar flag_5m_value; uchar i; uchar flag_alarm; //模式 uchar dx_time = 30,nb_time = 20; //东西、南北的时间 uchar flag_jdgz ; //交通管制 void smg_we_switch(uchar i) { switch(i) { case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 } } void delay_1ms(uint q) { uint i,j; for(i=0;i void display() { uchar i; for(i=0;i void time0_init() { EA = 1; //开总中断 TMOD = 0X11; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 } void jiaotongdeng_dis() { = 1; break; = 1; break; = 1; break; = 0; break; if(flag_1s == 1) { flag_1s = 0; if(flag_dx_nb == 0) //南北时间 { dx_s --; nb_s --; if(dx_s == 5) nb_s = 5; } if(flag_dx_nb == 1) //东西时间 { dx_s --; nb_s --; if(nb_s == 5) dx_s = 5; } if(dx_s < 0) { flag_dx_nb = ~flag_dx_nb; if(flag_dx_nb == 1) { dx_s = dx_time; //东西时间 nb_s = dx_time + 5; } else { dx_s = nb_time + 5; nb_s = nb_time; //南北时间 } } } dis_smg[0] = smg_du[dx_s % 10] ; dis_smg[1] = smg_du[dx_s / 10] ; dis_smg[2] = smg_du[nb_s % 10] ; dis_smg[3] = smg_du[nb_s / 10] ; if(flag_dx_nb == 0) { if(dx_s > 5) { dx_red = 0; //亮 dx_green = 1; //灭 dx_yellow = 1; //灭 nb_red = 1; //灭 nb_green = 0; //亮 nb_yellow = 1; //灭 flag_5m_value = 0; }else if(dx_s <= 5) //当小于5秒时 黄灯要闪了 { dx_red = 0; //灭 dx_green = 1; //灭 dx_yellow = 1; //灭 nb_red = 1; //灭 nb_green = 1; //灭 if(flag_500ms == 0) //黄灯闪烁 { nb_yellow = 0; //亮 } else { nb_yellow = 1; //灭 } } } if(flag_dx_nb == 1) { if(nb_s > 5) { dx_red = 1; //灭 dx_green = 0; //亮 dx_yellow = 1; //灭 nb_red = 0; //亮 nb_green = 1; //灭 nb_yellow = 1; //灭 flag_5m_value = 0; }else if(nb_s <= 5) //当小于5秒时 { dx_red = 1; //灭 dx_green = 1; //灭 nb_red = 0; //亮 nb_green = 1; //灭 nb_yellow = 1; //灭 if(flag_500ms == 0) { dx_yellow = 0;//亮 } else { 黄灯要闪了 dx_yellow = 1;//灭 } } } } uchar key_can; //按键值 void key() //独立按键程序 { static uchar key_new; key_can = 20; //按键值还原 P1 |= 0x1f; if((P1 & 0x1f) != 0x1f) //按键按下 { delay_1ms(1); //按键消抖动 if(((P1 & 0x1f) != 0x1f) && (key_new == 1)) { //确认是按键按下 key_new = 0; switch(P1 & 0x1f) { case 0x1e: key_can = 4; break; //得到按键值 case 0x1d: key_can = 3; break; //得到按键值 case 0x1b: key_can = 2; break; //得到按键值 case 0x16: key_can = 1; break; //得到按键值 } } } else key_new = 1; } uchar menu_1,flag_s; void key_with() { if(key_can == 4) //交通管制按键 { flag_jdgz ++; if(flag_jdgz > 5) flag_jdgz = 0; if(flag_jdgz == 1) // 全部亮红灯 { dx_red = 0; //亮 dx_green = 1; //灭 dx_yellow = 1; //灭 nb_red = 0; //亮 nb_green = 1; //灭 nb_yellow = 1; //灭 } if(flag_jdgz == 2) // 东西红灯 南北绿灯 { dx_red = 0; //亮 dx_green = 1; //灭 dx_yellow = 1; //灭 nb_red = 1; //灭 nb_green = 0; //亮 nb_yellow = 1; //灭 } if(flag_jdgz == 3) // 南北红灯 { dx_red = 1; //灭 dx_green = 0; //亮 dx_yellow = 1; //灭 nb_red = 0; //亮 nb_green = 1; //灭 nb_yellow = 1; //灭 } if(flag_jdgz == 4) // 南北绿灯 { dx_red = 1; //灭 dx_green = 0; //亮 dx_yellow = 1; //灭 nb_red = 1; //灭 nb_green = 0; //亮 nb_yellow = 1; //灭 } if(flag_jdgz == 5) // 南北黄灯 { dx_red = 1; //灭 dx_green = 1; //灭 dx_yellow = 0; //亮 nb_red = 1; //灭 nb_green = 1; //灭 nb_yellow = 0; //亮 } } if(key_can == 1) //设置键 { menu_1 ++; if(menu_1 >= 2) { 东西绿灯 东西绿灯 东西黄灯 menu_1 = 0; } } if(menu_1 == 1) //设置东西的时间 { if(key_can == 2) { dx_time ++ ; //加1 if(dx_time > 99) dx_time = 99; } if(key_can == 3) { dx_time -- ; //减1 if(dx_time <= 5) dx_time = 5; } dis_smg[0] = smg_du[10] ; //显示为A dis_smg[1] = smg_du[10] ; //显示为A dis_smg[2] = smg_du[dx_time % 10] ; dis_smg[3] = smg_du[dx_time / 10] ; } if(menu_1 == 2) //设置南北的时间 { if(key_can == 2) { nb_time ++ ; //加1 if(nb_time > 99) nb_time = 99; } if(key_can == 3) { nb_time -- ; //减1 if(nb_time <= 5) nb_time = 5; } dis_smg[0] = smg_du[11] ; //显示为B dis_smg[1] = smg_du[11] ; //显示为B dis_smg[2] = smg_du[nb_time % 10] ; dis_smg[3] = smg_du[nb_time / 10] ; } } void main() { //显示东西设置的时候//显示东西设置的时候 time0_init(); while(1) { key(); if(key_can < 20) key_with(); if((menu_1 == 0)) jiaotongdeng_dis(); display(); } } void time0_int() interrupt 1 { static uchar value; //定时10ms中断一次 TH0 = 0x3c; TL0 = 0xb0; //50ms value ++; flag_5m_value++; if(flag_5m_value % 10 == 0) flag_500ms = ~flag_500ms; if(value >= 20) { value = 0; flag_1s = 1; } } 因篇幅问题不能全部显示,请点此查看更多更全内容for(j=0;j<110;j++); }