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

📄 ext1.lst

📁 一个分选系统的软件:用SmallRtos操作系统
💻 LST
📖 第 1 页 / 共 2 页
字号:
 270   5                          bit all_cell_full=0;
 271   5                          P4|=0xAA;
 272   5                          P5|=0xAA;
 273   5                          P6|=0xAA;
 274   5                          P7|=0xAA;
 275   5                          P3|=0xAA;
 276   5                          P2|=0xAA;
 277   5                          WorkStepInit(CHARGE);
 278   5                          SetupDA();
 279   5                          while(all_cell_full==0)//等所有电池充满或超时
 280   5                          {
 281   6                              OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
 282   6                              all_cell_full=1;
 283   6                              for(i=0;i<24;i++)
 284   6                              {
 285   7                                  if(Cell[i].s == CHARGE)
 286   7                                  {
 287   8                                      all_cell_full=0;
 288   8                                  }
 289   7                                  if(Cell[i].i < WorkStep[CurrentWorkStep].limit)
 290   7                                  {
 291   8                                      DAIBuf[i] = 0;
 292   8                                      Cell[i].s = CURRENTOVER;//当前工步完成
 293   8                                      Cell[i].t = 0;
 294   8                                  }
 295   7                              }
 296   6                              if(WorkStep[CurrentWorkStep].t < Second)
 297   6                              {
 298   7                                  ClearDA();
 299   7                                  all_cell_full = 1;
 300   7                              }
 301   6                          }//while(all_cell_full==0)//等所有电池充满或超时
 302   5                      }break;//case 2://充电
