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

📄 ldfxmain.lst

📁 一个分选系统的软件:用SmallRtos操作系统
💻 LST
📖 第 1 页 / 共 3 页
字号:
 235   4                      case 1://静置
 236   4                      {
 237   5                          da(0,0);
 238   5                          da(0,1);
 239   5                          P4 |=0xFF;
 240   5                          P5 |=0x0F;
C51 COMPILER V7.06   LDFXMAIN                                                              06/06/2005 16:32:36 PAGE 5   

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

 303   5                          for(i=0;i<24;i++)
 304   5                          {
 305   6                              Cell[i].s = CURRENTOVER; 
 306   6                          }
 307   5                          OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);//等待所有AD通道电流变为0
 308   5                          OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);
 309   5                          OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);
 310   5                      }break;//case 2://充电
 311   4                      case 3://放电
 312   4                      {
 313   5                          bit all_cell_over = 0;
 314   5                          bit change_flag   = 1;
 315   5                          //以下部分等程序用于确定是不清空平台电压数据
 316   5                          for(i=0;i<24;i++)
 317   5                          {
 318   6                              if(Cell[i].s == DISCHARGE)//如果电池状态为放电说明是掉电续接所以不清空平台时间数据
 319   6                              {
 320   7                                  change_flag = 0;
 321   7                                  break;
 322   7                              }
 323   6                          }
 324   5                          //以上部分等程序用于确定是不清空平台电压数据
 325   5                          WorkStepInit(DISCHARGE);
 326   5                          //以下部分等程序用于清空平台数据
 327   5                          if(change_flag)
 328   5                          {
 329   6                              for(i=0;i<156;i++)//清空平台电压时间数据
 330   6                              {
 331   7                                  OSSemPend(IICSem,0);
 332   7                                  EepromWriteWord(ReferenceUTimeIICBase + i*2, 0);
 333   7                                  EepromWriteWord(ReferenceUTimeIICBase + 312 + i*2, 0);
 334   7                                  OSSemPost(IICSem);
 335   7                              }
 336   6                              for(i=0;i<24;i++)//清空平台电压数据
 337   6                              {
 338   7                                  ReferenceU[i]=38000;
 339   7                                  OSSemPend(IICSem,0);
 340   7                                  EepromWriteWord(ReferenceUIICBase + i*2, 38000);
 341   7                                  OSSemPost(IICSem);
 342   7                              }
 343   6                          }
 344   5                          //以上部分等程序用于清空平台数据
 345   5                          ClearDA();
 346   5                          OSWait(K_TMO,(450*OS_TICKS_PER_SEC)/1000);
 347   5                          JDQ = 1;
 348   5                          OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
 349   5      //                    WorkStepInit(DISCHARGE);
 350   5                          SetupDA();
 351   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 352   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 353   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 354   5                          OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
 355   5                          while(all_cell_over==0)//等所有电池放干或超时
 356   5                          {
 357   6                              if(DaParaChanged)
 358   6                              {
 359   7                                  SetupDA();
 360   7                                  DaParaChanged=0;
 361   7                              }
 362   6                              if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
 363   6                              {
 364   7                                  CurrentWorkStep = SumWorkStep - 1;
C51 COMPILER V7.06   LDFXMAIN                                                              06/06/2005 16:32:36 PAGE 7   

 365   7                                  break;
 366   7                              }
 367   6                              OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
 368   6                              CellCheckFlag  = 0;
 369   6                              all_cell_over=1;
 370   6                              for(i=0;i<24;i++)
 371   6                              {
 372   7                                  if(Cell[i].s == DISCHARGE && Cell[i].i > 100)//如果电池状态为放电并且电流大于1
             -0毫安
 373   7                                  {
 374   8                                      all_cell_over=0;
 375   8                                  }
 376   7                                  if(ReferenceU[i] > 26000 && DAIBuf[i] > 0 && Cell[i].u < WorkStep[CurrentWorkS
             -tep].limit)//电池放完,进行状态转换
 377   7                                  {
 378   8                                      OSSemPend(IICSem,0);//保存分容信息
 379   8                                      EepromWriteWord(ReferenceUTimeIICBase + ((38000 - WorkStep[CurrentWorkStep
             -].limit)/1000)*48 + i*2, Cell[i].t);
 380   8                                      ReferenceU[i] = 26000;
 381   8                                      EepromWriteWord(ReferenceUIICBase + i*2, ReferenceU[i]);
 382   8                                      OSSemPost(IICSem);
 383   8                                      DAIBuf[i] = 0;
 384   8                                      DAUBuf[i] = 0;
 385   8                                      Cell[i].t = 0;
 386   8                                  }
 387   7                                  if(DAIBuf[i] == 0 && DAUBuf[i] == 0 && Cell[i].t > 3)
 388   7                                  {
 389   8                                      Cell[i].s = CURRENTOVER;
 390   8                                  }
 391   7                              }
 392   6                              if(WorkStep[CurrentWorkStep].t < Second)
 393   6                              {
 394   7                                  ClearDA();
 395   7                                  all_cell_over = 1;
 396   7                              }
 397   6      
 398   6                          }//while(all_cell_over==0)//等所有电池放干或超时
 399   5                          for(i=0;i<24;i++)
 400   5                          {
 401   6                              Cell[i].s = CURRENTOVER; 
 402   6                          }
 403   5                          OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);//等待所有AD通道电流变为0
 404   5                          OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);
 405   5                          OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);
 406   5                      }break;//case 3://放电
 407   4                  }//switch(WorkStep[i].type)
 408   3              }//for(i=0;i<SumStep;i++)
 409   2          }//while(1)
 410   1      }//void TaskWorkStep(void)
 411          /*********************************************************************************************************
 412          ** 函数名称: TaskCalcCapa
 413          ** 功能描述: 容量积分,每秒钟处理一次,同时将每只电池当前状态持续时间加1,
 414                       在放电过程中,将每只电池每隔100mV电压变化的时间存入F24C16
 415          ** 输 入:   无
 416          ** 输 出:   无
 417          ** 全局变量: Cell[i].c Cell[i].i
 418          ** 调用模块: OSWait
 419          **
 420          ** 作 者: 刘宝贵
 421          ** 日 期: 2004年4月29日22:07
 422          **-------------------------------------------------------------------------------------------------------
 423          ** 修改人: 刘宝贵
C51 COMPILER V7.06   LDFXMAIN                                                              06/06/2005 16:32:36 PAGE 8   

 424          ** 日 期: 2004年10月25日16:00
 425          ** 内  容:在电池放电过程中,电池电压每下降100mV记录一次到达这个电压值的时间
 426          **-------------------------------------------------------------------------------------------------------
 427          *********************************************************************************************************/
 428          void TaskCalcCapa(void)
 429          {
 430   1          uint8 data   i;
 431   1          uint8 xdata count=0;
 432   1          uint8 xdata bhcount[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 433   1          while (1)
 434   1          {
 435   2              OSWait(K_SIG,0);//等一秒
 436   2              Address = P7 & 0x3F;//读本机地址
 437   2              //通信中断处理 begin
 438   2              CommCounter++;
 439   2              if(CommCounter>120 && CommCounter < 150 && CurrentWorkStep != 0)//如果通信断2分钟FMQ报警,报警时长
             -30秒
 440   2              {
 441   3                  ALARMLED = 1;//ON
 442   3                  FMQ = 0;     //ON
 443   3              }
 444   2              else
 445   2              {
 446   3                  FMQ = 1;     //OFF
 447   3              }
 448   2              if(CommCounter>420 && CurrentWorkStep != 0)//如果通信断7分钟,本机停止工步执行。
 449   2                  OSSemPost(StopWorkStepSem);
 450   2              //通信中断处理 end
 451   2              //容量积算处理 begin
 452   2              for(i=0;i<24;i++)
 453   2              {
 454   3                  OS_ENTER_CRITICAL();
 455   3                  Cell[i].c+=Cell[i].i;
 456   3                  Cell[i].t++;
 457   3                  OS_EXIT_CRITICAL();
 458   3              }
 459   2              //容量积算处理 end
 460   2              //软件电压保护电流保护处理begin
 461   2              if(P7 < 64)//地址码最高位为硬件过压保护测试位1:电压DA给最大值,0:给正常值;
 462   2              {          //次高位为软件过压保护控制位1:不使能软件过压过流保护,0:使能软件过压过流保护
 463   3                  for(i=0;i<24;i++)
 464   3                  {
 465   4                      if(Cell[i].u > 43000 ||Cell[i].u < 10000 || Cell[i].i > (1000 + WorkStep[CurrentWorkStep].
             -i) )//如果过压欠压过流
 466   4                      {
 467   5                          bhcount[i]++;
 468   5                          if(bhcount[i] > 5)//如果过压欠压过流5秒
 469   5                          {
 470   6                              ALARMLED = 1;//ON
 471   6                              DAUBuf[i] = 0;

⌨️ 快捷键说明

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