基于ATS单片机交通灯控制系统的设计.docx

上传人:b****5 文档编号:28848652 上传时间:2023-07-20 格式:DOCX 页数:25 大小:336.07KB
下载 相关 举报
基于ATS单片机交通灯控制系统的设计.docx_第1页
第1页 / 共25页
基于ATS单片机交通灯控制系统的设计.docx_第2页
第2页 / 共25页
基于ATS单片机交通灯控制系统的设计.docx_第3页
第3页 / 共25页
基于ATS单片机交通灯控制系统的设计.docx_第4页
第4页 / 共25页
基于ATS单片机交通灯控制系统的设计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

基于ATS单片机交通灯控制系统的设计.docx

《基于ATS单片机交通灯控制系统的设计.docx》由会员分享,可在线阅读,更多相关《基于ATS单片机交通灯控制系统的设计.docx(25页珍藏版)》请在冰豆网上搜索。

基于ATS单片机交通灯控制系统的设计.docx

基于ATS单片机交通灯控制系统的设计

一、设计任务与要求

用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)

中断响应

保护现场

A红灯、B红灯

延时20S

恢复现场

返回

五、总原电路及元器件清单

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

1

晶振电路

电容

30pF

2

晶振电路

电解电容

10uF

1

复位电路

电阻

5.1K

1

复位电路

发光二极管

LED

12

红、黄、绿灯

集成块

74LS08

1

按键电路

电阻

220Ω

13

LED限流

电阻

470Ω

8

数码管电路

电阻

1K

7

数码管驱动、按键电路

四位共阳数码管

GC-3461BS

1

显示电路

微动开关

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

#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。

led_data_temp=P0。

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))

{

P0=0xff。

GREEN_ZHI=0。

RED_ZHU=0。

}

if(!

int1_key)

{

delayms(10)。

if(!

int1_key)

{

while(!

int1_key)。

TH0=(65536-time)/256。

TL0=(65536-time)%256。

TR1=0。

TR0=1。

EX0=0。

EX1=0。

C50ms=0。

}

}

}

voidISRT0(void)interrupt1//定时器0中断服务子程序

{

temp1=N,temp2=Y,temp3=Z,temp4=M,temp5=G,temp6=U。

TH0=(65536-time)/256。

TL0=(65536-time)%256。

//重装初值time

YELLOW_ZHU=1。

//如果在黄5S时进行熄灭黄灯

YELLOW_ZHI=1。

if(!

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中断服务子程序

{

TH1=(65536-time)/256。

TL1=(65536-time)%256。

//重装初值time

C50ms++。

if(C50ms>19)

{

N--。

M--。

Y--。

Z--。

G--。

U--。

C50ms=0。

}

}

/*=================延时=======================*/

voidDelay10uS(ucharsecond)

{

uinti。

while((second--)!

=0)

{

for(i=0。

i<5。

i++)

{}

}

}

voiddelayms(uintk)

{

uinti,j。

for(i=0。

i

i++)

for(j=0。

j<120。

j++)。

}

/*==================数码管控制========================*/

ucharcodediscode[]=

{0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}。

//共阳数码管0-9代码

voiddisplay1(ucharnum1,ucharnum2)//控制南数码管显示

{

P2=discode[num1]。

P21=on。

Delay10uS(10)。

P21=off。

//低位

P2=discode[num2]。

P20=on。

Delay10uS(10)。

P20=off。

//高位

}

voiddisplay2(ucharnum3,ucharnum4)//控制东西数码管显示

{

P2=discode[num3]。

P23=on。

Delay10uS(10)。

P23=off。

//低位

P2=discode[num4]。

P22=on。

Delay10uS(10)。

P22=off。

//高位

}

/*===================主函数=================================*/

main()

{

/*=============初始状态:

东西南北都红灯==================*/

RED_ZHU=on。

RED_ZHI=on。

delayms(1000)。

RED_ZHU=off。

RED_ZHI=off。

InitialT1()。

while

(1)

{

//初始化计时器

/*=============状态1:

东西绿灯(45s)南北红灯(40s)==================*/

/*=============状态2:

东西黄灯(5s)南北红灯(5s)=================*/

RED_ZHI=on。

GREEN_ZHU=on。

while(N!

=0)

{

if(TR0==1)

{

display2(t0/10,t0%10)。

//当t0=20时东西、南北红灯(20s)

display1(t0/10,t0%10)。

//当t0=15时东西、南北红、绿灯交换点亮

}

else

{

if(N==5)

{

while(Z!

=0)

{

if(TR0==1)

{

display2(t0/10,t0%10)。

display1(t0/10,t0%10)。

}

else

{

display1(N/10,N%10)。

//东西黄灯(5s)

display2(Z/10,Z%10)。

//南北红灯(5s)

GREEN_ZHU=off。

YELLOW_ZHU=on。

}

}

}

else

{

display1(N/10,N%10)。

//东西绿灯(45s)

display2(Y/10,Y%10)。

//南北红灯(40s)

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1