📄 appli.lst
字号:
480 4 }
481 3 break;
482 3
483 3 case 4:/*收到本机地址或者广播地址*/
484 3 if ( (var1 == ADDRESS[1]) || (var1 == 0) )
485 3 {
486 4 prec_num = 2;
487 4 prec_buf[1] = var1;
488 4 serial_flag = 5;
489 4 }
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 9
490 3 else
491 3 {
492 4 serial_flag = 0;
493 4 }
494 3 break;
495 3
496 3 case 5:/*数据长度*/
497 3 prec_num = 3;
498 3 prec_buf[2] = var1;
499 3 serial_lengthl = var1;
500 3 serial_flag = 6;
501 3 break;
502 3
503 3 case 6:
504 3 prec_num = 4;
505 3 prec_buf[3] = var1;
506 3 serial_length |= var1;
507 3 serial_length = ( (serial_length << 8) & 0xff00 ) + serial_lengthl + 3;
508 3 serial_flag = 7;
509 3 break;
510 3
511 3 case 7:
512 3 prec_buf[prec_num] = var1;
513 3 prec_num++;
514 3 serial_length--;
515 3 if (serial_length == 0)
516 3 {
517 4 crc_data = CalCRC16_1021(prec_buf, prec_num - 2); /* 计算crc校验和(从组地址开始到ETX
-)*/
518 4
519 4 if ( ( (crc_data & 0x00ff) == prec_buf[prec_num - 2]) && ( ( (crc_data >>8) & 0x00ff)
-== prec_buf[prec_num - 1]) ) /* 校验和正确 */
520 4 {
521 5 prec_num = 1;
522 5 var1 = 0;
523 5
524 5 if ( (prec_buf[4] >= 0x31) && (prec_buf[4] <= 0x3b) ) /* 命令有效 */
525 5 {
526 6 if (prec_buf[1] != 0x00) /* 如果不是广播地址则回应ACK*/
527 6 msg_last_push(MSG_ACK,0);
528 6
529 6 command_decoder(); /* 如果校验和正确,则进行命令解码 */
530 6 }
531 5 else
532 5 {
533 6 msg_last_push(MSG_NAK,0);/* 接收数据错误,则发送NAK */
534 6 }
535 5 }
536 4 else
537 4 {
538 5 msg_last_push(MSG_NAK,0);/* 接收数据错误,则发送NAK */
539 5 }
540 4 serial_flag = 0;
541 4 prec_num = 1;
542 4 }
543 3 break;
544 3
545 3 default:
546 3 serial_flag = 0;
547 3 prec_num = 1;
548 3 break;
549 3 }
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 10
550 2 }
551 1 }
552
553 /* 串口发送一个字节 */
554 void com_send_command(u_char onebyte)
555 {
556 1 psend_int = 0;
557 1 SBUF = onebyte;
558 1 while (psend_int != 1);
559 1 }
560
561 /* 向主机发送消息帧,入口参数:消息类型 */
562 void send_command(u_char command)
563 {
564 1
565 1 switch (command)
566 1 {
567 2 case ACK:
568 2 com_send_command(SYN);
569 2 com_send_command(SYN);
570 2 com_send_command(ACK);
571 2 break;
572 2
573 2 case NAK:
574 2 com_send_command(SYN);
575 2 com_send_command(SYN);
576 2 com_send_command(NAK);
577 2 break;
578 2
579 2 default:
580 2 break;
581 2 }
582 1 }
583
584 /* 系统消息进入栈首 */
585 void msg_first_push(u_char type, u_char value)
586 {
587 1 if (msg_number < MAX_MSGNUM)
588 1 {
589 2 msg_number = msg_number + 1;
590 2
591 2 if (msg_readp == 0)
592 2 {
593 3 msg_readp=MAX_MSGNUM-1;
594 3 }
595 2 else
596 2 {
597 3 msg_readp = msg_readp - 1;
598 3 }
599 2
600 2 msg_type[ msg_readp] = type;
601 2 msg_value[ msg_readp] = value;
602 2 }
603 1 }
604
605 /* 系统消息进入栈尾 */
606 void msg_last_push(u_char type, u_char value)
607 {
608 1 if (msg_number < MAX_MSGNUM)
609 1 {
610 2 msg_number = msg_number + 1;
611 2 msg_type[ msg_writep] = type;
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 11
612 2 msg_value[ msg_writep] = value;
613 2 msg_writep = msg_writep + 1;
614 2
615 2 if (msg_writep >= MAX_MSGNUM)
616 2 {
617 3 msg_writep = 0;
618 3 }
619 2 }
620 1 }
621
622 /* 主消息处理子程序 */
623 void main_message_process(void)
624 {
625 1 u_char i;
626 1 u_int crc_data = 0;
627 1 switch (msg_nowtype)
628 1 {
629 2 case MSG_TIMER: /* 定时器消息处理 */
630 2 switch (msg_nowvalue)
631 2 {
632 3 case T_WATCHDOG: /* 1秒定时到 */
633 3 clear_timer(T_WATCHDOG);
634 3 WDI = ~WDI; /* 喂狗 */
635 3 set_timer(WD_TIMER_LEN, 0, T_WATCHDOG);
636 3
637 3 break;
638 3
639 3 case T_SAMPLE: /* 5秒定时到 */
640 3
641 3 clear_timer(T_SAMPLE);
642 3
643 3 /* add 20050922 */
644 3 clear_timer(T_LUMIN);
645 3 EX1 = 0; /* 关外部中断1 */
646 3 /* end of add */
647 3
648 3 cur_temp = get_temperature();/* 读当前温度 */
649 3 analog_in_data = adc_1549(); /* 读当前模入*/
650 3 if (lcd_flag)
651 3 {
652 4 lcd_flag = 0;
653 4 sd2300_read_date();
654 4 show_time();
655 4 }
656 3 else
657 3 {
658 4 lcd_flag = 1;
659 4 show_current_environment(cur_temp, cur_lumin, analog_in_data, SWITCH_IN);
660 4 }
661 3
662 3 set_timer(QUERY_TIMER_LEN, 0, T_SAMPLE);
663 3
664 3 /* add 20050922 */
665 3 fhz_tlc555 = 0;
666 3 EX1 = 1; /* 开外部中断1 */
667 3 set_timer(LUMIN_TIMER_LEN, 0, T_LUMIN);
668 3 /* end of add */
669 3
670 3 break;
671 3
672 3 case T_LUMIN: /* 2.5秒定时到 */
673 3 clear_timer(T_LUMIN);
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 12
674 3
675 3 EX1 = 0; /* 关外部中断1 */
676 3 fhz_tlc555 = (fhz_tlc555 * 2) /5;
677 3 cur_lumin = calc_lumin(fhz_tlc555); /*计算当前光强*/
678 3 fhz_tlc555 = 0;
679 3 EX1 = 1; /* 开外部中断1 */
680 3
681 3 set_timer(LUMIN_TIMER_LEN, 0, T_LUMIN);
682 3 break;
683 3
684 3 default:
685 3 break;
686 3 }
687 2 break;
688 2
689 2 case MSG_GET_LIMIT: /* 请求当前报警阈值 */
690 2
691 2 send_buf[0] = ADDRESS[0]; /* 通讯组地址 */
692 2 send_buf[1] = ADDRESS[1]; /* 开发板地址 */
693 2 send_buf[2] = 0x05; /* 数据长度低字节 */
694 2 send_buf[3] = 0x00; /* 数据长度高字节 */
695 2 send_buf[4] = 0x32; /* 消息类型:报警阈值 */
696 2
697 2 send_buf[5] = alarm_limit.temp_uthreshold; /* 超低温度 */
698 2 send_buf[6] = alarm_limit.temp_othreshold; /* 超高温度 */
699 2 send_buf[7] = alarm_limit.lumin_uthreshold; /* 超低光强 */
700 2 send_buf[8] = alarm_limit.lumin_othreshold; /* 超高光强 */
701 2
702 2 send_buf[9] = 0x03;
703 2
704 2 crc_data = CalCRC16_1021(send_buf, 10);
705 2
706 2 send_buf[10] = ( crc_data & 0x00ff ); /* 校验位低字节 */
707 2 send_buf[11] = ( ( crc_data & 0xff00 ) >> 8 );/* 校验位高字节 */
708 2
709 2 com_send_command(SYN); /* 发送数据 */
710 2 com_send_command(SYN);
711 2 com_send_command(STX);
712 2 for (i=0; i<12; i++)
713 2 {
714 3 com_send_command(send_buf[i]);
715 3 }
716 2 break;
717 2
718 2 case MSG_READ_DATE: /* 读取日期消息处理 */
719 2
720 2 send_buf[0] = ADDRESS[0]; /* 通讯组地址 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -