基于单片机的交通灯控制系统.docx
《基于单片机的交通灯控制系统.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯控制系统.docx(37页珍藏版)》请在冰豆网上搜索。
基于单片机的交通灯控制系统
交通灯控制系统
引言
随着社会的发展、科技的进步以及人们生活水平的逐步提高,一个以微电子技术、计算机技术和通信技术为先导的信息革命正在蓬勃发展。
计算机技术作为三者之一,怎样与实际应用更有效的结合并发挥其作用。
单片机作为计算机技术的一个分支,正在不断的应用到实际生活中,同时带动传统控制检测的更新。
在实时检测和自动控制的应用系统中,单片机往往是作为一个核心部件使用,针对具体应用对象的特点,配以其它器件来加以完善。
它实用性强,功能齐全,技术先进,使人们相信这是科技进步的成果。
它更让人类懂得,数字时代的发展将改变人类的生活,将加快科学技术的发展。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现交通的井然秩序呢?
靠的是交通信号灯的自动指挥系统,来实现交通的井然有序。
交通信号灯控制方式很多。
本系统采用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