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

📄 searchsch.lst

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 185          {
 186   1         uchar i,j,k;
 187   1         uint xdata toto;
 188   1         uint xdata phasek;
 189   1      
 190   1         uint xdata addr_exange;
 191   1         uint xdata addr_sch;
 192   1      
 193   1         uchar h,m,sh,num,w,s,sum;
 194   1         uchar idd,tmod;
 195   1         uint t[16];
 196   1      
 197   1         unsigned long xdata now_colock,time_d;
 198   1         for(i=0;i<16;i++)t[i]=5;
 199   1         EA=0;
 200   1         per_count++;
 201   1         if(per_count>100)per_count=100;
 202   1         now_day_planid = search_day_plan();                        //查找日计划表号
 203   1         if(now_day_planid==0)
 204   1         {
 205   2          now_day_planid=1;
 206   2         }
 207   1         else if(now_day_planid<=32)
 208   1         {
 209   2            now_schemeid = search_scheme();                         //查找方案号
 210   2        //    if(loop_error_flag==1)now_schemeid=32;                  //如果当前相位全部检测器都出现故障,降级为
             -方案32
 211   2            baseaddr_now_schemesch = 0x5E83+41*(now_schemeid-1);
 212   2            now_step_schid = XBYTE[baseaddr_now_schemesch];         //当前阶段表号
 213   2            step_num = XBYTE[0x5243+(now_step_schid-1)*98];
 214   2            XBYTE[baseaddr_now_schemesch+1]=step_num;             //当前阶段数
 215   2      
 216   2            baseaddr_now_stepsch = 0x5243+98*(now_step_schid-1);
 217   2            now_phase_schid = XBYTE[baseaddr_now_stepsch+3];          //当前相位表号
 218   2            if(now_phase_schid==0)
 219   2            {
 220   3               baseaddr_now_phasesch = 0x5001;
 221   3            }
 222   2            else if(now_phase_schid==1)
 223   2            {
 224   3               baseaddr_now_phasesch = 0x5122;
 225   3            }
 226   2      
 227   2            for(i=0; i<step_num; i++){sensor_step[i] = 0;}            //lq          //感应阶段标志置成0先
 228   2      
 229   2            for(i=0; i<step_num; i++)
 230   2            {
 231   3               k = 3*i;
 232   3               addr_temp=baseaddr_now_stepsch+k;
 233   3               inuse_phase_temp = XBYTE[addr_temp+1];      //baseaddr_now_stepsch:阶段表基址
 234   3               inuse_phase_temp = inuse_phase_temp<<8;
 235   3               inuse_phase[i] = (inuse_phase_temp|XBYTE[addr_temp+2]);   //阶段用到的相位
 236   3      
 237   3               if(i<step_num-1)
 238   3               {
 239   4                  inuse_phase_temp = XBYTE[baseaddr_now_stepsch+4+k];
 240   4                  inuse_phase_temp = inuse_phase_temp<<8;
C51 COMPILER V6.02  SEARCHSCH                                                              09/28/2006 21:46:50 PAGE 5   

 241   4                  inuse_phasen[i] = inuse_phase_temp|XBYTE[baseaddr_now_stepsch+5+k]; //下个阶段用到的相位
 242   4                  inuse_phasen[i] = inuse_phasen[i]&inuse_phase[i];            //当前和下个阶段都用到的相位
 243   4                  inuse_phasen1[i] = ~inuse_phasen[i];
 244   4                  inuse_phase1[i]  = inuse_phase[i]&inuse_phasen1[i];          //去掉下个阶段用到的相位
 245   4               }
 246   3               else          //最后阶段的下一个阶段为第一个阶段
 247   3               {
 248   4                  //inuse_phasen[i] = 0;
 249   4                  //inuse_phase1[i] = inuse_phase[i];
 250   4      
 251   4                  inuse_phase_temp = XBYTE[baseaddr_now_stepsch+1];
 252   4                  inuse_phase_temp = inuse_phase_temp<<8;
 253   4                  inuse_phasen[i] = inuse_phase_temp|XBYTE[baseaddr_now_stepsch+2]; //下个阶段用到的相位
 254   4                  inuse_phasen[i] = inuse_phasen[i]&inuse_phase[i];            //当前和下个阶段都用到的相位
 255   4                  inuse_phasen1[i] = ~inuse_phasen[i];
 256   4                  inuse_phase1[i]  = inuse_phase[i]&inuse_phasen1[i];          //去掉下个阶段用到的相位
 257   4               }
 258   3      
 259   3              for(j=0; j<16; j++)
 260   3               {
 261   4                 phasek = 18*j;
 262   4                 toto = 0x0001;
 263   4                 toto = toto<<j;
 264   4                  inuse_phase_temp = toto&inuse_phase1[i];
 265   4              //    inuse_phase_temp = toto&inuse_phase1[j];
 266   4                 if(inuse_phase_temp!=0)
 267   4                  {   //////////////////////////////////////////////////////////////////////////
 268   5                     if(XBYTE[baseaddr_now_phasesch+11+phasek]!=0)
 269   5                                             sensor_step[i] = 1;// && ((XBYTE[baseaddr_now_phasesch+2+phasek]&0x
             -04)!=0x04))     //感应间隔不为0,即为感应相位
 270   5                      //  sensor_step[j] = 1;
 271   5                 }
 272   4      
 273   4               }
 274   3            }
 275   2            if(start_counter>10){
 276   3                       step_counter = 0;
 277   3                       now_step_key = 0;
 278   3                       sensor_virgin_flag = 1;
 279   3                       now_phase_status = 0;
 280   3                                 }
 281   2            if(XBYTE[0X8021]==0X00){
 282   3                       step_counter = 0;
 283   3                       now_step_key = 0;
 284   3                       sensor_virgin_flag = 1;
 285   3                       now_phase_status = 0;
 286   3                               }else{  //////////////////////////////////////////相位差处理
 287   3               if(start_counter<10){
 288   4                   for(i=0;i<24;i++){
 289   5                         period_start[i]=0x00000000;
 290   5                         sssch[24]=0;
 291   5                                     }
 292   4                   addr_temp = 0x63a4+74*(now_day_planid-1);       //当前日计划表基地址
 293   4                   period_start[0]=0X00;//240*60;          //协调的标准时间是0点
 294   4                   for(i=0;i<timeid;i++){ //各时段开始时间 以秒为单位记
 295   5                         addr_exange=(addr_temp+i*3);
 296   5                         h=XBYTE[addr_exange];
 297   5                         m=XBYTE[addr_exange+1];
 298   5                         if(h*60+m>1092)period_start[i+1]=64800+((h-18)*3600+m*60);
 299   5                                   else period_start[i+1]=(h*3600+m*60);//((h*60+m)*60);   //各时段开始时间 以秒
             -为单位记
 300   5                         sh=XBYTE[addr_exange+2];                           //时段对应的方案号
C51 COMPILER V6.02  SEARCHSCH                                                              09/28/2006 21:46:50 PAGE 6   

 301   5                         sssch[i]=sh;
 302   5                         addr_sch=0x5e82+41*(sh-1);                         //方案的基地址
 303   5                         num=XBYTE[addr_sch+2];
 304   5                         t_sch[i]=0;                            //本方案的阶段数
 305   5                         for(w=0;w<num;w++){
 306   6                                   t_sch[i]=t_sch[i]+XBYTE[addr_sch+w+9];            //计算每时段对应方案的周期
 307   6                                            }
 308   5                                      }
 309   4      
 310   4                         for(i=timeid;i>0;i--){
 311   5                                   t_sch[i]=t_sch[i-1];             //循环向后移1位
 312   5                                   sssch[i]=sssch[i-1];
 313   5                                               }
 314   4                                   t_sch[0]=t_sch[timeid];        //最后的移到最前
 315   4                                   sssch[0]=sssch[timeid];
 316   4                         for(i=0;i<timeid;i++){
 317   5                                dlt[i]=(period_start[i+1]-period_start[i])%t_sch[i];//时段总秒数对周期取余数
 318   5                                period_start[i+1]=period_start[i+1]+dlt[i];         //时段真正的开始时间
 319   5                                               }
 320   4      
 321   4                 h=XBYTE[0Xc004];
 322   4                 m=XBYTE[0XC002];
 323   4                 s=XBYTE[0XC000];
 324   4                 s=s+XBYTE[0X8021];   //
 325   4                 if(h*60+m>1092){
 326   5                     now_colock=64800+((h-18)*3600+m*60)+s;
 327   5                                 }else now_colock=h*3600+m*60+s;
 328   4                 i=0;
 329   4                 do{
 330   5                    i++;
 331   5      
 332   5                    }while((now_colock>=period_start[i])&&(period_start[i]!=0x00));
 333   4                     idd=i-1;          //判断当前时段  相位差已经起作用
 334   4                     time_d= now_colock-period_start[idd]; //当前时间与本阶段开始时间的时间差
 335   4                     tmod=time_d%t_sch[idd];               //周期的余数
 336   4                     addr_sch=0x5e82+41*(sssch[idd]-1);    //本阶段方案基本地址
 337   4                     num=XBYTE[addr_sch+2];                //阶段数
 338   4                 i=0;sum=0;
 339   4                 do{
 340   5                    i++;
 341   5      
 342   5                    sum=sum+XBYTE[addr_sch+i+8];
 343   5                    }while(tmod>=sum);
 344   4                 step_counter=i-1;     //当前所应处的阶段
 345   4                 step_time=XBYTE[addr_sch+i+8];
 346   4      
 347   4                 if(i==0x01)now_step_key=tmod;
 348   4                       else now_step_key=(tmod+XBYTE[addr_sch+i+8]-sum);
 349   4                 now_phase_status = 0;
 350   4                 EA=1;
 351   4                                     }
 352   3                            }
 353   2      
 354   2      
 355   2            use_phase = 0;                 //整个阶段用到的相位
 356   2            for(i=0; i<step_num; i++)
 357   2            {
 358   3               // toto = 0x0001;
 359   3                toto = (0x0001<<i);
 360   3                use_phase = (use_phase|inuse_phase[i]);                 //整个阶段用到的相位
 361   3            }
 362   2            use_lamp = 0;                  //整个阶段用到的灯组
C51 COMPILER V6.02  SEARCHSCH                                                              09/28/2006 21:46:50 PAGE 7   

 363   2            addr_temp=baseaddr_now_phasesch;
 364   2            lai_temp=0;
 365   2      
 366   2           /*
 367   2            for(i=0;i<16;i++){
 368   2               addr_temp=18*i;
 369   2               addr_temp=addr_temp+baseaddr_now_phasesch;
 370   2               g=XBYTE[addr_temp];
 371   2               l=XBYTE[addr_temp+1];
 372   2               toto = (0x0001<<i);
 373   2               if((toto&use_phase)!=0)t[i]=((g<<8)|l);
 374   2                             }   */

⌨️ 快捷键说明

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