基于有原理图和pcb图的 AT89S52单片机交通灯控制系统的设计Word格式.docx
《基于有原理图和pcb图的 AT89S52单片机交通灯控制系统的设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于有原理图和pcb图的 AT89S52单片机交通灯控制系统的设计Word格式.docx(30页珍藏版)》请在冰豆网上搜索。
八、结论与心得……………………………………………………………………13
九、参考文献………………………………………………………………………14
十、致谢……………………………………………………………………………14
十一、程序清单……………………………………………………………………14
摘要:
近年来随着科技的飞速发展,单片机的应用正在不地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
本系统采用单片机AT89S52为中心器件来设计交通灯控制器,系统实用性强、操作简单、扩展性强。
关键词:
1、单片机最小系统。
2、红、黄、绿LED交通灯。
3、紧急通车开关。
一、设计任务与要求
用AT89S52单片机控制一个交通信号灯系统,晶振采用12MHZ。
设A车道与B车道交叉组成十字路口,A是主道,B是支道。
设计要求如下:
用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号。
正常情况下,A、B两车道轮流放行,A车道放行50s,其中5s用于警告;
B车道放行30s,其中5s用于警告。
交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。
在B车道放行期间,若A车道有车而B车道无车,按下开关K1使A车道放行15s;
在A车道放行期间,若B车道有车而A车道无车,按下开关K1使B车道放行15s。
有紧急车辆通过时,按下K2开关使A、B车道均为红灯,禁行20s。
二、方案设计与论证
方案一:
交通控制系统主要控制A、B两车道的交通,以AT89S52单片机为核心芯片,通过控制三色LED的亮灭来控制各车道的通行;
另外通过2个按键来模拟各车道有无车辆的情况和有紧急车辆的情况。
根据设计要求,制定总体设计思想如下:
1、正常情况下运行主程序,采用0.5S延时子程序的反复调用来实现各种定时时间。
2、一道有车而另一道无车时,采用外部中断1执行中断服务程序,并设置中断为低优先级中断。
3、有紧急车辆通过时,采用外部中断0执行中断服务程序,并设置中断为高优先级中断,实现二级中断嵌套。
该电路具有电路简单,设计方便,显示亮度高,耗电较少,也非常的可靠等点。
总体设计框图如图1所示:
图1系统整体设计方框图
方案二:
采用标准AT89S52单片机作为控制器;
通行倒计时显示采用3位数码管;
主、次通道及行人指示灯采用双色高亮发光二极管;
LED显示采用动态扫描,以节省端口。
紧急车辆通行采用实时中断完成,识别方法采用手动按钮。
按以上系统构架设计,单片机端口资源刚好满足要求。
该系统具有电路简单,设计方便,显示亮度高耗电少,可靠性高,但是占用单片机资源太多了。
整个电路组成框图如图2所示。
图2
方案三:
采用AT89C2051单片机作为控制器,通行倒计时、主、次车道及行人通行指示采用单块LCD液晶点阵显示器。
这种方案设计占用单片机的端口最少,硬件也最少,耗电也最少;
虽然显示图案也很精美,但由于亮度太暗,晚上还得必须开背光灯,所以较少采用。
通过以上综合分析可以看出,方案一具有综合设计优点,因此城市道口交通灯控制系统模型采用方案一设计。
三、硬件单元电路设计与参数计算
1、时钟电路模块
时钟电路由一个晶体振荡器12MHZ和两个30pF的瓷片电容组成。
时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。
单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信
号控制下严格地工作。
其电路如图3所示:
图3时钟电路模块
2、复位电路模块
复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。
本设计采用的是按键复位电路。
其电路如图4所示:
图4复位电路
3、主控制系统模块
主控制器采用AT89S52,是ATMEL公司生产的一款性能稳定的8位单片机。
AT89S52具有1个8KB的FLASH程序存储器,1个512字节的RAM,4个8位的双向可位寻址I/O端口,3个16位定时/计数器及1个串行口和6个向量二级中断结构。
单片机的P0口分别用于控制南北及东西的通行灯,P2口和P3^4-P3^7口用于4组4位LED计时器的控制,紧急车辆通行时使用外中断0(P3^2)和外中断1(P3^3),进行手动按键,即可转换。
其主控电路如图5所示:
图5主控制系统模块
4、交通灯输出控制模块
道口交通灯指示采用高亮度红、黄、绿发光二极管进行提示。
其图如图6所示
图6LED显示模块
当R=220欧时,按公式A=(5-1.8)/R计算,电路中的电流大小应为A=14.545mA.由于每个路口的通行双向指示处理相同,因此每个端口应具有3A的吸收电流能力。
5、时间显示电路模块
道口通行剩余时间采用高亮红色7段LED发光数码管显示,采用共阳数码管,如用单片机吸收电流驱动,列扫描驱动使用三极管,按每段6mA电流计算,全显示字形“8”时,每个数码需6mA*8=48mA,由于时间显示每个道口相同,共需要电流192mA,因此设计中也采用了中功率三极管8550.其显示电路如图7所示:
6、紧急通车电路模块
为了实现此功能,利用单片机中断达到目的。
利用一个手动按钮开关接至单片机外部中断0,同时在软件设计时将其设定为最高优先级,当其按下时,四方全为红灯,同时将中断位置的PSW、ACC进栈保护,当其计时完了之后,回到原来的位置进行执行。
再利用一个手动按钮接至单片机外部中断1当其按下时,如果是东西道是红灯,而南北道是绿灯,则将其置为东西是绿灯,南北是红灯;
如果是东西道是绿灯,而南北道是红灯,则将其置为东西是红灯,南北是绿灯。
两种情况都是执行完后,回到断点处继续执行。
其电路如图8所示:
图7数码管显示模块
图8按键控制电路
三、软件设计与流程图
1、软件的设计
主程序采用查询方式定时,调用0.5S延时子程序的次数,从而获取交通灯的各种时间。
子程序采用定时器1方式1查询式定时,定时器定时50ms,确定50ms循环20次,从而获得1S的延时时间。
有车车道的放行的中断服务程序首先要保护现场,因而需用到延时子程序,子程序采用定时器0方式1查询式定时,定时器定时50ms,确定50ms循环20次,从而获得1S的延时时间,保护现场时还需关中断,以防止高优先级中断(紧急车辆通过所产生的中断)出现导致程序混乱。
开中断,由软件查询外中断1,判别哪一道有车,再根据查询情况执行相应的服务。
待交通灯信号出现后,保持15S的延时,然后,关中断,恢复现场,再开中断返回主程序。
紧急车辆出现时的中断服务程序也需要保护现场,但无须关中断(因其为高优先级中断),然后执行相应的服务,待交通灯信号出现后延时20S,确保紧急车辆通过交叉路口,然后,恢复现场,返回主程序。
2、程序流程图
主程序有车车道放行时的中断服务程序(外中断1)
紧急情况时的中断服务程序(外中断0)
五、总原电路及元器件清单
1.总原理图如图9所示
图9总的原理图
2.PCB制板图如图10所示
图10PCB板
3.整体电路仿真图以及仿真结果分析
(1)、整体电路仿真图如图11所示
图11仿真图
(2)、仿真结果分析
上电或按键复位后数码管无显示,东西、南北的灯都为红灯亮;
开始工作后主车道绿灯亮次车道红灯亮50S,在这里选定它亮到5S时,主车道绿灯灭,黄灯亮;
5S后主车道变为红灯亮次车道绿灯亮30S,在这里选定它亮到5S时,次车道黄灯亮,5S后返回重新执行。
按紧急车辆按钮红灯全亮显示时间为20S;
有车车道放行按钮按下时,若主车道是绿灯、次车道是红灯,则把主车道变为红灯、次车道变为绿灯,显示15S;
若主车道是红灯、次车道是绿灯,则把主车道变为绿灯、次车道变为红灯,显示15S;
4、元件清单
如下表所示:
元件名称
型号
数量/个
用途
单片机
AT89S52
1
控制核心
晶振
12MHZ
晶振电路
电容
30pF
2
电解电容
10uF
复位电路
电阻
5.1K
发光二极管
LED
12
红、黄、绿灯
集成块
74LS08
按键电路
220Ω
13
LED限流
470Ω
8
数码管电路
电阻
1K
7
数码管驱动、按键电路
四位共阳数码管
GC-3461BS
显示电路
微动开关
3
三级管PNP
8550
4
数码管驱动电路
六、安装与调试
1.电路安装
打好板后,按照所画的PCB板,一一的把各个元件焊接到所制的板上即可。
2.电路调试
电路调试是利用开发系统、基本测试仪器(万用表、示波器等),检查系统硬件中存在的故障。
其调试可分为静态调试与动态调试两步进行。
静态调试是在系统未工作时的一种硬件检测。
第一步:
目测。
检查外部的各种元件或者是电路是否有断点。
第二步:
用万用表测试。
先用万用表复核目测中有疑问的连接点,再检测各种电源与地线之间是否有短路现象。
第三步:
加电检测。
给板加电,检测所有的插座或是器件的电源端是否符合要求的值。
第四步:
是联机检查。
因为只有用单片机开发系统才能完成对用户系统的调试。
动态调试
动态调试是在系统工作的情况下发现和排除系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。
动态调试的一般方法是由近及远、由分到合。
由分到合是指首先按逻辑功能将系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从系统中去掉,这样可以将故障范围限定在某个局部的电路上。
当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。
由分到合调试既告完成。
由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及的分层,然后分层调试。
调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。
3.软件调试
软件调试是通过对拥护程序的C编程、连接、执行发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
运行程序后,编辑,查看程序是否有逻辑的错误。
七、性能测试与分析
系统做好的,进行系统的完整调试。
按照所设计的流程图,用单片机跟踪模式程序进行调试,配合相关的硬件动作,可以观察LED的变化和数码管的显示是否正确。
同样明确延时时间长短、跳转位置及调用的程序功能。
经过观察各检测,我可以看到整个系统的功能都能达到我的设计要求。
八、结论与心得
以往每次做课程设计,都会感觉自己收获不少。
这次单片机课程设计也不例外。
做课程设计是为了让我们对平时学习的理论知识与实际操作相结合,在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加综合提高,学会将知识应用于实际的方法,提高和解决问题的能力。
第一,在编写软件中,在此过程中我更为熟练得掌握汇编语言各种指令的使用方法,掌握了keil软件的使用。
第二,在软件调试过程中,使我又一次复习了keil和proteus联合使用的方法。
在调试时曾经遇到数码管倒计时显示时间两位不能同时显示,后来经过查找资料不断调试才领悟到原来在显示的过程中要循环显示才能使得显示稳定下来。
第三,在做原理图和PCB的过程中,使我进一步掌握了proteus软件的使用方法。
再次熟悉了各种作图工具的应用,而且培养了我在设计原理图时的一些技巧和好的习惯。
第四,在做实物的过程中,培养了我认真耐心的工作态度。
我在做板子过程中,首先由于我的布线比较紧密加上孔和焊盘过小使得在打孔是出现刮断线以及在焊接的时候出现了虚焊和联焊等问题,后来我不得不重新再做一次板;
二是由于焊接前没检查断线问题,使得我的PCB在加载程序后只有灯亮,而数码管却不亮,后来经过我的仔细检查,原来是在给三级管供电的线有断,将其连接起来后,就能显示了,从而得以成功。
总之,通过这次课程设计,我掌握了用单片机设计交通灯的基体方法,增强了我寻找问题,解决问题的能力。
培养了我的设计思维,此次课程设计的成功不仅帮助我更好地掌握书本知识,尤其重要的是增强了我的自信,培养了我独立思考的能力。
但是此次设计不中之处是不能实现左右弯灯,不有人行道控制灯,不能进行流量控制。
九、参考文献
[1]《单片机基础》.李广弟、朱月秀、冷祖祁.北京航空航天大学出版社。
[2]华成英童诗白,《模拟电子技术基础(第四版)》,高等教育出版社。
[3]康华光,《电子技术基础数字部分(第五版)》,高等教育出版社。
[4]《51单片机C语言常用模块与综合系统设计实例精讲》.于永、戴佳、常江.电子工业出版社。
[5]《单片机课程设计指导》.杨居义.清华大学出版社。
[6]《零基础学单片机C语言程序设计》.赵建领、薛园国.机械工业出版社。
十、致谢
通过本次毕业设计,我在指导老师邹清平的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力,并对当前电子领域的研究状况和发展方向有了一定的了解,单片机领域这对我今后进一步学习电子方面的知识有极大的帮助。
另外,此次毕业设计还获得了我们同学的大力支持。
在此我忠心感谢邹清平以及各位同学的指导和支持。
在未来的工作和学习中,我将以更好的成绩来加报各位老师和同学。
十一、程序清单
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
#definetime50000
#defineon0
#defineoff1
sbitRED_ZHU=P0^0;
//南北红灯
sbitYELLOW_ZHU=P0^1;
//南北黄灯
sbitGREEN_ZHU=P0^2;
//南北绿灯
sbitRED_ZHI=P0^3;
//东西红灯
sbitYELLOW_ZHI=P0^4;
//东西黄灯
sbitGREEN_ZHI=P0^5;
//东西绿灯
sbitP23=P3^4;
sbitP22=P3^5;
//东西方向数码管位选
sbitP21=P3^6;
sbitP20=P3^7;
//南北方向数码管位选
sbitint0_key=P3^2;
sbitint1_key=P3^3;
voiddisplay1(uchar,uchar);
voiddisplay2(uchar,uchar);
voiddelayms(uintk);
uchartemp1,temp2,temp3,temp4,temp5,temp6;
/*===============倒计时=========================*/
ucharN=50,Y=45,Z=50,M=75,G=80,U=80;
ucharC50ms,t0;
ucharseg=1;
ucharflag=0,led_data_temp;
voidInitialT1(void)
{
TMOD=0x11;
//定时器0,1工作在方式1
TH1=(65536-time)/256;
//相当于(65536-time)/256;
TL1=(65536-time)%256;
//初值为time(50ms)
TR1=1;
//开定时器1中断
ET1=1;
//允许定时器1中断
ET0=1;
TH0=(65536-time)/256;
TL0=(65536-time)%256;
EX0=1;
//允许外部中断0
IE0=1;
//启动外部中断0
PX0=1;
EX1=1;
IE1=1;
EA=1;
//开总中断
}
voidint0(void)interrupt0//外中断0
{
flag=0;
led_data_temp=P0;
t0=20;
if(!
int0_key)
{
delayms(10);
if(!
int0_key)
{
while(!
int0_key);
TH0=(65536-time)/256;
TL0=(65536-time)%256;
TR1=0;
TR0=1;
EX0=0;
EX1=0;
C50ms=0;
}
}
voidint1(void)interrupt2//外部中断1
t0=15;
flag=1;
if(((RED_ZHU==0)&
&
(GREEN_ZHI==0))||((YELLOW_ZHI==0)&
(RED_ZHU==0)))
P0=0xff;
GREEN_ZHU=0;
RED_ZHI=0;
else//if((RED_ZHI==0)&
(GREEN_ZHU==0))
GREEN_ZHI=0;
RED_ZHU=0;
int1_key)
int1_key)
int1_key);
voidISRT0(void)interrupt1//定时器0中断服务子程序
{
temp1=N,temp2=Y,temp3=Z,temp4=M,temp5=G,temp6=U;
//重装初值time
YELLOW_ZHU=1;
//如果在黄5S时进行熄灭黄灯
YELLOW_ZHI=1;
flag)
P0=0xf6;
C50ms++;
if(C50ms>
19)
{
t0--;
C50ms=0;
if(t0==0)
P0=led_data_temp;
N=temp1,Y=temp2,Z=temp3,M=temp4,G=temp5,U=temp6;
TR0=0;
//禁止定时器1中断
TR1=1;
//开定时器1中
EX1=1;
//EX0=1;
C50ms=0;
return;
}
voidISRT1(void)interrupt3//定时器1中断服务子程序
N--;
M--;
Y--;
Z--;
G--;
U--;
/*=================延时=======================*/
voidDelay10uS(ucharsecond)
uinti;
while((second--)!
=0)
for(i=0;
i<
5;
i++)
{}