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

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

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

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

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

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

交通灯控制系统

引言

随着社会的发展、科技的进步以及人们生活水平的逐步提高,一个以微电子技术、计算机技术和通信技术为先导的信息革命正在蓬勃发展。

计算机技术作为三者之一,怎样与实际应用更有效的结合并发挥其作用。

单片机作为计算机技术的一个分支,正在不断的应用到实际生活中,同时带动传统控制检测的更新。

在实时检测和自动控制的应用系统中,单片机往往是作为一个核心部件使用,针对具体应用对象的特点,配以其它器件来加以完善。

它实用性强,功能齐全,技术先进,使人们相信这是科技进步的成果。

它更让人类懂得,数字时代的发展将改变人类的生活,将加快科学技术的发展。

十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。

那么靠什么来实现交通的井然秩序呢?

靠的是交通信号灯的自动指挥系统,来实现交通的井然有序。

交通信号灯控制方式很多。

本系统采用AT89C52单片机,以及其它芯片来设计交通灯控制。

实现了通过AT89C52芯片设置红灯、绿灯、黄灯点亮、交通灯倒计时显示的功能,通过AT89C52芯片的串行口与上位机的通信来实现对单片机交通灯系统的监视与控制。

交通灯的点亮采用发光二极管实现,时间的显示采用七段数码管实现。

单片机系统采用的直流供电。

系统实用性强、操作简单、扩展性好。

 

目录

一、设计任务:

……………………………………………………………………………3

 

二、题目分析:

……………………………………………………………………………3

 

三、实现方案与模块划分:

………………………………………………………………4

 

四、程序设计与仿真分析:

………………………………………………………………5

 

五、心得体会:

……………………………………………………………………………22

 

六、参考文献:

……………………………………………………………………………23

 

七、附录:

…………………………………………………………………………………24

一、设计任务

基本要求:

有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为南北向,支干道为东西向。

为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号灯。

(1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行50s,支干道每次放行30s。

每次由绿灯变为红灯的过程中,黄灯亮5s作为过渡。

(2)能实现正常的倒计时显示功能。

设计并实现一个多路口的交通灯集中监控管理系统,能在主控计算机集中查看和设定各路口交通灯控制模式和状态。

发挥:

操作权限管理,操作日志记录和查询,异常事件记录与查询,多路口分组预置与快速切换,基于WEB的远程监控….

二、题目分析与整体构思

如下图所示:

每90秒的第1-50秒,主干道亮绿灯、支干道亮红灯,数码管显示当前干道所亮交通灯(红灯、黄灯或绿灯)可以维持亮的秒数,此阶段主干道的数码管显示的数从50-01每隔一秒变一次,支干道的数码管显示的数从55-06每隔一秒变一次;每90秒的第51-55秒,主干道亮黄灯、支干道亮红灯,此阶段主干道的数码管显示的数从05-01每隔一秒变一次,支干道的数码管显示的数从05-01每隔一秒变一次;每90秒的56-85秒,主干道亮红灯、支干道亮绿灯,此阶段主干道的数码管显示的数从35-06每隔一秒变一次,支干道的数码管显示的数从30-01每隔一秒变一次;每90秒的后86-90秒,主干道亮红灯、支干道亮黄灯,此阶段主干道的数码管显示的数从05-01每隔一秒变一次,支干道的数码管显示的数从05-01每隔一秒变一次。

每当数码管显示的数或交通灯亮的LED改变时用单片机的串行口采取适当的协议将改变后的数据传至上位机,让上位机实时显示当前单片机交通灯控制系统的状态;每当用户通过上位机意图改变当前交通灯的状态时,将改变后的数据采取适当的协议后通过串行口发送给单片机,让单片机进入串行口中断修改当前数据至目标值。

三、实现方案与模块划分

可以用6个基本模块来实现该交通灯控制系统的功能,包括:

Timer00.01s定时模块、LED显示模块、数码管显示模块、串口发送模块、串口接收模块以及上位机模块。

1.Timer00.01s定时模块

Timer00.01s定时模块让定时器0每0.01秒进一次定时器0中断,当A路口或B路口达到100次0.01秒(即A路口或B路口到下一秒)时,通知相应路口更改LED以及数码管的状态。

2.LED显示模块

LED显示模块负责根据当前路口处于周期的位置来给定当前主干道、支干道应该各亮什么灯

3.数码管显示模块

数码管显示模块负责根据当前路口处于周期的位置来让A、B路口的主干道、支干道显示相应的倒计时数。

4.串口发送模块

串口发送模块负责采用合适的协议将A、B路口的数码管显示的数或交通所灯亮的LED的种类发送给上位机

5.串口接收模块

串口接收模块负责将串口收到的来着上位机的数据付给相应变量来改变数码管显示的倒计时数以及交通所灯亮的LED的种类达目标状态。

6.上位机模块

上位机模块负责对单片机交通灯控制系统进行监控、对用户进行权限管理以及对操作日志进行记录与管理。

四、程序设计与仿真分析

我负责的是串口发送模块以及上位机模块。

串口发送模块:

#include

unsignedcharlight_A,light_B;//分别表示A、B路口交通灯状态(1:

绿、红;2:

黄、红;3:

红、绿;4:

红、黄)

