📄 zhu19200.lst
字号:
299 1 tempFlag1 = RamRom_Convert;
300 1 tempFlag0 = RamIO_Convert; //保护地址状态
301 1 RamRom_Convert=1; //128RAM
302 1 RamIO_Convert=1;//切换RAM与端口
303 1 TL1 = 0xFA;
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 6
304 1 TH1 = 0x3C;
305 1 if( lockFlagDn ) //要求延时,枷锁
306 1 {
307 2 if( DelayCount++>=DelayNms ) //延时N个50ms
308 2 {
309 3 DelayCount=0;
310 3 lockFlagDn=0;
311 3 } //延时时间解锁
312 2 }
313 1 else DelayCount=0;
314 1 if( ReceConFlag ) //收到控制命令闪
315 1 {
316 2 if(ledcount2++>4) //控制灯闪
317 2 {
318 3 led3Flag=!led3Flag;
319 3 ledcount2=0;
320 3 }
321 2 if(ledcount3++>15) //闪灯八次
322 2 {
323 3 ledcount3=1;
324 3 ReceConFlag=0;
325 3 }
326 2 }
327 1 else ledcount2=0;
328 1
329 1 if(ledcount0++>4) //运行灯闪
330 1 {
331 2 led1Flag=!led1Flag;
332 2 ledcount0=0;
333 2 }
334 1 if(ledcount1++>1) //通信灯灭
335 1 {
336 2 led2Flag=1;
337 2 ledcount1=0;
338 2 }
339 1 if(ZhengChCount++>1105*ZhengChJianGe) //曲线历史记录定时*20*60
340 1 {
341 2 ZhengChFlag = 1; //保存正常历史记录间隔为10分钟)
342 2 ZhengChCount = 0; //,测试为1分钟(768/6/24=5.3天
343 2 }
344 1 if( NoReceFlag == 1 ) //20分钟没收发送数据,保存20*60*10=12000
345 1 { //256/2/24=5.3天,测试为2分钟
346 2 if ( ReBaudCount++ > 1105*DuanKaiJianGe )//56次就一分钟了
347 2 {
348 3 ReBaudCount = 0;
349 3 ReBaudFlag = 1; //保存断开历史记录
350 3 }
351 2 }
352 1 else ReBaudCount=0;
353 1 if(KuaiShFlag) //测试512坏,控制灯快闪
354 1 {
355 2 led3Flag=!led3Flag;
356 2 if(led3Kuai++>150)
357 2 {
358 3 led3Kuai=0;
359 3 KuaiShFlag=0;
360 3 led3Flag=1; //闪灯后灭
361 3 }
362 2 }
363 1 if(ManShFlag) //测试512好,控制灯慢闪
364 1 {
365 2 led3Man++;
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 7
366 2 if(led3Man%10==0)
367 2 {
368 3 led3Flag=!led3Flag;
369 3 if(led3Man>150)
370 3 {
371 4 led3Man=0;
372 4 ManShFlag=0;
373 4 led3Flag=1; //闪灯后灭
374 4 }
375 3 }
376 2 }
377 1 NoReceFlag = 1; //在外部中断函数里清零,定时器中断函数置一;
378 1 //不进外部中断发送状态,不发标准位就一直为一
379 1 ledled=AddLed;
380 1 RamRom_Convert= tempFlag1;
381 1 RamIO_Convert = tempFlag0; //恢复地址状态
382 1 }
383
384 void InterruptS() interrupt 4 using 3 //串口中断
385 {
386 1 uchar data ReceByte; //不对端口操作,不用保护端口状态
387 1 bit tempFlag0,tempFlag1;
388 1 tempFlag1 = RamRom_Convert;
389 1 tempFlag0 = RamIO_Convert; //保护地址状态
390 1 RamRom_Convert=1; //128RAM
391 1 RamIO_Convert=1; //切换RAM与端口
392 1 if( RI ) //接收状态
393 1 {
394 2 RI=0;
395 2 ReceByte=SBUF;
396 2 if ( ReceCount0 >= MaxRece0-1 ) //最大接收缓冲区
397 2 {
398 3 ReceCount0 = 0;
399 3 }
400 2 else if ( ReceByte != 0x0D )
401 2 {
402 3 ReceSbuf0[ReceCount0++]=ReceByte;
403 3 }
404 2 else
405 2 {
406 3 ReceSbuf0[ReceCount0++]=ReceByte;
407 3 ReceEndFlag0=1;
408 3 }
409 2 }
410 1 else //发送状态
411 1 {
412 2 TI=0;
413 2 if ( SendCount0 >= MaxSend0-1 ) //发送缓冲区要越界,结束发送
414 2 {
415 3 SendCount0 = 0; //发完一包数据
416 3 TB8=1; //发送完,以便下次发送地址
417 3 }
418 2 else if ( SendSbuf0[SendCount0] != 0x0A )
419 2 {
420 3 _nop_();
421 3 SBUF=SendSbuf0[SendCount0++];
422 3 TB8=0;
423 3 }
424 2 else
425 2 { //发完一包数据
426 3 TB8=1; //发送完,以便下次发送地址
427 3 }
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 8
428 2 }
429 1 RamRom_Convert= tempFlag1;
430 1 RamIO_Convert = tempFlag0; //恢复地址状态
431 1 }
432 void Analyse0() //下行通信解析函数
433 {
434 1 uint i,ReceCheck,SumCheck;//,broadid;
435 1 uint length = 0;
436 1 ReceEndFlag0 = 0; //结束完标志位清零
437 1 lockFlagDn = 0; //开锁
438 1 for( i = 0;i < MaxRece0;i++ ) //计算包长度
439 1 {
440 2 if( ReceSbuf0[i] == '\r')
441 2 {
442 3 length = i + 1; //数据包长度
443 3 break;
444 3 }
445 2 }
446 1 if( length < 10) //无效数据包
447 1 {
448 2 ReceCount0=0; //串口0接收计数器清零
449 2 return;
450 2 }
451 1 SumCheck=CrcCheck( ReceSbuf0,length-5 );//crc读取
452 1 ReceCheck=4096 * toint(ReceSbuf0[length-5]) + 256*toint(ReceSbuf0[length-4]) + 16*toint(ReceSbuf0[length-
-3]) + toint(ReceSbuf0[length-2]);
453 1 if( SumCheck != ReceCheck) //crc校验
454 1 {
455 2 return;
456 2 }
457 1 ReceCheck = 4096*toint(ReceSbuf0[3]) + 256*toint(ReceSbuf0[4]) + 16*toint(ReceSbuf0[5]) + toint(ReceSbuf0
-[6]);
458 1 if(ReceCheck != length-12) //长度校验
459 1 {
460 2 return;
461 2 }
462 1 ReceCheck = 16 * toint(ReceSbuf0[1]) + toint(ReceSbuf0[2]);
463 1 if(ReceCheck != RTdataAns)
464 1 {
465 2 return; //非实时数据响应
466 2 }
467 1 switch( ReceSbuf0[0] ) //收到是那块从模块信息
468 1 {
469 2 case 0x1F://0: //AIDI有AIDI量
470 2 FalseTime0 = 0; //错误次数清零
471 2 memcpy( RealTimeData+6, ReceSbuf0+11, 44 ); //AI量
472 2 memcpy( RealTimeData+12+AIsum, ReceSbuf0+59, B00DI/2 ); //DI量
473 2 break;
474 2 case 0x1E://1: //电池板只有AI量
475 2 FalseTime1 = 0; //错误次数清零
476 2 memcpy( RealTimeData+50, ReceSbuf0+11, B11AI*4 ); //AI量
477 2 break;
478 2 case 0x1D://2: //电池板只有AI量
479 2 FalseTime2 = 0; //错误次数清零
480 2 memcpy( RealTimeData+178, ReceSbuf0+11, B22AI*4 ); //AI量
481 2 break;
482 2 case 0x1C://3: //IP板
483 2 FalseTime3 = 0; //错误次数清零
484 2 memcpy( RealTimeData+306, ReceSbuf0+11, B33AI*4 ); //AI量
485 2 memcpy( RealTimeData+12+AIsum+B00DI/2, ReceSbuf0+15+B33AI*4, B33DI/2 ); //DI量
486 2 break;
487 2 default :
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 9
488 2 break;
489 2 }
490 1
491 1 //2003.12.11;11:46 modify
492 1 RealTimeData[0]=0x38; //AI标号
493 1 RealTimeData[1]=0x30;
494 1 hex2asc1(RealTimeData+2,75+B33AI); //AI通道数
495 1 RealTimeData[AIsum+6]=0x38; //DI标号
496 1 RealTimeData[AIsum+7]=0x31;
497 1 hex2asc1(RealTimeData+AIsum+8,(8+B33DI)/4); //DI通道数,压缩
498 1
499 1 ReceCount0=0; //串口0接收计数器清零
500 1 }
501
502 void Analyse1()
503 {
504 1 uchar data j,i,data00;
505 1 uint data kk,TemLen,kk0;
506 1 uchar readID, state, length, ReceLen, typeCom,RTclock[6];
507 1 uint SumCheck, ReceCheck;
508 1 ReceEndFlag1 = 0;
509 1 if( ReceSbuf1[0] != 0x7E ) //没有数据包头
510 1 {
511 2 memset( ReceSbuf1, 0, 50 ); //串口1接收缓冲区清零
512 2 ReceCount1 = 0; //串口1接收计数器清零
513 2 return;
514 2 }
515 1 for( i = 0;i < MaxRece1;i++ ) //计算包长度
516 1 {
517 2 if( ReceSbuf1[i] == '\r')
518 2 {
519 3 length = i+1;
520 3 break;
521 3 }
522 2 }
523 1 if( length < 10 && length > 60 ) //无效数据包
524 1 {
525 2 memset( ReceSbuf1, 0, 40 ); //串口1接收缓冲区清零
526 2 ReceCount1 = 0; //串口1接收计数器清零
527 2 return;
528 2 }
529 1 readID = toint( ReceSbuf1[5] ) * 16 + toint( ReceSbuf1[6] );
530 1 if( readID != Read_ID() ) //采集箱的ID号校验
531 1 {
532 2 memset( ReceSbuf1, 0, 50 ); //串口1接收缓冲区清零
533 2 ReceCount1 = 0; //串口1接收计数器清零
534 2 return;
535 2 }
536 1 SendSbuf1[SendCount1++] = '\r'; //结束上次发送(最好发送)
537 1 SendSbuf1[SendCount1] = '\n'; //结束上次发送(结束发送)
538 1 state = 0; //返回状态
539 1 if( ReceSbuf1[0] != 0x7E ) state = 1; //起始符校验
540 1 if( ReceSbuf1[1] != VERh && ReceSbuf1[2] != VERl)
541 1 { //版本号校验
542 2 state = 2;
543 2 }/*
544 1 if( ReceSbuf1[17] >0x31 || ReceSbuf1[19] >0x33 || ReceSbuf1[21] >0x32 || ReceSbuf1[23] >0x36 || Rece
-Sbuf1[25] >0x36)
545 1 { //日期时间
546 1 state = 10; //日期时间错
547 1 return;
548 1 }*/
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 10
549 1 SumCheck=CrcCheck( ReceSbuf1+1,length-6 ); //计算CRC //接收CRC
550 1 ReceCheck=4096 * toint( ReceSbuf1[length-5] )+256 * toint( ReceSbuf1[length-4] )+16 * toint( ReceSbuf1[le
-ngth-3] )+toint( ReceSbuf1[length-2] );
551 1 if( SumCheck != ReceCheck ) state=5; //crc校验
552 1 ReceLen = 0x10*toint( ReceSbuf1[13] ) + toint( ReceSbuf1[14] );
553 1 if(ReceLen != length-20) state=4; //数据块长度
554 1 typeCom = 16 * toint( ReceSbuf1[7] ) + toint( ReceSbuf1[8] );
555 1 TemLen = 0;
556 1 if(KaiJiShZhFlag) //开机时钟校正
557 1 {
558 2 for(i = 0;i < 12;) //更新时钟
559 2 {
560 3 RTclock[i/2]=16 * toint(ReceSbuf1[15+i]) + toint(ReceSbuf1[16+i]);
561 3 i+=2;
562 3 }
563 2 setup_write(); //设置实时时钟操作方式
564 2 clock_write(RTclock); //修改时钟命令
565 2 KaiJiShZhFlag=0;
566 2 }
567 1 switch( typeCom )
568 1 {
569 2 case ResetCom: //系统复位命令
570 2 typeCom = ResetAns;
571 2 TemLen = 20 + 12;
572 2 ResetAnsFlag = 1; //复位标志位置一
573 2 break;
574 2 case ClockCom: //时钟校正命令
575 2 typeCom = ClockAns;
576 2 TemLen = 20 + 12;
577 2 for(i = 0;i < 12;) //更新时钟
578 2 {
579 3 RTclock[i/2]=16 * toint(ReceSbuf1[15+i]) + toint(ReceSbuf1[16+i]);
580 3 i+=2;
581 3 }
582 2 setup_write(); //设置实时时钟操作方式
583 2 clock_write(RTclock); //修改时钟命令
584 2 for(i=0;i<6;i++)
585 2 {
586 3 RTclock[i]=0;
587 3 }
588 2 clock_read(RTclock); //读修改后的时钟
589 2 for(i=0;i<6;i++) //读取修改后的实时时钟
590 2 {
591 3 hex2asc0(ReceSbuf1+15+2*i,RTclock[i]);
592 3 }
593 2 break;
594 2 case BaudCom: //串口设置命令
595 2 typeCom = BaudAns;
596 2 TemLen = 20 + 16;
597 2 for( i = 27;i < 31;i++) //保存参数
598 2 {
599 3 SendSbuf1[i] = ReceSbuf1[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -