📄 ext1.lst
字号:
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 + -