unsignedcharno_A_main,no_A_sub,no_B_main,no_B_sub;//用于计算当前数码管该显示的值得中间变量

unsignedchartime_A,time_B;//分别用来表示A、B路口当前处于周期的那个状态

voidinit()

{

TMOD|=0x20;

TH1=0xF3;//波特率4800效验位无

TL1=0xF3;

PCON|=0x80;

REN=1;

SM0=0;

SM1=1;

light_A=1;

light_B=3;

no_A_main=51;

no_A_sub=56;

no_B_main=91;

no_B_sub=86;

time_A=1;

time_B=56;

}

voidmain()

{

init();

while

(1)

{

EA=1;

ES=1;

TR1=1;

ES=0;

REN=0;

SBUF=0x00;//校验

while(!

TI);

TI=0;

SBUF=light_A;

while(!

TI);

TI=0;

SBUF=light_B;

while(!

TI);

TI=0;

SBUF=no_A_main-time_A;

while(!

TI);

TI=0;

SBUF=no_A_sub-time_A;

while(!

TI);

TI=0;

SBUF=no_B_main-time_B;

while(!

TI);

TI=0;

SBUF=no_B_sub-time_B;

while(!

TI);

TI=0;

ES=1;

REN=1;

}

}

上位机模块:

Module1.base

ptionExplicit

PublicLoginSucceededAsInteger

Frmlogin.frm

控件:

代码:

PrivateSubcmdCancel_Click()

'以查看者身份登录

LoginSucceeded=0

Me.Hide

Form1.Show

EndSub

PrivateSubcmdOK_Click()

'检查正确的密码

IftxtPassword="123"Then

LoginSucceeded=1

Open"record.txt"ForAppendAs#1'打开输出文件。

Print#1,Now;"管理员密码正确"

Close#1

Me.Hide

Form1.Show

ElseIftxtPassword="456"Then

LoginSucceeded=2

Open"record.txt"ForAppendAs#1'打开输出文件。

Print#1,Now;"高级管理员密码正确"

Close#1

Me.Hide

Form1.Show

Else

MsgBox"无效的密码,请重试!

",,"登录"

Open"record.txt"ForAppendAs#1'打开输出文件。

Print#1,Now;"密码错误"

Close#1

txtPassword.SetFocus

SendKeys"{Home}+{End}"

EndIf

EndSub

PrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)

Open"record.txt"ForAppendAs#1'打开输出文件。

Print#1,Now;"退出登陆"

Close#1

End

EndSub

 

Form1.frm

控件:

代码

PrivateSubForm_Initialize()

OnErrorResumeNext

MSComm1.CommPort=port_num

MSComm1.Settings=portseting

MSComm1.PortOpen=True

Timer1.Enabled=True

Label6.Caption=""

Label7.Caption=""

Label8.Caption=""

Label9.Caption=""

Combo1.ListIndex=0

Combo2.ListIndex=0

Combo3.ListIndex=0

Combo4.ListIndex=0

Combo5.ListIndex=0

Combo6.ListIndex=0

Combo7.ListIndex=0

Combo8.ListIndex=0

Open"record.txt"ForAppendAs#1'打开输出文件。

IfLoginSucceeded=0Then

Command1.Visible=False

Command2.Visible=False

Command3.Visible=False

Print#1,Now;"以查看者身份登陆成功"

Text3.Text="查看者"

ElseIfLoginSucceeded=1Then

Command3.Visible=False

Print#1,Now;"以管理员身份登陆成功"

Text3.Text="管理员"

Else

Print#1,Now;"以高级管理员身份登陆成功"

Text3.Text="高级管理员"

EndIf

Close#1

EndSub

PrivateSubForm_Terminate()

OnErrorResumeNext

If(MSComm1.PortOpen)ThenLetMSComm1.PortOpen=False

EndSub

PrivateSubCommand1_Click()

Open"record.txt"ForAppendAs#1'打开输出文件。

IfOption1.Value=TrueThen

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H0))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H1))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(Combo1.ListIndex)

Print#1,Now;"修改A路口为:

主干道-绿-";50-Combo1.ListIndex;",支干道-红-";55-Combo1.ListIndex

ElseIfOption2.Value=TrueThen

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H0))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H2))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(Combo2.ListIndex)

Print#1,Now;"修改A路口为:

主干道-黄-";5-Combo2.ListIndex;",支干道-红-";5-Combo2.ListIndex

ElseIfOption3.Value=TrueThen

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H0))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H3))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(Combo3.ListIndex)