C51 COMPILER V7.06   EXT1                                                                  05/25/2004 14:50:46 PAGE 6   

 303   4                      case 3://放电
 304   4                      {
 305   5                          bit all_cell_over=0;
 306   5                          P4&=0x55;
 307   5                          P5&=0x55;
 308   5                          P6&=0x55;
 309   5                          P7&=0x55;
 310   5                          P3&=0x55;
 311   5                          P2&=0x55;
 312   5                          WorkStepInit(DISCHARGE);
 313   5                          SetupDA();
 314   5                          while(all_cell_over==0)//等所有电池放干或超时
 315   5                          {
 316   6                              OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
 317   6                              all_cell_over=1;
 318   6                              for(i=0;i<24;i++)
 319   6                              {
 320   7                                  if(Cell[i].s == DISCHARGE)
 321   7                                  {
 322   8                                      all_cell_over=0;
 323   8                                  }
 324   7                                  if(CurrentWorkStep <= SumWorkStep)
 325   7                                  {
 326   8                                      if(Cell[i].u < WorkStep[CurrentWorkStep].limit)
 327   8                                      {
 328   9                                          DAIBuf[i] = 0;
 329   9                                          Cell[i].s = CURRENTOVER;
 330   9                                          Cell[i].t = 0;
 331   9                                      }
 332   8                                  }
 333   7                              }
 334   6                              if(WorkStep[CurrentWorkStep].t < Second)
 335   6                              {
 336   7                                  ClearDA();
 337   7                                  all_cell_over = 1;
 338   7                              }
 339   6                          }//while(all_cell_over==0)//等所有电池放干或超时
 340   5                      }break;//case 3://放电
 341   4                  }//switch(WorkStep[i].type)
 342   3              }//for(i=0;i<SumStep;i++)
 343   2          }//while(1)
 344   1      }//void TaskWorkStep(void)
 345          /*********************************************************************************************************
 346          ** 函数名称: TaskCalcCapa
 347          ** 功能描述: 容量积分,每秒钟处理一次,同时将每只电池当前状态持续时间加1
 348          ** 输 入:   无
 349          ** 输 出:   无
 350          ** 全局变量: Cell[i].c Cell[i].i
 351          ** 调用模块: OSWait
 352          **
 353          ** 作 者: 刘宝贵
 354          ** 日 期: 2004年4月29日22:07
 355          **-------------------------------------------------------------------------------------------------------
 356          ** 修改人:
 357          ** 日 期:
 358          **-------------------------------------------------------------------------------------------------------
 359          *********************************************************************************************************/
 360          void TaskCalcCapa(void)
 361          {
 362   1          uint8 data i;
 363   1          while (1)
 364   1          {
C51 COMPILER V7.06   EXT1                                                                  05/25/2004 14:50:46 PAGE 7   

 365   2              OSWait(K_SIG,0);//等一秒
 366   2              for(i=0;i<24;i++)
 367   2              {
 368   3                  OS_ENTER_CRITICAL();
 369   3                  Cell[i].c+=Cell[i].i;
 370   3                  Cell[i].t++;
 371   3                  OS_EXIT_CRITICAL();
 372   3              }
 373   2              OSSemPend(IICSem,0);
 374   2              EepromWriteByte(SecondIICBase,(uint8)(Second>>8));
 375   2              EepromWriteByte(SecondIICBase+1,(uint8)(Second));
 376   2      
 377   2              EepromWriteByte(CurrentWorkStepIICBase,CurrentWorkStep);
 378   2              OSSemPost(IICSem);
 379   2              for(i=0;i<24;i++)
 380   2              {
 381   3                  OSSemPend(IICSem,0);
 382   3      
 383   3                  EepromWriteWord(Cell_CIICBase+i*4+0,(uint16)(Cell[i].c>>16));
 384   3                  EepromWriteWord(Cell_CIICBase+i*4+2,(uint16)(Cell[i].c));
 385   3      
 386   3                  EepromWriteWord(Cell_TIICBase + i*2, Cell[i].t);
 387   3      
 388   3                  EepromWriteByte(Cell_SIICBase + i,   Cell[i].s);
 389   3      
 390   3                  OSSemPost(IICSem);
 391   3              }
 392   2          }
 393   1      }
 394          /********************************************************************************************************/
 395          void TaskE(void)
 396          {
 397   1          while (1)
 398   1          {
 399   2              OSWait(K_TMO,(40*OS_TICKS_PER_SEC)/1000);
 400   2          }
 401   1      }
 402          /********************************************************************************************************/
 403          void TaskF(void)
 404          {
 405   1          while (1)
 406   1          {
 407   2              OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
 408   2          }
 409   1      }
 410          /********************************************************************************************************/
 411          void TaskG(void)
 412          {
 413   1          while (1)
 414   1          {
 415   2              OSWait(K_TMO,(30*OS_TICKS_PER_SEC)/1000);
 416   2          }
 417   1      }
 418          /********************************************************************************************************/
 419          void TaskH(void)
 420          {
 421   1          while (1)
 422   1          {
 423   2              OSWait(K_TMO,(100*OS_TICKS_PER_SEC)/1000);
 424   2              LED =! LED ;
 425   2          }
 426   1      }
