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

📄 lzkfunc.c

📁 基于MST-G240128点阵液晶的 状态机机制 人机界面四级滚屏菜单 源代码 ,带时间片机制模拟操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:

         if( ExSramWrRdAdr >= ByteNumMaxPerPage )   // 65534.   
         {                                          // 65535 Sample Points/Page( 27Sec/Page ).
	         ExSramWrRdAdr = 0;                      // RST ExSRAM Address.
            ExSramWrRdPag++;                        // ExSRAM Page Number Increase 1.
         }
         if( ExSramWrRdPag >= ExSramWrRdPagMax )    // 2
	      {                                          // Motor Startup Wave Record Over.
  	         ExSramWrRdAdr = 0;                      // RST ExSRAM Address.
	         ExSramWrRdPag = 0;                      // RST ExSRAM Page No.
            MotStaUpEmWaveRecEN = 0;                // Disabled Motor Startup Wave Recording.     
            MotStaUpEmWaveRecOVER = 1;              // Set Record Over Event Flag.
	      }
      }    
      /*****************************************************************
      *** SYNCa、SYNCb和SYNCc同步信息缺失或相序错误检测.
      *****************************************************************/
      /*
      #define SYNCxHalfPeriTimMAX   22   // 22 * 0.625 = 13.75mS.     
      #define SYNCxHalfPeriTimMIN   10   // 10 * 0.625 =  6.25mS.     
      #define SYNCxErrTimMAX        5    // 允许同步信号连续错误次数

      uint8  xdata SYNCaSameLevlTimCNT = 0;
      uint8  xdata SYNCbSameLevlTimCNT = 0;
      uint8  xdata SYNCcSameLevlTimCNT = 0;
      uint8  xdata SYNCaErrTimCNT = 0;
      uint8  xdata SYNCbErrTimCNT = 0;
      uint8  xdata SYNCcErrTimCNT = 0;
      uint8  xdata SYNCbAftSYNCaRiseEdgeTimCNT = 0;
      uint8  xdata SYNCcAftSYNCaRiseEdgeTimCNT = 0;

	   uint8 bdata SYNCx_FLAG = 0x00;
		sbit SYNCc_LastVal  = SYNCx_FLAG ^ 7;
		sbit SYNCc_CurrVal  = SYNCx_FLAG ^ 6;
		sbit SYNCb_LastVal  = SYNCx_FLAG ^ 5;
		sbit SYNCb_CurrVal  = SYNCx_FLAG ^ 4;
		sbit SYNCa2_LastVal = SYNCx_FLAG ^ 3;
		sbit SYNCa2_CurrVal = SYNCx_FLAG ^ 2;
		sbit SYNCa_LastVal  = SYNCx_FLAG ^ 1;
		sbit SYNCa_CurrVal  = SYNCx_FLAG ^ 0;

      uint8 bdata SYNCx_ErrFLAG = 0x00;
      sbit SYNCabcMoniEN                 = SYNCx_ErrFLAG ^ 6; 
		sbit SYNCbAftSYNCaRiseEdgeTimCntEN = SYNCx_ErrFLAG ^ 6;
		sbit SYNCcAftSYNCaRiseEdgeTimCntEN = SYNCx_ErrFLAG ^ 5; 
      sbit SYNCbAftSYNCaErrEVT           = SYNCx_ErrFLAG ^ 4;
      sbit SYNCcAftSYNCaErrEVT           = SYNCx_ErrFLAG ^ 3;
      sbit SYNCaErrEVT                   = SYNCx_ErrFLAG ^ 2;
      sbit SYNCbErrEVT                   = SYNCx_ErrFLAG ^ 1;
      sbit SYNCcErrEVT                   = SYNCx_ErrFLAG ^ 0;

		*/
      if( SYNCabcMoniEN )              // 励磁同步检测功能是否使能.
	   {
         //       1-----1     1-----1     1-----1
         // SYNCa_|     |_____|     |_____|     |___________
         // ______0_____10____0_____10____0_____10__________0(0mS);     20(12.5mS)
         //           1-----1     1-----1     1-----1
         // SYNCb_____|     |_____|     |_____|     |_______13(8.125mS);30(18.75mS);
		   // _________6.67__16.7__6.67__16.7__6.67__16.7_____
         //               1-----1     1-----1     1-----1
         // SYNCc_________|     |_____|     |_____|     |___
		   // _____________13.3__3.3___13.3__3.3___13.3__3.3__26(16.25mS);11(6.875mS);

         /*****************************************************************
         *** A相同步信息处理:检测SYNCa高电平或低电平持续时间,
			***                  在SYNCa上升沿启动SYNCb滞后SYNCa计时,  
			***                  检测间隔时间625uS
         *****************************************************************/		  
         SYNCa2_LastVal = SYNCa2_CurrVal;    
         SYNCa2_CurrVal = SYNCa; 
	      if( SYNCa2_CurrVal != SYNCa2_LastVal )   // SYNCa电平变化.	   
		   {		      
            if( (SYNCaSameLevlTimCNT > SYNCxHalfPeriTimMAX) || (SYNCaSameLevlTimCNT < SYNCxHalfPeriTimMIN) ) 
			   {                                     // SYNCa同一电平时间太长或太短
			      SYNCaErrTimCNT++; 
					if( SYNCaErrTimCNT >= SYNCxErrTimMAX )
					{
					   SYNCaErrTimCNT = 0;
					   SYNCaErrEVT = 1;                // 置位SYNCa错误标记 
					}  
			   }
            else
				  SYNCaErrTimCNT = 0;                 // 复位SYNCaErrTimCNT		   

		      if( SYNCa2_CurrVal == 1 )             // SYNCa上升沿.
	         {				 
               SYNCbAftSYNCaRiseEdgeTimCntEN = 1; // SYNCb上升沿滞后SYNCa上升沿计时使能.
               SYNCcAftSYNCaRiseEdgeTimCntEN = 1; // SYNCc上升沿滞后SYNCa上升沿计时使能.
				}
            SYNCaSameLevlTimCNT = 0;              // 复位SYNCaSameLevlTimCNT.  
		   }  
         else                                     // SYNCa电平保持不变
           SYNCaSameLevlTimCNT++;

         if( SYNCbAftSYNCaRiseEdgeTimCntEN == 1 )
			  SYNCbAftSYNCaRiseEdgeTimCNT++;         // SYNCb上升沿滞后SYNCa上升沿计时 
         if( SYNCcAftSYNCaRiseEdgeTimCntEN == 1 )
			  SYNCcAftSYNCaRiseEdgeTimCNT++;         // SYNCc上升沿滞后SYNCa上升沿计时

         /*****************************************************************
         *** B相同步信息处理:检测SYNCb高电平或低电平持续时间,
			***                  在SYNCb上升沿检查SYNCb滞后SYNCa计时结果是否在范围内,  
			***                  检测间隔时间625uS
         *****************************************************************/		  
         SYNCb_LastVal = SYNCb_CurrVal;    
         SYNCb_CurrVal = SYNCb; 
	      if( SYNCb_CurrVal != SYNCb_LastVal )    // SYNCb电平变化.	   
		   {		      
            if( (SYNCbSameLevlTimCNT > SYNCxHalfPeriTimMAX) || (SYNCaSameLevlTimCNT < SYNCxHalfPeriTimMIN) ) 
			   {                                    // SYNCa同一电平时间太长或太短
			      SYNCbErrTimCNT++;
					if( SYNCbErrTimCNT >= SYNCxErrTimMAX )
					{
					   SYNCbErrTimCNT = 0;
					   SYNCbErrEVT = 1;
					}  
			   }
            else
				  SYNCbErrTimCNT = 0;                // 复位SYNCaErrTimCNT
				   
		      if( SYNCb_CurrVal == 1 )             // SYNCb上升沿.
	         {				 
               SYNCbAftSYNCaRiseEdgeTimCntEN = 0;// 3.75 < 6.67 < 10;
					if( (SYNCbAftSYNCaRiseEdgeTimCNT < 6) || (SYNCbAftSYNCaRiseEdgeTimCNT > 16) ) 
               {
                  SYNCbAftSYNCaRiseEdgeTimCNT = 0;
                  SYNCbAftSYNCaErrEVT = 1;        // 同步相序错误
               }  
               SYNCbAftSYNCaRiseEdgeTimCNT = 0;
				}
            SYNCbSameLevlTimCNT = 0;             // 复位SYNCaSameLevlTimCNT.  
		   }  
         else
           SYNCbSameLevlTimCNT++;

         /*****************************************************************
         *** C相同步信息处理:检测SYNCc高电平或低电平持续时间,
			***                  在SYNCc上升沿检查SYNCc滞后SYNCa计时结果是否在范围内,  
			***                  检测间隔时间625uS
         *****************************************************************/		  
         SYNCc_LastVal = SYNCc_CurrVal;    
         SYNCc_CurrVal = SYNCc; 
	      if( SYNCc_CurrVal != SYNCc_LastVal )    // SYNCc电平变化.	   
		   {		      
            if( (SYNCcSameLevlTimCNT > SYNCxHalfPeriTimMAX) || (SYNCcSameLevlTimCNT < SYNCxHalfPeriTimMIN) ) 
			   {                                    // SYNCa同一电平时间太长或太短
			      SYNCcErrTimCNT++;
					if( SYNCcErrTimCNT >= SYNCxErrTimMAX )
					{
				      SYNCcErrTimCNT = 0;            // 复位SYNCcErrTimCNT
					   SYNCcErrEVT = 1;
					}  
			   }
            else
				  SYNCcErrTimCNT = 0;                // 复位SYNCcErrTimCNT
				   
		      if( SYNCc_CurrVal == 1 )             // SYNCa上升沿.
	         {				 
               SYNCcAftSYNCaRiseEdgeTimCntEN = 0;// 9.375 < 13.33 < 16.25;  
					if( (SYNCcAftSYNCaRiseEdgeTimCNT < 15) || (SYNCcAftSYNCaRiseEdgeTimCNT > 26) ) 
               {
					   SYNCcAftSYNCaRiseEdgeTimCNT = 0;
                  SYNCcAftSYNCaErrEVT = 1;        // 同步相序错误
               }
               SYNCcAftSYNCaRiseEdgeTimCNT = 0;
				}
            SYNCcSameLevlTimCNT = 0;             // 复位SYNCcSameLevlTimCNT.  
		   }  
         else
           SYNCcSameLevlTimCNT++;


      /*****************************************************************
      *** 失控检测
      *****************************************************************/
      /*
      #define UFCO_OutOfCtrlTimMAX 5          //

      uint8  xdata UFCO_LowLevlTimCNT = 0;   
      uint8  xdata UFCO_OutOfCtrlTimCNT =0;
      uint8  xdata UFCO_01SecTimCNT = 0;

      UFCO_LastVal
      UFCO_CurrVal
		UFCO_01SecTimCntEN
		UFCO_OutOfCtrlEVT
      */
	   if( OutOfCtrlMoniEN )                   // 失控检测功能是否使能.
      {
	      UFCO_LowLevlTimCNT++;                // Increase 1 Every 625uS.

         UFCO_LastVal = UFCO_CurrVal;         // UFCO为过零比较.   
         UFCO_CurrVal = ~UFCO;                // 比较器倒相!!!硬件设计错误.   
         if( UFCO_CurrVal != UFCO_LastVal )  
	      {
            if( UFCO_CurrVal == 0 )           // UFCO下降沿.
			     UFCO_LowLevlTimCNT = 0;         // 复位UFCO低电平计时器.
			   else                              // 只在UFCO上升沿判断UFCO_LowLevlTimCNT的值.
			   {
     		      if( UFCO_LowLevlTimCNT >= 9 )  // UFCO低电平时间超过9(5.5mS). 
			      {
			         UFCO_OutOfCtrlTimCNT++;     // UFCO低电平超时事件计数
                  if( UFCO_OutOfCtrlTimCNT >= UFCO_OutOfCtrlTimMAX )  
				      {                           // 达到5次认为失控.
				         UFCO_OutOfCtrlEVT = 1;   // 置位失控事件标记. 
				         UFCO_OutOfCtrlTimCNT = 0;
				      }           
				      UFCO_01SecTimCNT = 0;       // 100mS计时器复位;不断复位使其不超时!!!
                  UFCO_01SecTimCntEN = 1;     // 100mS计时器计时使能.
			      }
			   }
     	   }	       

	 		if( UFCO_01SecTimCntEN )
  		   {
            UFCO_01SecTimCNT++;
		      if( UFCO_01SecTimCNT >= 160 )     // 100毫秒计时超时.
			   {
               UFCO_OutOfCtrlTimCNT = 0;      // 100毫秒内没有出现另1个超过5.5毫秒的低电平.  
               UFCO_01SecTimCntEN = 0;        // 本次100毫秒超时计时任务结束.
			   }
	  	   }    
      } // End of 失控检测功能.

      /*****************************************************************
      *** 失步检测
      *****************************************************************/
      /*
      #define IFCO_LowLevlTimMAX  5           // 2秒内允许IFCO最多出现低电平次数为5次

      uint8  xdata IFCO_LowLevlTimCNT = 0;    // IFCO出现低电平次数 
      uint16 xdata IFCO_2SecTimCNT = 0;       // 3200 * 0.625uS = 2S
      uint16 xdata IFCO_07SecTimCNT = 0;      // 1120 * 0.625uS = 0.7S

      IFCO_LastVal
      IFCO_CurrVal
		IFCO_2SecTimCntEN          // 
		IFCO_07SecTimCntEN         // 
		IFCO_OutOfSyncEVT          // 
		IFCO_FallEdgeEVT           // 单次检测的首个IFCO下降沿“1”to“0”
      */
		if( OutOfSyncMoniEN == 1 )              // 失步检测功能是否使能
		{
	      IFCO_LowLevlTimCNT++;                // Increase 1 Every 625uS.

         IFCO_LastVal = IFCO_CurrVal;         // IFCO为过零比较.   
         IFCO_CurrVal = ~IFCO;                // 比较器倒相!!!硬件设计错误.   
         if( IFCO_CurrVal != IFCO_LastVal )  
	      {
            if( IFCO_CurrVal == 0 )           // IFCO下降沿.
				{
               if( IFCO_FallEdgeEVT == 0 )    //
					{
	               IFCO_2SecTimCntEN = 1;      // 在IFCO下降沿使能2秒计时器
					   IFCO_FallEdgeEVT = 1;       // 置位IFCO下降沿事件标记
                  IFCO_LowLevlTimCNT = 1;     // IFCO下降沿计数加“1”
					}
               else
					{
                  IFCO_LowLevlTimCNT++;
						if( IFCO_LowLevlTimCNT >= IFCO_LowLevlTimMAX )
						{
		               IFCO_LowLevlTimCNT = 0; // 2秒内IFCO没有出现5个过“零”点波形.  
		               IFCO_2SecTimCntEN = 0;  // 本次2秒超时计时任务结束.
                     IFCO_07SecTimCNT = 0;   // 复位0.7秒IFCO“负”波形检测计时
                     IFCO_07SecTimCntEN = 0; // 本次0.7秒IFCO“负”波形检测计时任务结束.
						   IFCO_FallEdgeEVT = 0;   // 复位首个IFCO下降沿标记 

                     IFCO_OutOfSyncEVT = 1;  // IFCO在2秒内出现5个“负”波形.  
						}
					}
               IFCO_07SecTimCntEN = 1; // 在IFCO下降沿使能0.7秒计时器

				}
			   else                       // IFCO上升沿复位0.7秒IFCO“负”波形检测计时.
			   {
               IFCO_07SecTimCNT = 0;   // 复位0.7秒IFCO“负”波形检测计时
               IFCO_07SecTimCntEN = 0; // 本次0.7秒IFCO“负”波形检测计时任务结束.
			   }
     	   }	       

	 		if( IFCO_2SecTimCntEN )           // 2秒计时超时计时
  		   {
            IFCO_2SecTimCNT++;
		      if( IFCO_2SecTimCNT >= 3200 )  // 2秒计时超时;3200 * 0.625uS = 2S
			   {
               IFCO_07SecTimCNT = 0;       //
               IFCO_07SecTimCntEN = 0;     // 本次0.7秒超时计时任务结束.
				   IFCO_FallEdgeEVT = 0;       // 复位首个IFCO下降沿标记 
               IFCO_LowLevlTimCNT = 0;     // 复位IFCO过“零”点计数器.  
               IFCO_2SecTimCntEN = 0;      // 本次2秒计时任务结束.
			   }
	  	   }    
	 		if( IFCO_07SecTimCntEN )          // 0.7秒计时超时计时
  		   {
            IFCO_07SecTimCNT++;
		      if( IFCO_07SecTimCNT >= 1120 ) // 0.7秒计时超时;1120 * 0.625uS = 0.7S
			   {
               IFCO_07SecTimCNT = 0;       //
               IFCO_07SecTimCntEN = 0;     // 本次0.7秒超时计时任务结束.
               IFCO_OutOfSyncEVT = 1;      // IFCO出现超过0.7秒的“负”波形.  
			   }
	  	   }    
		} // End of 失步检测功能.
   }


   /*****************************************************************
   *** TIMER 0 SLOT 1 
   *** (1)ModBUS(串口0)通讯数据收发;
   *** (2)功率因数电流环测量;
   *****************************************************************/
   if( TimSlotCNT == 1 )    // ModBUS(串口0)通讯数据收发.
   {
      SFRPAGE = UART0_PAGE;
      if( TI0 )                                  // TX Over. 
	   {
  	     TI0 = 0;                                // Clear the UART0 Interrupt Flag.
         if( UART0_TX_CNT < UART0_TX_NUM )       // Current Frame Send OVER ?
	     {
 	        SBUF0 = *( TxDATA + UART0_TX_CNT );
            UART0_TX_CNT++;
         }
		 else
		 {
		    RS485_FramIntvlCNT++;
			if( RS485_FramIntvlCNT >= 10 )
			  RS485_FramIntvlCNT = 10; 
		 }
      }   
	  if( RI0 )
	  {
	     
	  }

   /*****************************************************************
   *** (1)键盘扫描;
	*** (2)CanBUS数据收发;
   *****************************************************************/
   if( TimSlotCNT == 2 )    
   {     
      /*****************************************************************
      ***  键盘扫描程序,记录键的按下、释放和按下的时间长度.
      *****************************************************************/
      KeyScanIntvlCNT++;
      if( KeyScanIntvlCNT >= KeyScanPeriod )       // Key Scan Interval: 0.625 * 20 = 12.5mS.
      {  
         /***KEY0******************************************************/
         if( KEY0 == 0 )                           // Begin of Menu Key.   
         {                                         // KEY0: Menu Key.
            MenuKeyPresCNT++; 

⌨️ 快捷键说明

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