⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 greenflic.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
字号:
#include <absacc.h>
#include <reg51.h>

extern unsigned char xdata now_day_planid;
unsigned int xdata conflc_set[32],constep[32];
unsigned char xdata conflag=0,hconflag=0;
extern unsigned char xdata now_schemeid;
extern  unsigned char step_counter;              //阶段号
extern  unsigned int xdata  g_read;
void hard_greenconflic() using 1
{
  unsigned int addr,an_addr,th_addr,for_addr;
  unsigned char i,j,k;
  unsigned char ste_id,phsch_id;

  unsigned int now_phase,now_lamp,xlht;
  unsigned int ph_lamp=0;
  unsigned int xdata crush;
  unsigned int xdata setpl;

  hconflag=0x00;
  addr=0x5e83;
  addr=addr+(now_schemeid-1)*41;   //方案表号地址
  ste_id=XBYTE[addr];              //阶段表号
  addr=0x5246+(ste_id-1)*98;
  phsch_id=XBYTE[addr];            //用到的相位表号
  an_addr=0x5244;
  an_addr=an_addr+(ste_id-1)*98;   //阶段表号
  th_addr=an_addr+step_counter*3;                   //
  now_phase=XBYTE[th_addr]*256+XBYTE[th_addr+1];    // 当前阶段放行的相位
  //当前时刻输出的绿灯灯组
  now_lamp=g_read;
  //for_addr=0x5001+(phsch_id-1)*288;
  for(j=0;j<16;j++){
       xlht=(0x0001<<j);
       if((now_lamp&xlht)==xlht){//当前放行的灯组
          for(k=0;k<16;k++){    //逐相位的查找
              for_addr=0x5001+(phsch_id)*288;
              for_addr=for_addr+k*18;
              setpl=XBYTE[for_addr];
              setpl=(setpl<<8);
              for_addr++;
              setpl=setpl+XBYTE[for_addr];
           //   setpl=XBYTE[for_addr]*256+XBYTE[for_addr+1];//相位表中每个相位放行的灯组
              //ph_lamp就是当前检测到的绿灯灯组所归属的全部相位
              if((setpl&xlht)==xlht){       //若该相位包含了该灯组,则在相应的相位位置置1
                    ph_lamp=(ph_lamp|(0x0001<<k));
                                     }
                                                 }
                                 }
                    }
    // for_addr=0x5000+(phsch_id-1)*288;
  for(i=0;i<16;i++){
     xlht=(0x0001<<i);//本阶段里放行的相位
     if((now_phase&xlht)==xlht){   //逐放行相位 查找其冲突相位
           for_addr=0x500a+(phsch_id)*288;
           for_addr=for_addr+i*18;
           crush=XBYTE[for_addr];
           crush=(crush<<8);
           for_addr++;
           crush=crush+XBYTE[for_addr];
          // crush=XBYTE[for_addr]*256+ XBYTE[for_addr+1];//查找到的i+1相位的冲突相位
           if((crush&ph_lamp)!=0){
                 hconflag=0x01;
                                  }
                                }


                    }
}
/////////////////////////////////////////////////////////////////////////////////////////
//软件绿冲突检测函数:每周期开始时对信号机对应日计划内的所有方案中对应的相位表进行冲突统计
//在方案指定的阶段表中,逐阶段查找放行的相位,确认没接中有无冲突的相位在同一阶段中出现
////////////////////////////////////////////////////////////////////////////////////////
void  soft_greenconflic()
{
 unsigned int addr,an_addr,th_addr,for_addr;
 unsigned char per_id;   //时段数
 unsigned char sch_id,step_id,step_nu,phase_id;
 unsigned char i,k,m;
 unsigned int j,xlht;
 conflag=0;
 addr=0x63a3;            //日计划开始地址
 per_id=XBYTE[addr];
// addr=0x63a6;

 for(i=0;i<per_id;i++){//每个方案 中都要判断
     j=i*3;
     addr=0x63a6;
     sch_id=XBYTE[addr+j];  //每个时段使用的方案
     an_addr=0x5e83;
     an_addr=an_addr+(sch_id-1)*41;
     step_id=XBYTE[an_addr]; //方案对应的阶段表号
     step_nu=XBYTE[an_addr+1]; //方案对应的阶段数
     th_addr=0x5246;
     th_addr=th_addr+(step_id-1)*98;
     phase_id=XBYTE[th_addr]; //方案对应的相位表号

     for(k=0;k<16;k++){
        for_addr=0x500a+phase_id*288;
        for_addr=for_addr+k*18;                  //确认每个相位对应的冲突相位
        conflc_set[k]=XBYTE[for_addr]*256+XBYTE[for_addr+1];
                       }
     EA=0;
     for(k=0;k<step_nu;k++){       //各相位 的冲突相位

           //各阶段放行的相位
           an_addr=0x5244+k*3;
           constep[k]=XBYTE[an_addr]*256+XBYTE[an_addr+1];
           for(m=0;m<16;m++){
              xlht=0x0001;
              xlht=(0x0001<<m);
              if((constep[k]&xlht)==xlht){
                          if((constep[k]&conflc_set[m])!=0x0000){
                                                      conflag=0x01;
                                                                 }
                                          }
                              }
                            } EA=1;
                
                      }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -