城市交通信号控制系统
设计要求:
(1)以单片机为控制核心,完成城市交通信号控制系统设计与制作。
(2)能够完成路口车流量检测,根据车流量自动调整同行时间。
(3)模拟地图至少包含8个路口,4个路口能够实现绿波带,每个路口包含左转直行和右转三种状态。
1 系统框图
交通信号控制系统的硬件设计是整个系统的关键组成部分,它直接影响到系统的稳定性、实时性和可靠性。基于你提供的信息,我将详细描述该系统的设计,包括STC89C52单片机最小系统、按键输入模块、电源模块、红外流量检测模块和交通指示灯模块的组成和功能。

2 硬件设计
在整个城市交通信号控制系统的硬件总设计中包括STC89C52单片机最小系统、按键模块、电源模块、红外流量检测模块、交通指示灯模块以及无线通讯模块等关键组件,它们共同协作实现城市交通信号控制系统的功能。
-
STC89C52单片机最小系统:STC89C52单片机是整个交通信号控制系统的核心控制器,它具有强大的计算和控制能力,能够实现对交通信号的精确控制。最小系统包括STC89C52单片机、晶振、电容、电阻等基本元件,以及必要的连接线路。单片机的主频通常选用11.0592MHz的晶振,以满足系统对时序精度的要求。
-
按键模块:按键模块用于手动设置交通信号控制系统的参数,例如调整特定路口的信号灯时间、切换系统工作模式等。该模块通常由几个按键和相应的电路组成,通过按键输入可以实现对系统的简单控制和调整。
-
电源模块:电源模块负责为整个交通信号控制系统提供稳定的电源供应,以确保系统的正常运行。该模块通常包括电源管理电路、稳压电路和滤波电路,能够对输入电压进行稳定的调节和滤波处理,以保证单片机和其他模块的正常工作。
-
红外流量检测模块:红外流量检测模块用于实时检测车辆通过情况,获取车流量数据,以便交通信号控制系统根据实际情况调整信号灯时间。该模块包括红外传感器、信号处理电路和数据采集电路,能够准确地检测车辆的通过情况,并将数据传输至单片机进行处理。
-
交通指示灯模块:交通指示灯模块是交通信号控制系统的输出部分,用于显示不同车辆通行状态的信号灯。该模块包括红、黄、绿等颜色的LED灯和相应的驱动电路,能够根据单片机的控制信号实现交通信号的显示和切换。
-
无线通讯模块:无线通讯模块负责系统内部各个模块之间的数据通信,以及与上位机的无线数据传输。它通常包括无线通讯芯片、天线和相应的驱动电路,能够实现稳定可靠的无线数据传输。

在整个硬件设计中,如上图所示,各个模块之间需要进行合理的连接和布局,以确保信号传输的稳定性和可靠性。此外,还需要考虑系统的防雷、防静电等保护措施,以确保系统在恶劣环境下的正常运行。硬件设计将为交通信号控制系统提供稳定的控制核心、灵活的参数调整、可靠的数据采集和精准的信号显示,从而实现对交通信号的智能化控制,提高交通运输效率,改善城市交通状况。
3 软件设计
3.1 主程序设计
交通信号控制系统的总体软件设计包括多个模块的协同工作。每个路口的单片机负责控制动态数码管显示倒计时时间,以及控制LED显示红绿黄指示灯的状态。单片机还需要检测按键输入,用于手动控制交通灯。同时,单片机还需要接收红外车流量检测模块的数据,用于实时监测车流量情况。
另一方面,交通信号控制系统还包括无线WIFI通讯模块,用于定时上报检测到的车流量数据到上位机电脑。上位机电脑负责处理八个路口的车流量信息,通过算法分析交通流量情况,并生成相应的控制信息。这些控制信息会被发送回各个路口的控制单片机,以调节红绿灯倒计时时间,以适应实际交通情况。
总体软件设计需要保证各个模块之间的通讯协议和数据格式的统一,以确保信息的准确传输和处理。同时,需要考虑系统的实时性和稳定性,以保证交通信号控制系统能够准确、及时地响应交通状况,提高交通运行效率。

