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

📄 second.c

📁 最先进的信号机程序,经过很多重要场合测试通过
💻 C
📖 第 1 页 / 共 3 页
字号:
//遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控
 ///////////////////////////////////////////////////////////////////////////////////////
//强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制
////////////////////////////////////////////////////////////////////////////////////////
      if(force_flag==1){    //强制阶段号发生变化
         //     if(force_number!=last_forcenumber){
                     if(act_force==1){ //进入强制控制的第一秒
                              act_force=0;
                              if(clear_force==0){//绿灯阶段
                                       now_uncount =max_green_flash+max_red_clear+max_yellow+1;
                                                 }
                                      }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){
                                                  now_uncount=XBYTE[baseaddr_now_schemesch+8+step_counter]-now_step_key;
                                                  }
                                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]==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]==1)              //阶段为感应配时
    {

        if(sensor_virgin_flag)
        {
           sensor_virgin_flag = 0;
           step_time = search_step_time();             //阶段时间在开始时只加载一次=最小绿灯+红灯+黄灯
        }


        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])  //当前倒计时处于绿灯时间范围内
              {
               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))
                         {
                             lastcarnumber = 0;
                             carnumber=0;
                             add_greentime =now_step_key+sensor_distance;
                             if(add_greentime>=max_greentime)
                             {
                                ensensor_flag = 0;
                                sensor_car_flag = 0;
                                add_greentime = max_greentime;
                             }
                             step_time = 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;
                             now_step_key=now_step_key-sensor_distance;
                           //  lastcarnumber = 0;
                           //  carnumber=0;
                         }
                     }
                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])
              { 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]) //当前倒计时处于黄灯时间范围内
              { clear_flag=1;
                clear_force=1;

⌨️ 快捷键说明

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