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

📄 second.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                                      }else{
                          if(re_keep_force==1){//原阶段绿闪,黄灯清空时间后第一秒
                                   now_uncount=max_green_flash+max_red_clear+max_yellow+1;
                                 }else{
                                    if(step_counter!=force_number-1){
                                        now_uncount--;     //新的强制输入后,原阶段剩余时间继续减少
                                   }else{
                                      if(force_exe_flag==1){
                                          now_uncount =max_green_flash+max_red_clear+max_yellow+1;
                                           force_exe_flag=0;
                                                          }
                                                       }
                                                  }
                                            }
                                          }else{ //无强制状态下
                                if(re_control!=1){  //正常自动运行状态下非感应控制倒计时计算和赶感应控制倒计时计算
                                                  //非感应控制
                                if(/*sensor_step[step_counter]*/asc_flag==0)now_uncount=XBYTE[baseaddr_now_schemesch+8+step_counter]-now_step_key;

                                                  //感应控制
                                if(/*sensor_step[step_counter]*/asc_flag==1){
                                               if(per_count>2){
                                                     if(go>1){
                                                  //       now_uncount=step_time-now_step_key;
                                                         now_uncount=sch_step[step_counter]-now_step_key; //降级使用
                                                         auto_down=1;
                                                                  }else {
                                                       now_uncount=step_time-now_step_key;
                                                                  }
                                                    }
                                                  else {
                                                       now_uncount=step_time-now_step_key;
                                                                  }
                                                                }
                                if((alt_change==0x01)&&(machine_flag==0x01)){ //新阶段第一秒并且信号机做主机使用
                                                          alt_change=0;
                                                          deal_zone(); //发送点:阶段开始的第一秒发送个从机需要是数据
                                                                 }
                                                  }
                                if((re_control!=1)&&(exit_remote==1)){
                                                                      now_uncount=max_green_flash+max_red_clear+max_yellow+1-now_step_key;
                                                                      }
                                //now_uncount=XBYTE[baseaddr_now_schemesch+8+step_counter]-now_step_key;
                                //  if((re_control!=1)&&(last_force_flag==0))now_uncount=max_green_flash+max_red_clear+max_yellow+1;
                                              if((force_flag==0)&&last_force_flag==1){//遥控状态返回自动
                                              now_uncount=max_green_flash+max_red_clear+max_yellow+1;
                                              now_step_key=0;
                                                                   }

                                                }
                      // }
        if((re_control!=1)&&(last_re_control==1)){
                                               now_uncount=max_green_flash+max_red_clear+max_yellow+1;
                                               exit_remote=1;
                                               }
        last_force_flag=force_flag;
        last_re_control=re_control;