3.2 动态数码管子程序
动态数码管显示的软件设计包括倒计时功能和数字显示功能。倒计时功能通过定时器中断实现,每秒更新一次数码管显示的倒计时时间,同时更新倒计时变量。数字显示功能通过数码管驱动函数实现,将倒计时变量的值转换为数码管对应的数字显示。软件设计需考虑定时器的设置、中断服务程序的编写和数码管驱动函数的实现,以确保倒计时准确、稳定地显示在数码管上。同时,需要考虑倒计时结束后的处理,如切换交通灯状态或重新开始计时。

3.3 按键和LED显示子程序设计
按键检测的软件设计包括轮询按键状态,检测按键按下并进行相应处理。LED显示的软件设计包括根据交通灯状态控制LED的亮灭。按键检测通过轮询IO口状态实现,检测到按键按下后进行相应的处理,如手动切换交通灯状态。LED显示通过控制IO口输出高低电平实现,根据交通灯状态控制对应的LED灯亮灭。软件设计需要考虑按键消抖处理和LED状态切换的同步性,以确保按键输入的准确性和LED显示的正确性。

3.4 红外车流量检测子程序
红外流量检测的软件设计包括对红外传感器信号引脚的电平进行实时检测,当检测到电平变化时,车流量计数加一。通过IO口中断或定时器中断实现对红外传感器信号的实时监测,一旦检测到电平变化,就进行车流量计数的更新。软件设计需要考虑中断服务程序的编写和车流量计数的同步性,以确保对车流量变化的准确监测和计数。

3.5 动态滤波带算法子程序
动态绿波带算法的软件设计涉及上位机对各个路口上传的车流量数据进行处理和分析,以选择出车流量最大的4个连通路口作为绿波带。首先,上位机需要接收来自各个路口单片机上传的车流量数据,这些数据可以通过无线WIFI通讯模块传输到上位机。然后,上位机对接收到的车流量数据进行汇总和分析,选择出车流量之和最大的4个连通路口。这可以通过对车流量数据进行排序和比较来实现。一旦确定了绿波带路口,上位机将相应的控制信息发送回各个路口单片机,以调整交通信号灯的控制。这些控制信息可以通过无线WIFI通讯模块发送到各个路口单片机,并由单片机进行相应的处理和执行。软件设计需要考虑到数据的实时性和准确性,以确保选择出最佳的绿波带路口,并将控制信息及时准确地发送到各个路口单片机。

4 系统调试与仿真
在交通信号控制系统的系统仿真与调试部分,可以利用Proteus软件进行仿真和调试。首先,可以在Proteus中建立交通信号控制系统的电路图,包括各个路口的单片机、红绿灯模块、红外传感器等。然后,可以通过Proteus中的仿真功能,模拟各种情况下的交通信号控制系统运行,包括车辆通过、红绿灯切换、红外传感器检测等。在仿真过程中,可以观察各个部件的工作状态,以验证系统设计的正确性和稳定性。同时,可以通过Proteus中的调试功能,对系统进行调试和优化。通过Proteus软件的仿真与调试,可以在实际硬件制作之前,对交通信号控制系统进行全面的验证和调试,以确保系统的正常运行和稳定性。
按下启动按键后可见,交通信号控制系统开始运行,可见第一行的路口的红路灯差为2s,这个时间可以通过,绿波带路段限速的速度来计算,这里拟定为2s,如下图所示:

通过按键可以调节绿波带路段的红绿灯倒计时时间,按下增加按键可见,如下所示,绿波带上的倒计时时间增大。

按下减少可见,如下图所示,绿波带上的倒计时时间减小。