C51 COMPILER V7.06   EXT1                                                                  05/25/2004 14:50:46 PAGE 8   

 427          /********************************************************************************************************/
 428          void t2int(void) interrupt 5 
 429          {
 430   1          TF2=0;
 431   1      }
 432          /*********************************************************************************************************
 433          ** 函数名称: UserTickTimer
 434          ** 功能描述: 本函数每个节拍在中断中执行一次,用于处理周期性的工作
 435          ** 输 入:   无
 436          ** 输 出:   无
 437          ** 全局变量: AdBuf Cell 
 438          ** 调用模块: midst OSWait da
 439          **
 440          ** 作 者: 刘宝贵
 441          ** 日 期: 2004年4月28日
 442          **-------------------------------------------------------------------------------------------------------
 443          ** 修改人:
 444          ** 日 期:
 445          **-------------------------------------------------------------------------------------------------------
 446          *********************************************************************************************************/
 447          void UserTickTimer(void)            /* 系统定时中断中调用的用户函数                                */
 448          {
 449   1          static uint8 data timer=0;
 450   1          static uint8 data i=0,j=0;
 451   1          uint8 code adchannel[48]=
 452   1          {
 453   1              0x70,0x50,0x30,0x10,0x71,0x51,0x31,0x11, 0x72,0x52,0x32,0x12,0x73,0x53,0x33,0x13,
 454   1              0x74,0x54,0x34,0x14,0x75,0x55,0x35,0x15, 0x60,0x40,0x20,0x00,0x61,0x41,0x21,0x01,
 455   1              0x62,0x42,0x22,0x02,0x63,0x43,0x23,0x03, 0x64,0x44,0x24,0x04,0x65,0x45,0x25,0x05,
 456   1          };//每一路模拟采样对应通道控制字:控制CD4051的A,B,C(高四位)和C8051F020片内的AD通道选择(低四位)
 457   1          timer++;
 458   1          if(timer==200)//每秒钟所做处理。
 459   1          {
 460   2              timer=0;
 461   2              Second++;
 462   2              SecondFlag=1;
 463   2              OSIntSendSignal(TaskCalcCapa_ID);
 464   2          }
 465   1          //以下是对AD通道的处理
 466   1          AD_CS=(bit)(adchannel[i]<<1 & 0x80);
 467   1          AD_BS=(bit)(adchannel[i]<<2 & 0x80);
 468   1          AD_AS=(bit)(adchannel[i]<<3 & 0x80);
 469   1          AMX0SL=adchannel[i]&0x0f;//channel select 
 470   1          i++;
 471   1          if(i == 48)
 472   1          {
 473   2              j++;
 474   2              j%=5;
 475   2              i=0;
 476   2              OSIntSendSignal(TaskAD_ID);
 477   2          }
 478   1          ADBuf[i*5+j]=ADC0H*256+ADC0L;
 479   1          AD0INT=0;
 480   1          AD0BUSY=1;
 481   1          //以下是对DA通道的处理
 482   1          if(WorkStep[CurrentWorkStep].type == STOP || WorkStep[CurrentWorkStep].type == HALT)//静止或停止
 483   1          {
 484   2              da(0,0);
 485   2              da(0,1);
 486   2              P4  = 0xFF;
 487   2              P5 |= 0x0F;
 488   2              P2 |= 0xF0;
C51 COMPILER V7.06   EXT1                                                                  05/25/2004 14:50:46 PAGE 9   

 489   2              P1 |= 0xFF;
 490   2          }
 491   1          else//充电或放电
 492   1          {
 493   2              if(i%2==0)
 494   2              {
 495   3                  P4 &=0xAA;
 496   3                  P5 &=0xAA;
 497   3                  P6 &=0xAA;
 498   3                  P7 &=0xAA;
 499   3                  P3 &=0xAA;
 500   3                  P2 &=0xAA;//所有DA_EN脚均为0,使所有398处于保持状态
 501   3                  da(DAUBuf[i/2],0);
 502   3                  da(DAIBuf[i/2],1);
 503   3                  switch(i/2)
 504   3                  {
 505   4                      case   0: P4|= 0x01; break;
 506   4                      case   1: P4|= 0x04; break;
 507   4                      case   2: P4|= 0x10; break;
 508   4                      case   3: P4|= 0x40; break;
 509   4                      case   4: P5|= 0x01; break;
 510   4                      case   5: P5|= 0x04; break;
 511   4                      case   6: P5|= 0x10; break;
 512   4                      case   7: P5|= 0x40; break;
 513   4                      case   8: P6|= 0x01; break;
 514   4                      case   9: P6|= 0x04; break;
 515   4                      case  10: P6|= 0x10; break;
 516   4                      case  11: P6|= 0x40; break;
 517   4                      case  12: P7|= 0x01; break;
 518   4                      case  13: P7|= 0x04; break;
 519   4                      case  14: P7|= 0x10; break;
 520   4                      case  15: P7|= 0x40; break;
 521   4                      case  16: P3|= 0x01; break;
 522   4                      case  17: P3|= 0x04; break;
 523   4                      case  18: P3|= 0x10; break;
 524   4                      case  19: P3|= 0x40; break;
 525   4                      case  20: P2|= 0x01; break;
 526   4                      case  21: P2|= 0x04; break;
 527   4                      case  22: P2|= 0x10; break;
 528   4                      case  23: P2|= 0x40; break;
 529   4                  }//switch(i/2)
 530   3              }//if(i%2==0)
 531   2          }
 532   1      }
 533          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2705    ----
   CONSTANT SIZE    =     63    ----
   XDATA SIZE       =   ----     104
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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