Print#1,Now;"修改A路口为:

主干道-红-";35-Combo3.ListIndex;",支干道-绿-";30-Combo3.ListIndex

ElseIfOption4.Value=TrueThen

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H0))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H4))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(Combo4.ListIndex)

Print#1,Now;"修改A路口为:

主干道-红-";5-Combo4.ListIndex;",支干道-黄-";5-Combo4.ListIndex

EndIf

Close#1

EndSub

PrivateSubCommand2_Click()

Open"record.txt"ForAppendAs#1'打开输出文件。

IfOption5.Value=TrueThen

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H0))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H11))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(Combo5.ListIndex)

Print#1,Now;"修改B路口为:

主干道-绿-";50-Combo5.ListIndex;",支干道-红-";55-Combo5.ListIndex

ElseIfOption6.Value=TrueThen

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H0))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H12))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(Combo6.ListIndex)

Print#1,Now;"修改B路口为:

主干道-黄-";5-Combo6.ListIndex;",支干道-红-";5-Combo6.ListIndex

ElseIfOption7.Value=TrueThen

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H0))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H13))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(Combo7.ListIndex)

Print#1,Now;"修改B路口为:

主干道-红-";35-Combo7.ListIndex;",支干道-绿-";30-Combo7.ListIndex

ElseIfOption8.Value=TrueThen

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H0))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(CInt(&H14))

MSComm1.OutBufferCount=0

MSComm1.Output=Chr(Combo8.ListIndex)

Print#1,Now;"修改B路口为:

主干道-红-";5-Combo8.ListIndex;",支干道-黄-";5-Combo8.ListIndex

EndIf

Close#1

EndSub

PrivateSubCommand3_Click()

Shell"Rundll32.exeurl.dll,FileProtocolHandlerC:

\DocumentsandSettings\Administrator\桌面\交通灯控制系统\上位机\record.txt",vbNormalFocus

EndSub

PrivateSubText1_Change()

Iflight_A=1Then

Shape1.FillColor=&HFF00&

Shape2.FillColor=&H0&

Shape3.FillColor=&H0&

Shape4.FillColor=&H0&

Shape5.FillColor=&H0&

Shape6.FillColor=&HFF&

ElseIflight_A=2Then

Shape1.FillColor=&H0&

Shape2.FillColor=&HFFFF&

Shape3.FillColor=&H0&

Shape4.FillColor=&H0&

Shape5.FillColor=&H0&

Shape6.FillColor=&HFF&

ElseIflight_A=3Then

Shape1.FillColor=&H0&

Shape2.FillColor=&H0&

Shape3.FillColor=&HFF&

Shape4.FillColor=&HFF00&

Shape5.FillColor=&H0&

Shape6.FillColor=&H0&

ElseIflight_A=4Then

Shape1.FillColor=&H0&

Shape2.FillColor=&H0&

Shape3.FillColor=&HFF&

Shape4.FillColor=&H0&

Shape5.FillColor=&HFFFF&

Shape6.FillColor=&H0&

EndIf

EndSub

PrivateSubText2_Change()

Iflight_B=1Then

Shape7.FillColor=&HFF00&

Shape8.FillColor=&H0&

Shape9.FillColor=&H0&

Shape10.FillColor=&H0&

Shape11.FillColor=&H0&

Shape12.FillColor=&HFF&

ElseIflight_B=2Then

Shape7.FillColor=&H0&

Shape8.FillColor=&HFFFF&

Shape9.FillColor=&H0&

Shape10.FillColor=&H0&

Shape11.FillColor=&H0&

Shape12.FillColor=&HFF&

ElseIflight_B=3Then

Shape7.FillColor=&H0&

Shape8.FillColor=&H0&

Shape9.FillColor=&HFF&

Shape10.FillColor=&HFF00&

Shape11.FillColor=&H0&

Shape12.FillColor=&H0&

ElseIflight_B=4Then

Shape7.FillColor=&H0&

Shape8.FillColor=&H0&

Shape9.FillColor=&HFF&

Shape10.FillColor=&H0&

Shape11.FillColor=&HFFFF&

Shape12.FillColor=&H0&

EndIf

EndSub

PrivateSubTimer1_Timer()

DimiAsInteger,jAsInteger,tempAsInteger

i=MSComm1.InBufferCount

Ifi>=7Then

rx_buf()=MSComm1.Input

'数据处理

j=0

100:

Ifrx_buf(j)=&H0Then

light_A=rx_buf(j+1)

light_B=rx_buf(j+2)

time_A_main=rx_buf(j+3)

time_A_sub=rx_buf(j+4)

time_B_main=rx_buf(j+5)

time_B_sub=rx_buf(j+6)

Text1.Text=light_A

Text2.Text=light_B

Label6.Caption=time_A_main

Label7.C

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

当前位置:首页 > 初中教育 > 英语

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

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