由此可见,在交通信号控制系统的系统仿真部分,Proteus软件可以用于建立系统的电路图并进行仿真。通过Proteus,可以模拟交通信号控制系统中的各个组件,包括单片机、红绿灯模块、传感器等。在仿真过程中,可以模拟车辆通过、信号灯切换、传感器检测等实际场景,观察系统的运行状态和各个组件之间的交互作用。通过仿真,可以验证系统设计的正确性和稳定性,发现潜在的问题并进行调整和优化。同时,还可以对系统的响应时间、实时性等进行评估和优化,以确保系统在实际应用中的可靠性和稳定性。通过Proteus软件进行仿真,可以在实际硬件制作之前,对交通信号控制系统进行全面的验证,节省时间和成本,并提高系统的可靠性和稳定性。
下面是单个红绿灯实物图:

5 总结
城市交通信号控制系统设计旨在通过智能化的硬件和软件结合,实现对城市交通信号的精准控制,提高交通效率、减少交通拥堵,同时保障交通安全和环保。这一设计具有以下优点和特色:采用单片机作为核心控制器,通过精确的倒计时和传感器检测,实现对交通信号灯的智能控制,根据实时交通情况进行动态调整。系统具备紧急措施触发功能,可以在紧急情况下,通过按键触发交通信号灯的快速切换,保障紧急车辆的优先通过,提高交通安全性。系统通过红外传感器等装置实时监测车流量,并进行统计和显示,为交通管理部门提供数据支持,帮助他们进行合理的交通规划和管理。通过智能化控制和车流量监测,可以减少交通拥堵,降低车辆排放,从而达到节能减排的目的,对城市环保具有积极意义。
附件A(Keil源代码)
main.c
/***********************************************
代码名称:城市交通信号控制系统
MCU :STC89C52
时钟频率: 8MHz
作者 :LoongSTUDIO
QQ :443385785
***********************************************/
#include<reg51.h>
#include<intrins.h> //包含库文件
sbit smg1=P3^0; //定义南北方向数码管低位
sbit smg2=P3^1; //定义南北方向数码管高位
sbit SN_green=P2^0; //定义南北向绿灯端口
sbit SN_red=P2^1; //定义南北向红灯端口
sbit SN_yellow=P2^2; //定义南北向黄灯端口
sbit EW_green=P1^0; //定义东西向绿灯端口
sbit EW_red=P1^1; //定义东西向红灯端口
sbit EW_yellow=P1^2; //定义东西向黄灯端口
sbit k1=P3^5;
sbit k2=P3^6;
sbit k3=P3^7;
int js=0,djs=30;nowtime=30; //初始倒计时时间
int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40}; //共阴极数码管段值
/************以下为函数声明*************/
void jtd();
void jtda();
void jtdb();
void djsxs();
void jtday();
void jtdby();
void key();
/*****************************************************/
/* 函数名:delayms */
/* 功能:产生毫秒级延时 */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
{
for(i=150;i>0;i--);
}
}
/*****************************************************/
/* 函数名:Timer0_init() */
/* 功能:定时器0初始化 */
/*****************************************************/
void Timer0_init()
{
js=0;
TMOD=0x01; //定义定时器0工作模式
TH0=0x3c; //赋初值高位
TL0=0xb0; //赋初值低位
TR0=1; //启动定时器
ET0=1; //开中断
EA=1; //开全局中断
}
/*****************************************************/
/* 函数名:timer0() interrupt 1 using 1 */
/* 功能:定时器0中断服务函数 */
/*****************************************************/
void timer0() interrupt 1 using 1
{
TF0=0;
TH0=0x3c;
TL0=0xb0; //重新赋高地位初值
js++;
if(js==20)
{ js=0;
djs--;
}
}
/*****************************************************/
/* 函数名:djsxs() */
/* 功能:数码管动态显示 */
/*****************************************************/
void djsxs() //此 函数注视同djsxs()
{ int b1,b2;
b1=djs/10; //将倒计时时间的高位赋予b1
b2=djs%10; //将倒计时时间的低位赋予b2
P0=table[b1];
smg1=0;
delayms(3);
smg1=1; //显示b1
P0=table[b2];
smg2=0;
delayms(3);
smg2=1; //显示b2
}
/*****************************************************/
/* 函数名:qm() */
/* 功能:使所有的交通信号灯全部熄灭 */
/*****************************************************/
void qm()
{
SN_green=1;
SN_red=1;
SN_yellow=1;
EW_green=1;
EW_red=1;
EW_yellow=1;
}
/*****************************************************/
/* 函数名:jtdb() */
/* 功能:交通灯东西方向绿灯亮,红灯灭 */
/* 交通灯南北方向红灯亮,绿灯灭 */
/*****************************************************/
void jtdb()
{
qm(); //所有信号灯灭
EW_green=0; //东西向绿灯亮
SN_red=0; //南北向红灯亮
while(1)
{
if(djs>3) //当倒计时时间大于5秒时,执行
{
djsxs(); //数码管时间显示
key();
}
if(djs<=3) //当倒计时时间小于5秒时,执行
{
jtdby(); //调用函数
}
}
}
/*****************************************************/
/* 函数名:jtdby() */
/* 功能:交通灯东西方向黄灯亮,红灯灭 */
/* 交通灯南北方向红灯亮,绿灯灭 */
/*****************************************************/
void jtdby()
{
qm(); //所有信号灯全灭
EW_green=1; //东西向绿灯灭
EW_yellow=0; //东西向黄灯亮
SN_red=0; //南北向红灯亮
while(1)
{
djsxs(); //数码管时间显示
if(djs<0) //当倒计时时间小于0秒时,执行
{
djs=nowtime;
jtda(); //调用jtda()函数
}
}
}
/*****************************************************/
/* 函数名:jtda() */
/* 功能:交通灯南北方向绿灯亮,红灯灭 */
/* 交通灯东西方向红灯亮,绿灯灭 */
/*****************************************************/
void jtda()
{
qm(); //所有信号灯灭
SN_green=0; //南北向绿灯亮
EW_red=0; //东西向红灯亮
while(1)
{
if(djs>3) //当倒计时时间大于5秒时,执行
{
djsxs(); //数码管时间显示
key();
}
if(djs<=3) //当倒计时时间小于5秒时,执行
{
jtday(); //调用函数
}
}
}
/*****************************************************/
/* 函数名:jtday() */
/* 功能:交通灯南北方向黄灯亮,红灯灭 */
/* 交通灯东西方向红灯亮,绿灯灭 */
/*****************************************************/
void jtday()
{
qm(); //所有信号灯全灭
SN_green=1; //南北向绿灯灭
SN_yellow=0; //南北向黄灯亮
EW_red=0; //东西向红灯亮
while(1)
{
djsxs(); //数码管时间显示
if(djs<0) //当倒计时时间小于0秒时,执行
{
djs=(60-nowtime);
jtdb(); //调用jtdb()函数
}
}
}
void key(void)
{
if(k1!=1)
{
djsxs();
if(k1!=1)
{
TR0=0;
nowtime=nowtime+5;
djs=nowtime;
if(djs>nowtime)
{
djs=nowtime;
}
do
{
djsxs();
}
while(k1!=1);
}
}
if(k2!=1)
{
djsxs();
if(k2!=1)
{
TR0=0;
nowtime=nowtime-5;
djs=nowtime;
do
{
djsxs();
}
while(k2!=1);
}
}
if(k3!=1)
{
TR0=1;
}
}
/*****************************************************/
/* 函数名:main() */
/* 功能: 主函数 */
/*****************************************************/
void main()
{
Timer0_init(); //定时器0初始化
jtda(); //调用jtda()函数
}
附件B(Proteus仿真)
通过网盘分享的文件:LoongSTUDIO-1 链接: 百度网盘 请输入提取码
提取码: hg2i
附件C(Question答疑)
见首页简介
企鹅:443385785 绿泡泡:Loong_STUDIO
2万+

被折叠的 条评论
为什么被折叠?



