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

📄 ldfxmain.lst

📁 一个分选系统的软件:用SmallRtos操作系统
💻 LST
📖 第 1 页 / 共 3 页
字号:
 210          ** 日 期:
 211          **-------------------------------------------------------------------------------------------------------
 212          *********************************************************************************************************/
 213          void TaskWorkStep(void)
 214          {
 215   1          uint8 i;
 216   1          OSSemCreate(IICSem,1);           //实现IIC总线的互斥
 217   1          OSSemCreate(StartWorkStepSem,0); //工步执行报文下发与工步执行同步
 218   1          OSSemCreate(StopWorkStepSem, 0); //工步停止报文下发与工步停止同步
 219   1          OSSemCreate(StartCellCheckSem,0);//对点执行报文下发与对点执行同步
 220   1          OSSemCreate(StopCellCheckSem, 0);//        报文下发与对点停止同步
 221   1          while (1)
 222   1          {
 223   2      TaskWorkStepBegin:
 224   2              if(CurrentWorkStep == 0)//CurrentWorkStep==0表示停止
 225   2              {
 226   3                  OSSemPend(StartWorkStepSem,0);
 227   3                  for(i=0;i<156;i++)//清空平台电压时间数据
 228   3                  {
 229   4                      OSSemPend(IICSem,0);
 230   4                      EepromWriteWord(ReferenceUIICBase + i*2, 0);
 231   4                      EepromWriteWord(ReferenceUIICBase + 312 + i*2, 0);
 232   4                      OSSemPost(IICSem);
 233   4                  }
 234   3              }
 235   2              for(;CurrentWorkStep <= SumWorkStep; CurrentWorkStep++)
 236   2              {
 237   3                  switch(WorkStep[CurrentWorkStep].type)
 238   3                  {
 239   4                      case 0://停止
 240   4                      {
C51 COMPILER V7.06   LDFXMAIN                                                              11/19/2004 13:36:18 PAGE 5   

 241   5                          da(0,0);
 242   5                          da(0,1);
 243   5                          P4 |=0xFF;
 244   5                          P5 |=0x0F;
 245   5                          P2 |=0xF0;
 246   5                          P1 |=0xFF;//所有DA_EN脚均为1,使所有398处于采样状态,把所有DA清为0
 247   5                          JDQ = 1;
 248   5                          CurrentWorkStep = 0;
 249   5                          WorkStepInit(STOP);                    
 250   5                          goto TaskWorkStepBegin;
 251   5                      }break;
 252   4                      case 1://静置
 253   4                      {
 254   5                          da(0,0);
 255   5                          da(0,1);
 256   5                          P4 |=0xFF;
 257   5                          P5 |=0x0F;
 258   5                          P2 |=0xF0;
 259   5                          P1 |=0xFF;//所有DA_EN脚均为1,使所有398处于采样状态,把所有DA清为0
 260   5                          JDQ = 0;
 261   5                          WorkStepInit(HALT);
 262   5                          while(WorkStep[CurrentWorkStep].t > Second)
 263   5                          {
 264   6                              if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
 265   6                              {
 266   7                                  CurrentWorkStep = SumWorkStep - 1;
 267   7                                  break;
 268   7                              }
 269   6                              OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
 270   6                          }
 271   5                      }break;
 272   4                      case 2://充电
 273   4                      {
 274   5                          bit all_cell_full=0;
 275   5                          ClearDA();//
 276   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 277   5                          JDQ = 0;
 278   5                          WorkStepInit(CHARGE);
 279   5                          SetupDA();
 280   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 281   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 282   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 283   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 284   5                          while(all_cell_full==0)//等所有电池充满或超时
 285   5                          {
 286   6                              if(DaParaChanged)
 287   6                              {
 288   7                                  SetupDA();
 289   7                                  DaParaChanged=0;
 290   7                              }
 291   6                              if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
 292   6                              {
 293   7                                  CurrentWorkStep = SumWorkStep - 1;
 294   7                                  break;
 295   7                              }
 296   6                              OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
 297   6                              all_cell_full=1;
 298   6                              for(i=0;i<24;i++)
 299   6                              {
 300   7                                  if(Cell[i].s == CHARGE)
 301   7                                  {
 302   8                                      all_cell_full=0;
C51 COMPILER V7.06   LDFXMAIN                                                              11/19/2004 13:36:18 PAGE 6   

 303   8                                  }
 304   7                                  if(Cell[i].i < WorkStep[CurrentWorkStep].limit)
 305   7                                  {
 306   8                                      //DAIBuf[i] = 0;//先充完的继续恒压充等时间到或所有都充完
 307   8                                      Cell[i].s = CURRENTOVER;//当前工步完成
 308   8                                      Cell[i].t = 0;
 309   8                                  }
 310   7                              }
 311   6                              if(WorkStep[CurrentWorkStep].t < Second)
 312   6                              {
 313   7                                  ClearDA();
 314   7                                  all_cell_full = 1;
 315   7                              }
 316   6                          }//while(all_cell_full==0)//等所有电池充满或超时
 317   5                      }break;//case 2://充电
 318   4                      case 3://放电
 319   4                      {
 320   5                          bit all_cell_over=0;
 321   5                          ClearDA();
 322   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 323   5                          JDQ = 1;
 324   5                          WorkStepInit(DISCHARGE);
 325   5                          SetupDA();
 326   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 327   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 328   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 329   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 330   5                          while(all_cell_over==0)//等所有电池放干或超时
 331   5                          {
 332   6                              if(DaParaChanged)
 333   6                              {
 334   7                                  SetupDA();
 335   7                                  DaParaChanged=0;
 336   7                              }
 337   6                              if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
 338   6                              {
 339   7                                  CurrentWorkStep = SumWorkStep - 1;
 340   7                                  break;
 341   7                              }
 342   6                              OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
 343   6                              all_cell_over=1;
 344   6                              for(i=0;i<24;i++)
 345   6                              {
 346   7                                  if(Cell[i].s == DISCHARGE)
 347   7                                  {
 348   8                                      all_cell_over=0;
 349   8                                  }
 350   7                                  else if(Cell[i].s == CURRENTOVER)
 351   7                                  {
 352   8                                      DAIBuf[i] = 0;
 353   8                                      DAUBuf[i] = 0;
 354   8                                  }
 355   7                                  if(Cell[i].u < WorkStep[CurrentWorkStep].limit)
 356   7                                  {
 357   8                                      Cell[i].s = CURRENTOVER;
 358   8                                      Cell[i].t = 0;
 359   8                                  }
 360   7                              }
 361   6                              if(WorkStep[CurrentWorkStep].t < Second)
 362   6                              {
 363   7                                  ClearDA();
 364   7                                  all_cell_over = 1;
C51 COMPILER V7.06   LDFXMAIN                                                              11/19/2004 13:36:18 PAGE 7   

 365   7                              }
 366   6                          }//while(all_cell_over==0)//等所有电池放干或超时
 367   5                      }break;//case 3://放电
 368   4                  }//switch(WorkStep[i].type)
 369   3              }//for(i=0;i<SumStep;i++)
 370   2          }//while(1)
 371   1      }//void TaskWorkStep(void)
 372          /*********************************************************************************************************
 373          ** 函数名称: TaskCalcCapa
 374          ** 功能描述: 容量积分,每秒钟处理一次,同时将每只电池当前状态持续时间加1,
 375                       在放电过程中,将每只电池每隔100mV电压变化的时间存入F24C16
 376          ** 输 入:   无
 377          ** 输 出:   无
 378          ** 全局变量: Cell[i].c Cell[i].i
 379          ** 调用模块: OSWait
 380          **
 381          ** 作 者: 刘宝贵
 382          ** 日 期: 2004年4月29日22:07
 383          **-------------------------------------------------------------------------------------------------------
 384          ** 修改人: 刘宝贵
 385          ** 日 期: 2004年10月25日16:00
 386          ** 内  容:在电池放电过程中,电池电压每下降100mV记录一次到达这个电压值的时间
 387          **-------------------------------------------------------------------------------------------------------
 388          *********************************************************************************************************/
 389          void TaskCalcCapa(void)
 390          {
 391   1          uint8 data   i;
 392   1          uint8 xdata  count = 0;
 393   1          while (1)
 394   1          {
 395   2              OSWait(K_SIG,0);//等一秒
 396   2              Address = P7 & 0x7F;//读本机地址
 397   2              if(CommCounter<255)
 398   2                  CommCounter++;
 399   2              if(CommCounter>240 && CurrentWorkStep != 0)
 400   2                  OSSemPost(StopWorkStepSem);
 401   2              for(i=0;i<24;i++)
 402   2              {
 403   3                  OS_ENTER_CRITICAL();
 404   3                  Cell[i].c+=Cell[i].i;
 405   3                  Cell[i].t++;
 406   3                  OS_EXIT_CRITICAL();
 407   3              }
 408   2              OSSemPend(IICSem,0);
 409   2              EepromWriteByte(SecondIICBase,(uint8)(Second>>8));
 410   2              EepromWriteByte(SecondIICBase+1,(uint8)(Second));
 411   2      
 412   2              EepromWriteByte(CurrentWorkStepIICBase,CurrentWorkStep);
 413   2              OSSemPost(IICSem);
 414   2              for(i=0;i<24;i++)
 415   2              {
 416   3                  OSSemPend(IICSem,0);
 417   3      
 418   3                  EepromWriteWord(Cell_CIICBase+i*4+0,(uint16)(Cell[i].c>>16));
 419   3                  EepromWriteWord(Cell_CIICBase+i*4+2,(uint16)(Cell[i].c));
 420   3      
 421   3                  EepromWriteWord(Cell_TIICBase + i*2, Cell[i].t);
 422   3      
 423   3                  EepromWriteByte(Cell_SIICBase + i,   Cell[i].s);
 424   3      
 425   3                  OSSemPost(IICSem);
 426   3              }//for(i=0;i<24;i++)
C51 COMPILER V7.06   LDFXMAIN                                                              11/19/2004 13:36:18 PAGE 8   

⌨️ 快捷键说明

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