//强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制
////////////////////////////////////////////////////////////////////////////////////////

     if(/*sensor_step[step_counter]*/asc_flag==0)                   //阶段为固定配时
       {
        for(i=0; i<16; i++)                             //此循环用于查找当前阶段用到的相位
       {

          toto = 0x0001;
          toto = toto<<i;

          now_phase_temp = toto&inuse_phase[step_counter];
          if(re_control==1&&step_counter!=reph_number-1)//遥控响应尚未开始执行
                now_phase_tempn = toto&inuse_phasen[reph_number-1];
          else if(force_flag==1&&step_counter!=force_number-1)//遥控响应尚未开始执行
                now_phase_tempn = toto&inuse_phasen[force_number-1];
          else
                now_phase_tempn = toto&inuse_phasen[step_counter];
          if(now_phase_temp!=0)
          {
             now_lamp_temp = XBYTE[baseaddr_now_phasesch+18*i];
             now_lamp_temp = now_lamp_temp<<8;
             now_lamp = now_lamp_temp|XBYTE[baseaddr_now_phasesch+18*i+1];
             if(now_uncount>red_yellow_green_clear[i])    //当前倒计时处于绿灯时间范围内

            // step_uncount[4][16]:当前阶段的剩余时间累计,全红时间,黄灯时间,绿闪时间,绿灯时间
             {
               clear_flag=0;     //不处于清空时间
               clear_force=0;
               now_phase_status = now_phase_status|now_phase_temp;
               now_step_uncount = now_uncount-red_yellow_clear[i];   //非行人相位   不是行人相位
               //当前绿灯的倒计时
                for(j=0; j<16; j++)                   //此循环用于查找当前相位用到的灯组
                {
                   toto1 = 0x0001;
                   toto1 = toto1<<j;
                   inuse_lamp_temp =  toto1&now_lamp;
                   if(inuse_lamp_temp!=0)
                   {
                       lamp_state[j]=1;   /*当前阶段用的灯组置成绿色*/
                   }
                }

             }
             else if(now_uncount>=red_yellow_clear[i]) /*当前阶段处于绿闪*/
             {
                clear_flag=1;
                clear_force=1;
                now_step_uncount = now_uncount-red_yellow_clear[i];

                for(j=0; j<16; j++)
                {
                   toto1 = 0x0001;
                   toto1 = toto1<<j;
                   inuse_lamp_temp =  toto1&now_lamp;
                   if(inuse_lamp_temp!=0)
                   {
                       lamp_state[j]=2;         /*当前阶段用的灯组置成绿闪*/
                       if(now_phase_tempn!=0)
                          lamp_state[j]=1;      /*下一阶段用的灯组仍置成绿色*/
                   }
                }
             }
             else if(now_uncount<red_yellow_clear[i]&&now_uncount>=red_clear[i])
             {
                clear_flag=1;
                clear_force=1;
                if(now_phase_tempn==0)
                now_phase_status = now_phase_status&(~now_phase_temp);
                now_step_uncount = now_uncount-red_clear[i];
                    //now_uncount:当前阶段的倒计时 now_step_uncount:当前绿灯的倒计时

                for(j=0; j<16; j++)
                {
                   toto1 = 0x0001;
                   toto1 = toto1<<j;
                   inuse_lamp_temp =  toto1&now_lamp;
                   if(inuse_lamp_temp!=0)
                   {
                      // if(now_uncount>red_clear[i])
                       {
                           lamp_state[j]=3;         /*当前阶段用的灯组置成黄色*/
                           if((XBYTE[baseaddr_now_phasesch+18*i+2]&0x04)==0x04)
                             lamp_state[j]=4;       /*灯组是行人灯组,在黄灯期间置红色*/
                       }
                       if(now_phase_tempn!=0)
                          lamp_state[j]=1;          /*下一阶段用的灯组仍置成绿色*/
                   }
                }
             }
         else if(now_uncount<red_clear[i]) //当前倒计时处于全红时间范围内
          {
                clear_flag=1;
                clear_force=1;
                if(now_phase_tempn==0)
                now_phase_status = now_phase_status&(~now_phase_temp);
                now_step_uncount = now_uncount;         //当前阶段的倒计时

               for(j=0; j<16; j++)
                {
                   toto1 = 0x0001;
                   toto1 = toto1<<j;
                   inuse_lamp_temp =  toto1&now_lamp;
                   if(inuse_lamp_temp!=0)
                   {
                       lamp_state[j]=4;         /*当前阶段用的灯组置成绿闪*/
                       if(now_phase_tempn!=0)
                          lamp_state[j]=1;      /*下一阶段用的灯组仍置成绿色*/
                   }
                }
          }
        }
       }
    }
 /////////////////////////////////////////////////////////////////////////////////////////////
 //感应阶段,感应阶段  感应阶段,感应阶段感应阶段,感应阶段感应阶段,感应阶段感应阶段,感应阶段
 /////////////////////////////////////////////////////////////////////////////////////////////
    else if(/*sensor_step[step_counter]*/asc_flag==1)              //阶段为感应配时
    {

      for(i=0; i<16; i++)                            //此循环用于查找当前阶段用到的相位
        {

           toto = 0x0001;
           toto = toto<<i;
           now_phase_temp = toto&inuse_phase[step_counter];   //当前阶段是否包含该相位
           now_phase_tempn = toto&inuse_phasen[step_counter];
           if(now_phase_temp!=0)                        //
           {
              now_lamp_temp = XBYTE[baseaddr_now_phasesch+18*i];
              now_lamp_temp = now_lamp_temp<<8;
              now_lamp = now_lamp_temp|XBYTE[baseaddr_now_phasesch+18*i+1];


            // if(now_uncount>red_yellow_green_clear[i])  //当前倒计时处于绿灯时间范围内
               if(now_uncount>max_green_flash+max_yellow+max_red_clear)  //当前倒计时处于绿灯时间范围内
              {
               clear_flag=0;     //不处于清空时间
               clear_force=0;
               //绿灯倒计时=阶段倒计时-全红时间-黄灯时间
               now_phase_status = now_phase_status|now_phase_temp;
               //行人相位倒计时采用当前以红清空时间为基准
               if((XBYTE[baseaddr_now_phasesch+18*i+2]&0x04)!=0x04){
                       now_step_uncount = now_uncount-red_yellow_clear[i];
                                                                    }
               //当前阶段倒计时
               if(now_step_key<(step_time-sensor_distance-max_red_clear-max_yellow))sensor_car_flag = 0;
               //当前阶段倒计时处于绿时可延长范围
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制



  if(now_step_key<(step_time-max_green_flash-max_red_clear-max_yellow)&&now_step_key>=(step_time-max_green_flash-max_red_clear-max_yellow-sensor_distance))
                    {
                         sensor_car_flag=1;
                         //无遥控和强制状况下
                         if((carnumber!=lastcarnumber)&&(re_control==0)&&(force_flag!=1)&&(max_end_flag!=0x02))
                         {

                             difer=0;
                             diff=now_step_key-(step_time-max_green_flash-max_red_clear-max_yellow-sensor_distance);
                             lastcarnumber = 0;
                             carnumber=0;
                             if(max_end_flag==0x00)add_greentime =now_step_key+sensor_distance;     //增加后的绿时长度
                             if((add_greentime>=max_greentime)&&( max_end_flag==0))max_end_flag++;
                             if((add_greentime>=max_greentime)&&(max_end_flag==0x01))
                             {
                                max_end_flag++;
                                ensensor_flag = 0;
                                sensor_car_flag = 0;
                                if(add_greentime>=max_greentime)difer=0;
                                              //  else{
                                              //   difer=sensor_distance-(add_greentime-max_greentime);
                                              //   step_time=step_time+difer;
                                              //   }
                                add_greentime = max_greentime;
                                step_time=step_time+difer;
                                }
                               if(max_end_flag==0x00){
                                                    step_time=step_time+diff;//sensor_distance;
                                        }

                           //    step_time =step_time+difer;// add_greentime+XBYTE[baseaddr_now_phasesch+18*i+15]+XBYTE[baseaddr_now_phasesch+18*i+16]+XBYTE[baseaddr_now_phasesch+18*i+17];
                          //   sensor_counter = 1;
                               if(machine_flag==0x01){
                                                    deal_zone();//此处处理小区域控制问题 主机使用
                                                    }


                         }
                     }
                for(j=0; j<16; j++)                   //此循环用于查找当前相位用到的灯组
                {
                   toto1 = 0x0001;
                   toto1 = toto1<<j;
                   inuse_lamp_temp =  toto1&now_lamp;
                   if(inuse_lamp_temp!=0)
                   {
                       lamp_state[j]=1;          /*当前阶段用的灯组置成绿色*/
                   }
                }
              } //当前倒计时处于绿闪时间范围内
           // else if(now_uncount>=red_yellow_clear[i]&&now_uncount<=red_yellow_green_clear[i])
              else if(now_uncount>=(max_red_clear+max_yellow)&&now_uncount<=(max_green_flash+max_red_clear+max_yellow))
              { clear_flag=1;
                clear_force=1;
                now_step_uncount = now_uncount-red_yellow_clear[i];    //当前阶段的倒计时

                for(j=0; j<16; j++)                   //此循环用于查找当前相位用到的灯组
                {
                   toto1 = 0x0001;
                   toto1 = toto1<<j;
                   inuse_lamp_temp =  toto1&now_lamp;
                   if(inuse_lamp_temp!=0)
                   {
                      if(now_phase_tempn==0)
                      {
                         ensensor_flag = 0;
                         sensor_car_flag = 0;
                         step_time = now_step_key+now_uncount;
                         lamp_state[j]=2;         /*当前阶段用的灯组置成绿闪*/

                      }
                      else
                      {
                         lamp_state[j]=1;          /*下一阶段用的灯组仍置成绿色*/
                      }
                   }
                }
              }
        // else if(now_uncount>=red_clear[i]) //当前倒计时处于黄灯时间范围内
     //   else if(now_uncount<red_yellow_clear[i]&&now_uncount>=red_clear[i]) //当前倒计时处于黄灯时间范围内
          else if(now_uncount<(max_red_clear+max_yellow)&&now_uncount>=max_red_clear) //当前倒计时处于黄灯时间范围内
              { clear_flag=1;
                clear_force=1;
                if(now_phase_tempn==0)
                   now_phase_status = now_phase_status&(~now_phase_temp);
                   now_step_uncount = now_uncount-red_clear[i];         //当前阶段的倒计时

                for(j=0; j<16; j++)                   //此循环用于查找当前相位用到的灯组
                {
                   toto1 = 0x0001;
                   toto1 = toto1<<j;
                   inuse_lamp_temp =  toto1&now_lamp;
                   if(inuse_lamp_temp!=0)
                   {
                      // if(now_uncount>red_clear[i])
                       {
                           lamp_state[j]=3;         /*当前阶段用的灯组置成黄色*/
                           if((XBYTE[baseaddr_now_phasesch+18*i+2]&0x04)==0x04)

⌨️ 快捷键说明

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