📄 lzkfunc.lst
字号:
577
578 /*****************************************************************
579 *** 失步检测
580 *****************************************************************/
581 /*
582 #define IFCO_LowLevlTimMAX 5 // 2秒内允许IFCO最多出现低电平次数为5次
583
584 uint8 xdata IFCO_LowLevlTimCNT = 0; // IFCO出现低电平次数
585 uint16 xdata IFCO_2SecTimCNT = 0; // 3200 * 0.625uS = 2S
586 uint16 xdata IFCO_07SecTimCNT = 0; // 1120 * 0.625uS = 0.7S
587
588 IFCO_LastVal
589 IFCO_CurrVal
590 IFCO_2SecTimCntEN //
591 IFCO_07SecTimCntEN //
592 IFCO_OutOfSyncEVT //
593 IFCO_FallEdgeEVT // 单次检测的首个IFCO下降沿“1”to“0”
594 */
595 if( OutOfSyncMoniEN == 1 ) // 失步检测功能是否使能
596 {
597 IFCO_LowLevlTimCNT++; // Increase 1 Every 625uS.
598
599 IFCO_LastVal = IFCO_CurrVal; // IFCO为过零比较.
600 IFCO_CurrVal = ~IFCO; // 比较器倒相!!!硬件设计错误.
601 if( IFCO_CurrVal != IFCO_LastVal )
602 {
603 if( IFCO_CurrVal == 0 ) // IFCO下降沿.
604 {
605 if( IFCO_FallEdgeEVT == 0 ) //
606 {
607 IFCO_2SecTimCntEN = 1; // 在IFCO下降沿使能2秒计时器
C51 COMPILER V7.20 LZKFUNC 09/04/2006 16:29:05 PAGE 11
608 IFCO_FallEdgeEVT = 1; // 置位IFCO下降沿事件标记
609 IFCO_LowLevlTimCNT = 1; // IFCO下降沿计数加“1”
610 }
611 else
612 {
613 IFCO_LowLevlTimCNT++;
614 if( IFCO_LowLevlTimCNT >= IFCO_LowLevlTimMAX )
615 {
616 IFCO_LowLevlTimCNT = 0; // 2秒内IFCO没有出现5个过“零”点波形.
617 IFCO_2SecTimCntEN = 0; // 本次2秒超时计时任务结束.
618 IFCO_07SecTimCNT = 0; // 复位0.7秒IFCO“负”波形检测计时
619 IFCO_07SecTimCntEN = 0; // 本次0.7秒IFCO“负”波形检测计时任务结束.
620 IFCO_FallEdgeEVT = 0; // 复位首个IFCO下降沿标记
621
622 IFCO_OutOfSyncEVT = 1; // IFCO在2秒内出现5个“负”波形.
623 }
624 }
625 IFCO_07SecTimCntEN = 1; // 在IFCO下降沿使能0.7秒计时器
626
627 }
628 else // IFCO上升沿复位0.7秒IFCO“负”波形检测计时.
629 {
630 IFCO_07SecTimCNT = 0; // 复位0.7秒IFCO“负”波形检测计时
631 IFCO_07SecTimCntEN = 0; // 本次0.7秒IFCO“负”波形检测计时任务结束.
632 }
633 }
634
635 if( IFCO_2SecTimCntEN ) // 2秒计时超时计时
636 {
637 IFCO_2SecTimCNT++;
638 if( IFCO_2SecTimCNT >= 3200 ) // 2秒计时超时;3200 * 0.625uS = 2S
639 {
640 IFCO_07SecTimCNT = 0; //
641 IFCO_07SecTimCntEN = 0; // 本次0.7秒超时计时任务结束.
642 IFCO_FallEdgeEVT = 0; // 复位首个IFCO下降沿标记
643 IFCO_LowLevlTimCNT = 0; // 复位IFCO过“零”点计数器.
644 IFCO_2SecTimCntEN = 0; // 本次2秒计时任务结束.
645 }
646 }
647 if( IFCO_07SecTimCntEN ) // 0.7秒计时超时计时
648 {
649 IFCO_07SecTimCNT++;
650 if( IFCO_07SecTimCNT >= 1120 ) // 0.7秒计时超时;1120 * 0.625uS = 0.7S
651 {
652 IFCO_07SecTimCNT = 0; //
653 IFCO_07SecTimCntEN = 0; // 本次0.7秒超时计时任务结束.
654 IFCO_OutOfSyncEVT = 1; // IFCO出现超过0.7秒的“负”波形.
655 }
656 }
657 } // End of 失步检测功能.
658 }
659
660
661 /*****************************************************************
662 *** TIMER 0 SLOT 1
663 *** (1)ModBUS(串口0)通讯数据收发;
664 *** (2)功率因数电流环测量;
665 *****************************************************************/
666 if( TimSlotCNT == 1 ) // ModBUS(串口0)通讯数据收发.
667 {
668 SFRPAGE = UART0_PAGE;
669 if( TI0 ) // TX Over.
C51 COMPILER V7.20 LZKFUNC 09/04/2006 16:29:05 PAGE 12
670 {
671 TI0 = 0; // Clear the UART0 Interrupt Flag.
672 if( UART0_TX_CNT < UART0_TX_NUM ) // Current Frame Send OVER ?
673 {
674 SBUF0 = *( TxDATA + UART0_TX_CNT );
675 UART0_TX_CNT++;
676 }
677 else
678 {
679 RS485_FramIntvlCNT++;
680 if( RS485_FramIntvlCNT >= 10 )
681 RS485_FramIntvlCNT = 10;
682 }
683 }
684 if( RI0 )
685 {
686
687 }
688
689 /*****************************************************************
690 *** (1)键盘扫描;
691 *** (2)CanBUS数据收发;
692 *****************************************************************/
693 if( TimSlotCNT == 2 )
694 {
695 /*****************************************************************
696 *** 键盘扫描程序,记录键的按下、释放和按下的时间长度.
697 *****************************************************************/
698 KeyScanIntvlCNT++;
699 if( KeyScanIntvlCNT >= KeyScanPeriod ) // Key Scan Interval: 0.625 * 20 = 12.5mS.
700 {
701 /***KEY0******************************************************/
702 if( KEY0 == 0 ) // Begin of Menu Key.
703 { // KEY0: Menu Key.
704 MenuKeyPresCNT++;
705 if( MenuKeyPresCNT >= KeyPresEvtTime ) // 20 times Key Press, 250mS.
706 {
707 if( MenuKeyPresEVT == 0 )
708 {
709 MenuKeyPresCNT = MenuKeyPresCNT - KeyPresEvtTime;
710 MenuKeyPresEVT = 1;
711 }
712 }
713 }
714 else
715 {
716 if( MenuKeyPresCNT >= KeyPresEvtTime ) // 20 times Key Press, 250mS.
717 MenuKeyPresEVT = 1;
718 if( MenuKeyPresCNT >= KeyRelsEvtTime ) // 2 times Key Press, 25mS.
719 MenuKeyRelsEVT = 1;
720
721 MenuKeyPresCNT = 0; // .
722 } /* End of Menu Key */
723
724 /***KEY1******************************************************/
725 if( KEY1 == 0 ) // Begin of Up Key.
726 { // KEY1: Up Key.
727 UpKeyPresCNT++;
728 if( UpKeyPresCNT >= KeyPresEvtTime ) // 20 times Key Press, 250mS.
729 {
730 if( UpKeyPresEVT == 0 )
731 {
C51 COMPILER V7.20 LZKFUNC 09/04/2006 16:29:05 PAGE 13
732 UpKeyPresCNT = UpKeyPresCNT - KeyPresEvtTime;
733 UpKeyPresEVT = 1;
734 }
735 }
736 }
737 else
738 {
739 if( UpKeyPresCNT >= KeyPresEvtTime ) // 20 times Key Press, 250mS.
740 UpKeyPresEVT = 1;
741 if( UpKeyPresCNT >= KeyRelsEvtTime ) // 2 times Key Press, 25mS.
742 UpKeyRelsEVT = 1;
743
744 UpKeyPresCNT = 0; // .
745 } /* End of Up Key */
746
747 /***KEY2******************************************************/
748 if( KEY2 == 0 ) // Begin of Down Key.
749 { // KEY2: Down Key.
750 DownKeyPresCNT++;
751 if( DownKeyPresCNT >= KeyPresEvtTime ) // 20 times Key Press, 250mS.
752 {
753 if( DownKeyPresEVT == 0 )
754 {
755 DownKeyPresCNT = DownKeyPresCNT - KeyPresEvtTime;
756 DownKeyPresEVT = 1;
757 }
758 }
759 }
760 else
761 {
762 if( DownKeyPresCNT >= KeyPresEvtTime ) // 20 times Key Press, 250mS.
763 DownKeyPresEVT = 1;
764 if( DownKeyPresCNT >= KeyRelsEvtTime ) // 2 times Key Press, 25mS.
765 DownKeyRelsEVT = 1;
766
767 DownKeyPresCNT = 0; // .
768 } /* End of Down Key */
769
770 /***KEY3******************************************************/
771 if( KEY3 == 0 ) // Begin of Enter Key.
772 { // KEY3: Enter Key.
773 EnterKeyPresCNT++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -