2 系统软硬件设计
本系统硬件上采用上位机和下位机设计,其中下位机四个,均采用AT89C52单片机,分别控制图2所示的四个组合。AT89C52单片机具有MCS-51内核,片内有8KB Flash、256字节RAM、6个中断源、1个串行口、最高工作频率可达24MHz,完全可以满足本系统的需要。
上位机和下位机之间的串行通信采用RS-485标准接口。在通信频率为9600bps的情况下,有效通信距离可达2.1km。
软件设计中,采用RTX51小型实时操作系统。它是一个专用于8051系列处理器的多任务实时操作系统,能使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换,并可以简化那些复杂而且时间要求严格的工程软件设计工作。
2.1 下位机设计
以控制1a-1b-3c-4c-2p组合的下位机为例说明。
下位机外接动态车辆检测电路、LED和数码相机。各下位机通过对车辆检测电路定时扫描,读取各车道当前信息,判断是否有车通过;LED显示各车道方向箭头及剩余时间;数码相机则对违章车辆进行抓拍。
动态车辆检测电路结构如图3所示。
埋设在各车道安全线前方路面下的环形线圈传感器与振荡器匹配,形成一定频率的周期信号。该信号经施密特整形电路转化为脉宽信号后可作为计数脉冲。当有车辆通过该环形线圈时,线圈磁场发生变化,从而导致计数脉冲数量的变化。将100ms时间内没有车通过时的频率计数作为基准计数Base,实际计数为Num。当NumBase>0时,就可判定有车辆通过。
下面是下位机中多任务的分析与实现。
(1)初始化任务
初始化串行接口,并开始全部其它任务。最后删除自身,因为初始化只需要一次。
(2)数据采集任务
每隔100ms顺次读取四个车道(1a、1b、3c、4c)动态车辆检测电路的信息,判断Num-Base是否大于0。若为真,则置相应Flag为1,否则置0(Flash表示某一车道有无车辆通过的标识)。令FLAG1、flag1分别标志1a车道上一次和本次的检测结果。若FLAG1-flag1=1,则表明有车通过(同样,可以令FLAG2、flag2标识1b车道,FLAG3、flag3标识3c车道、FLAG4、flag4标识4c车道前后两次的检测结果)。若任一车道有车通过,则向流量统计及违章监测任务发送信号。程序如下:
void job2()_task_job2{
while(1){
读取车辆检测电路信息,通过判断给flag1、flag2、flag3、flag4赋值;
if(FLAG1-flag1==1||FLAG2-flag2==1||FLAG3-flag3==1||FLAG4-flag4=1) //若某一车道有车通过
{
记录有车通过的车道;
os_send_signal(job3);//向流量统计与违章监测任务发出信号
}
FLAG1=flag1;FLAG2=flag2;FLAG3=flag3;FLAG4=flag4; //当前标识位成为前一标识位
各计数器恢复初值;
os_wait(100ms);
}
}
(3)流量统计与违章监测任务
在接收到任务2发来的信号后,根据其提供的车道记录及该车道的当前显示情况,实现流量统计或违章监测的功能。
void job3()_task_job3{
while(1){
os_wait(K_SIG,0,0);
if(1a||1b车道有车通过){
if(当前为红灯)启动数码相机抓拍,并读取实时时钟当前时间;
else N1++; //在绿灯持续时间内对通过车辆计数
}
else若当前为红灯,启动数码相机抓拍,并读取时间。3c、4c违章监测
}
}
(4)显示任务
图2 十字路口典型通行顺序示意图
在外接的LED上分别显示四个车道方向箭头和人行横道的红绿灯,以及1a-1b车道剩余时间。最初的窗口时间由上位机给定。该显示值每秒钟刷新一次。
Void job4()_task_job4{
t1=T1; //T1为上位机给定绿灯窗口时间
while(1){
各路口方向箭头、人行横道红绿灯显示及1a、1b车道剩余时间(t1)显示;
os_wait(1000ms); //1s刷新
t1--;
if(t1==0)
{os_create_task(job6); //若时间到,创建通信任务
os_delete_task(job4);} //删除显示任务
}
}
(5)看门狗复位任务
定期对看门狗进行复位,表明程序正常运行。
(6)通信任务
当时间到时,根据当前情况进行红绿灯显示切换若1a、1b当前为绿灯,则时间到后通知上位机,并将统计的车流量经串行口传送给上位机,由上位机触发下一组绿灯显示;右1a、1b当前为红灯,则时间到后等待上位机触发信号。这样由上位机统一调度,可以避免各下位机各自为政所造成的时间差。由于通信任务对时间特性的要求很高,所以应将通信任务设为高优先级。
Void job6()_task_job6_prority_1{
if(绿灯时间间到){
V1=N1*60/(2*T1); //N1表示1a、2b车道在T1时间内通过的车辆总和,V1为该绿灯周期内两个车道平均每分钟车流量
将V1值传送上位机;
N1清0;
1a、1b、3c、2p转红色显示;
}
if(红灯时间到){
os_wait(K_SIG,0,0); //等待上位机信号
根据上位机计算数据更新T1;
1a、1b、4c、2p转绿色显示;
}
os_create_task(job4); //创建显示任务
os_delete_task(job6); //删除自身
}
2.2 上位机设计
上位机主要完成人机交互的功能。它外接一个字符型LCD显示器和键盘。LCD显示器在睡眠状态下显示各路口的当前绿灯窗口时间。当有键盘响应时,作相应的辅助显示。
本系统的键盘采用9按键输入。
[!--empirenews.page--]
当主车道上有紧急车辆(如警车、消防车或急救车等)要求通行时,可以按下此键。
本系统设定了6种功能选项:4个主车道的绿灯窗口时间调节选项、手动/自动操作模式切换选项以及违章记录查询选项。这6项功能,可以通过按功能键进行切换。
下面是上位机中多任务的分析与实现。
(1)初始化任务
初始化串行接口及各车道组合的绿灯窗口时间(20s),并开始其它任务,最后删除自身。
(2)键盘扫描任务
利用顺序查询的方式,定时对键盘进行扫描,判断是否有按键被按下。若有,则判断是哪个键被按下,并向任务3发出信号。
void job2_task_job2{
while(1){
扫描键盘;
if(有键被按下){
判断是哪个键;
os_send_signal(job3);
}
os_wait(10ms);
}
}
(3)键盘处理任务
若在初始情况下按下功能键,则进入6个功能项。再次按下功能键,则在这6个功能项之间进行切换;若按下的是确定键,则创建相应功能项所定义的任务。在任何情况下按下紧急通行键,将创建紧急通行任务。
(4)显示任务
当键盘扫描任务在一定的时间内没有检测到输入信号时,将LCD转入睡眠状态,面板显示各车道组合的当前绿灯窗口时间。若该窗口时间由于任务5被更新,当有按键被按下时,则根据按键情况作相应的辅助显示。
(5)时间自动调节任务
在自动操作模式下,每隔10min,对各下位机上传的各车道组合的车流量进行分析,根据模糊算法确定各车道组合的最优时间分配。
分别用V1、V2、V3、V4表示1a-1b、2a-2b、3a-3b、4a-4b四个车道组合当前每分钟平衡车流量,t1、t2、t3、t4表示各自绿灯窗口时间,则绿灯时间分配如表1所列。
表1 绿灯时间分配表
Vi(i=1~4)
Vi≤5
5<5i≤10
10