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

📄 lzkfunc.c

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

#define Vref       1.200

/***********************************************************************
 *** DO开关量(控制输出继电器)功能说明:
(1)KQJ:KQ可控硅开通控制继电器(常闭).
(2)LZJ:励磁状态继电器(常开),LZJ决定是否进行RF检测.
(3)LCJ:失步保护继电器(常开),控制主电源开关或输出给PLC.
(4)SZJ:跳闸停机继电器(常开),后备保护用,输出给PLC.
(5)BXJ:报警输出继电器(常开),用于接通声光报警或输出至PLC.
(6)TYJ:降压起动继电器(常开),控制输出.
(7)YKJ:遥控继电器(常开)
(8)N/A:
***********************************************************************/
uint8 bdata RelayOUT = 0;   // Output Relay STATUS.
// sbit ZJJ_OUT = RelayOUT^7;  // N/A.
sbit YKJ_OUT = RelayOUT^6;  // YKJ Output Relay No.6.遥控状态输出
sbit TYJ_OUT = RelayOUT^5;  // TYJ Output Relay No.5.降压启动控制输出
sbit BXJ_OUT = RelayOUT^4;  // BXJ Output Relay No.4.报警输出
sbit SZJ_OUT = RelayOUT^3;  // SZJ Output Relay No.3.失步再整步失败状态输出
sbit LCJ_OUT = RelayOUT^2;  // LCJ Output Relay No.2.失步状态输出
sbit LZJ_OUT = RelayOUT^1;  // LZJ Output Relay No.1.KQ误导通检测使能控制
sbit KQJ_OUT = RelayOUT^0;  // KQJ Output Relay No.0.KQ控制继电器


/***********************************************************************
 *** DI开关量(状态输入继电器)功能说明:
(1)DLJ:电机加电状态输入(常开),由PLC输入.
(2)RFJ:KQ导通检测(常开),RFJ闭合表示KQ导通.
(3)FCJ:断电保护输入(常开),由PLC输入,防止对电机的冲击.
(4)JYJ:降压起动输入(常开),由PLC输入.
(5)ZCJ:增值(常开),遥控增值.
(6)JCJ:减值(常开),遥控减值.
(7)YCJ:遥控状态继电器,由PLC输入.
(8)DYJ:低压状态输入.
***********************************************************************/
uint8 bdata RelayIN = 0xff;  // Digital Input STATUS.
sbit DYJ_IN = RelayIN^7;     // DYJ Input Relay No.7.低电压强励控制输入
sbit YCJ_IN = RelayIN^6;     // YCJ Input Relay No.6.遥控状态控制输入
sbit JCJ_IN = RelayIN^5;     // JCJ Input Relay No.5.减值
sbit ZCJ_IN = RelayIN^4;     // ZCJ Input Relay No.4.增值
sbit JYJ_IN = RelayIN^3;     // JYJ Input Relay No.3.降压启动控制输入
sbit FCJ_IN = RelayIN^2;     // FCJ Input Relay No.2.防冲击输入<DSJ断电失步保护继电器>
sbit RFJ_IN = RelayIN^1;     // RFJ Input Relay No.1.RF误导通信号输入
sbit DLJ_IN = RelayIN^0;     // DLJ Input Relay No.0.电机启动控制信号输入


/*****************************************************************
***  相差法测量电动机电源功率因数,PhasePole为DUx的过零检测波形
*****************************************************************/
uint8 bdata PwrFact_MsrFLAG = 0x00;
sbit DUxCO_LastVal          = PwrFact_MsrFLAG ^ 7; // DUx
sbit DUxCO_CurrVal          = PwrFact_MsrFLAG ^ 6; // 
sbit PwrFact_CurLoopMsrOVER = PwrFact_MsrFLAG ^ 5; // 
sbit PwrFact_CurLoopMsrEN   = PwrFact_MsrFLAG ^ 4; //
sbit PwrFact_CalcMsrOVER    = PwrFact_MsrFLAG ^ 3; // Every Wave  32 Points. 
sbit PwrFact_CalcMsrEN      = PwrFact_MsrFLAG ^ 2; //
sbit PwrFact_PhaDiffMsrOVER = PwrFact_MsrFLAG ^ 1; // Average for 8 Periods.
sbit PwrFact_PhaDiffMsrEN   = PwrFact_MsrFLAG ^ 0; //

uint8 data DUxCO_RisTimCNT = 0;
uint8 data PwrFact_PhaDiffMsrCNT = 0;
UINTC data PwrFact_PhaDiffMsrDATA[8];


/****************************************************************************
***  外部变量.
****************************************************************************/
extern uint16 xdata *InFlashWrPtr;   // Internal FLASH Write Addr Point.

extern uint16 code  *InFlashRdPtr;   // Internal FLASH Read  Addr Point. 


/****************************************************************************
** 函数名称: T0_ISR()
** 功能描述: T0定时器中断处理,中断间隔125uS
             (1)125uS时间基准:分为5个相位;
			    (2)WDT清除;
			    (3)A/D采样:UF,IF,DU,DI,CurrRingEY,CurrRingEI;
			    (4)DI读入: UFCO,IFCO,SYNCx,RelayIN;
			    (5)DO输出: RelayOUT,PulseOUT;
             (6)功率因数相差法TIMER1测量结果读入; 
** 入口参数: 无
** 出口参数: 无
** 全局变量: 无
** 调用模块: 无
** 说明: 
****************************************************************************/
void T0_ISR(void) interrupt 1
{
   uint8 ucTMP;

   SFRPAGE = TIMER01_PAGE;        // Change to TIMER01 PAGE.
   TF0 = 0;
   WDTCN = 0xA5;                  // Enable WDT or Reload the WDT.


   SFRPAGE = 0x0f;  // P5 SFR PAGE.
   /*****************************************************************
   *** DI开关量(状态输入继电器)读入(8路);
   *****************************************************************/        
   P5MDOUT = 0x00;  // P5口设置为漏极开路,输入方式.       
   P5MDOUT = 0x00;  // P5口设置为漏极开路,输入方式.       
   nReInLE = 0;     // Relay Input  Enabled.
   nReInLE = 0;     // Relay Input  Enabled.
   RelayIN = P5;    // Read  Relay  Digital Input.  
   nReInLE = 1;     // Relay Input  Disabled.

   /*****************************************************************
   *** DO开关量(控制输出继电器)输出(8路);
   *****************************************************************/
   P5MDOUT = 0xff;  // P5口设置为推挽输出,输出方式.       
   P5MDOUT = 0xff;  // P5口设置为推挽输出,输出方式.       
   ReOutLE = 1;     // Relay Output Latch Enabled.
   ReOutLE = 1;     // Relay Output Latch Enabled.
   P5 = RelayOUT;   // Relay Digital Output.  
   ReOutLE = 0;     // Relay Output Latch Disabled.


   /*****************************************************************
   *** DLJ释放或吸合动作处理.
   *****************************************************************/
   DLJ_LastVal = DLJ_CurrVal;        // 保存DLJ状态.
   DLJ_CurrVal = DLJ_IN;             // 读取DLJ当前状态.
   if( DLJ_CurrVal != DLJ_LastVal )  // DLJ状态改变.
   {
      if( DLJ_CurrVal == 0 )         // 开机启动.
      {
         MotNmlVoltStaUpEN = 1;      // 电机正常启动允许使能.
         DLJ_StopProDONE = 0;        // 复位停机处理标志.
      }
	   else                            // 停机.
	   {
         if( DLJ_StopProDONE == 0 )  // 未进行过停机处理.
	      {
            TrigPulseOutEN = 0;      // 禁止可控硅触发脉冲输出.
		                               // LCD显示“电机停机”.
                                     // 所有DO复位,DO = "0xff".
		    	                         // 所有计数器、定时器和标志位复位.
            DLJ_StopProDONE = 1;     // 置已停机处理标志.
	      }
	   }
   }
   else
   {
      if( DLJ_CurrVal == 1 )         // 等待启动信号.
      {
         if( JYJ_IN == 0 )           // 降压启动信号. 
	      {
            MotLowVoltStaUpEN = 1;   // 电机启动允许使能.
	      }  
      }
   }   


   /*****************************************************************
   *** 可控硅触发脉冲输出,与SYNCa同步,SYNCa同步信号周期更新.
   *****************************************************************/
   SYNCa_LastVal = SYNCa_CurrVal;         // 保存SYNCa状态
   SYNCa_CurrVal = SYNCa;                 // 读取SYNCa当前状态
   if( TrigPulseOutEN == 1)               // 可控硅触发脉冲输出
   {
	   if( SYNCa_CurrVal != SYNCa_LastVal) // SYNCa上升沿或下降沿
		if( SYNCa_CurrVal == 1 )            // SYNCa上升沿,“0”-->“1” 
	   {                                      
  	      TrigOutSyncTimCNT = 0;           // 重新同步
         TrigOutSyncTimCntEN = 1;         // 同步计数使能,避免计时误差累积
	   }

      if( EM_RegBrdgMode == 0 )           // EM Half Bridge,励磁为半桥形式.  
      {       
         if( TrigOutSyncTimCNT == TrigOutPosiA_OnTim )   // Trig Phase A+ ON.
           PulseOutPut(0x7f & TrigOutPosiA_ON);
         if( TrigOutSyncTimCNT == TrigOutPosiA_OffTim )  // Trig Phase A+ OFF.
           PulseOutPut(0x7f);
         
         if( TrigOutSyncTimCNT == TrigOutPosiB_OnTim )   // Trig Phase B+ ON.
           PulseOutPut(0x7f & TrigOutPosiB_ON);
         if( TrigOutSyncTimCNT == TrigOutPosiB_OffTim )  // Trig Phase B+ OFF.
           PulseOutPut(0x7f);
         
         if( TrigOutSyncTimCNT == TrigOutPosiC_OnTim )   // Trig Phase C+ ON.
           PulseOutPut(0x7f & TrigOutPosiC_ON);
         if( TrigOutSyncTimCNT == TrigOutPosiC_OffTim )  // Trig Phase C+ OFF.
           PulseOutPut(0x7f);
      }
      else                               // EM Full Bridge,励磁为全桥形式. 
      {         
         if( TrigOutSyncTimCNT == TrigOutPosiA_OnTim )   /* Trig Phase A+ ON */
           PulseOutPut(0x7f & TrigOutPosiA_ON & TrigOutNegaB_ON);
         if( TrigOutSyncTimCNT == TrigOutPosiA_OffTim )  /* Trig Phase A+ OFF*/
           PulseOutPut(0x7f);
         
         if( TrigOutSyncTimCNT == TrigOutNegaC_OnTim )   /* Trig Phase C- ON */
           PulseOutPut(0x7f & TrigOutPosiA_ON & TrigOutNegaC_ON);
         if( TrigOutSyncTimCNT == TrigOutNegaC_OffTim )  /* Trig Phase C- OFF*/
           PulseOutPut(0x7f);
         
         if( TrigOutSyncTimCNT == TrigOutPosiB_OnTim )   /* Trig Phase B+ ON */
           PulseOutPut(0x7f & TrigOutNegaC_ON & TrigOutPosiB_ON);
         if( TrigOutSyncTimCNT == TrigOutPosiB_OffTim )  /* Trig Phase B+ OFF*/
           PulseOutPut(0x7f);
         
         if( TrigOutSyncTimCNT == TrigOutNegaA_OnTim )   /* Trig Phase A- ON */
           PulseOutPut(0x7f & TrigOutPosiB_ON & TrigOutNegaA_ON);
         if( TrigOutSyncTimCNT == TrigOutNegaA_OffTim )  /* Trig Phase A- OFF*/
           PulseOutPut(0x7f);
         
         if( TrigOutSyncTimCNT == TrigOutPosiC_OnTim )   /* Trig Phase C+ ON */
           PulseOutPut(0x7f & TrigOutNegaA_ON & TrigOutPosiC_ON);
         if( TrigOutSyncTimCNT == TrigOutPosiC_OffTim )  /* Trig Phase C+ OFF*/
           PulseOutPut(0x7f);
         
         if( TrigOutSyncTimCNT == TrigOutNegaB_OnTim )   /* Trig Phase B- ON */
           PulseOutPut(0x7f & TrigOutPosiC_ON & TrigOutNegaB_ON);
         if( TrigOutSyncTimCNT == TrigOutNegaB_OffTim )  /* Trig Phase B- OFF*/
           PulseOutPut(0x7f);
      }

      if( TrigOutSyncTimCntEN == 1 )    
	   {
	      TrigOutSyncTimCNT++;
	      if( TrigOutSyncTimCNT >= 161 )
	      {
	         TrigOutSyncTimCNT = 0;
            TrigOutSyncTimCntEN = 0;      // 防止因SYNCa错误导致触发脉冲错误
	      }
	   }
   }
   else                      
     PulseOutPut(0xff);                   // 输出保护,脉冲输出指示iLED熄灭.  


   /*****************************************************************
   *** 相差法测量电动机电源功率因数,PhasePole(DUxCO)为DUx的过零检测波形
   *****************************************************************/
   /*
   uint8 bdata PwrFact_MsrFLAG = 0x00;
   sbit DUxCO_LastVal          = PwrFact_MsrFLAG ^ 7; // DUxCO历史状态
   sbit DUxCO_CurrVal          = PwrFact_MsrFLAG ^ 6; // DUxCO当前状态
   sbit PwrFact_CurLoopMsrOVER = PwrFact_MsrFLAG ^ 5; // 功率因数电流环法单次测量结束
   sbit PwrFact_CurLoopMsrEN   = PwrFact_MsrFLAG ^ 4; // 功率因数电流环法测量使能
   sbit PwrFact_CalcMsrOVER    = PwrFact_MsrFLAG ^ 3; // 功率因数计算法单次测量结束 
   sbit PwrFact_CalcMsrEN      = PwrFact_MsrFLAG ^ 2; // 功率因数计算法测量使能
   sbit PwrFact_PhaDiffMsrOVER = PwrFact_MsrFLAG ^ 1; // 功率因数相差法单次测量结束
   sbit PwrFact_PhaDiffMsrEN   = PwrFact_MsrFLAG ^ 0; // 功率因数相差法测量使能

   uint8  xdata DUxCO_RisTimCNT = 0;                   // DUxCO上升沿次数
   uint8  xdata PwrFact_PhaDiffMsrCNT = 0;             // 功率因数相差法测量次数
   INTUC  xdata PwrFact_PhaDiffMsrDATA[8];             // 功率因数相差法单次测量数据
	uint16 xdata PwrFact_PhaDiffMsrResult;              // 功率因数相差法测量结果 
   */
   if( PwrFact_PhaDiffMsrEN == 1 )
   {
      DUxCO_LastVal = DUxCO_CurrVal;      // 保存DUxCO状态 
      DUxCO_CurrVal = PhasePole;          // 读取DUxCO当前状态

	   if( DUxCO_CurrVal != DUxCO_LastVal )     
	   if( DUxCO_CurrVal == 1 )            // 识别DUxCO上升沿
	   {                                      
	      if( DUxCO_RisTimCNT == 0 )       // TIMER1没有开始计数
		   {
            SFRPAGE = TIMER01_PAGE;       // Change to Timer1 Page
            TR1 = 1;                      // T1 Begin. 
		   }
		   else
	        DUxCO_RisTimCNT++;

 		   if( DUxCO_RisTimCNT == 3 )       // 在第三次DUxCO上升沿中止TIMER1
		   {
            SFRPAGE = TIMER01_PAGE;       // Change to Timer1 Page
            TR1 = 0;                      // T1 STOP. 
            PwrFact_PhaDiffMsrDATA[PwrFact_PhaDiffMsrCNT].ucVAR[0] = TL1;
            PwrFact_PhaDiffMsrDATA[PwrFact_PhaDiffMsrCNT].ucVAR[1] = TH1;
            TH1 = 0; 	                  // TH1_INIT = 0x00;
            TL1 = 0;                      // TL1_INIT = 0x00; 

		      DUxCO_RisTimCNT = 0;	         //
			   PwrFact_PhaDiffMsrCNT++;	 
            if( PwrFact_PhaDiffMsrCNT == 8 )
				{
			      PwrFact_PhaDiffMsrOVER = 1;// 置本轮测量结束标记,等待计算测量结果. 
			      PwrFact_PhaDiffMsrEN = 0;  // 计算结果期间停止测量. 
				} 
		   }
	   }
   }


   /*****************************************************************
   *** TIMER 0 SLOT 0 
   *** (1)启动录波功能:32 Points / Period; Time Interevl 625uS;
	*** (2)SYNCa、SYNCb和SYNCc同步信息缺失或相序错误检测; 
	*** (3)失控检测;
   *****************************************************************/
   if( TimSlotCNT == 0 )          // Time Slot 1;
   {
	   /*****************************************************************
	   *** 启动录波功能:32 Points / Period; Time Interevl 625uS;
	   *****************************************************************/
		/*
	 	#define ByteNumMaxPerPage 65534
	 	#define ExSramWrRdPagMax  2

	   MotStaUpEmWaveRecEN;
	   MotStaUpEmVoltRecEN;
		MotStaUpEmWaveRecOVER;

	   uint8  idata ExSramWrRdPag;  // 外部SRAM页
		uint16 idata ExSramWrRdAdr;  // 外部SRAM读写地址  
	   INTUC  idata AD_DataBuff;    // A/D数据缓冲
		*/
      if( MotStaUpEmWaveRecEN == 1 )                // 启动录波功能是否开启
      {
		   if( MotStaUpEmVoltRecEN == 1 )             // 1/0: EmVolt / EmCurr;
           ADC0_CH_Setting(0x02);                   // AIN02 for EmVolt.                     
         else
           ADC0_CH_Setting(0x03);                   // AIN03 for EmCurr.                     

	      AD0INT = 0;                                // RST ADC Convert Complete Flag.
         AD0BUSY = 1;                               // Start ADC0    
         while( AD0INT == 0 );                      // Wait for Convert Over

         if( ExSramWrRdAdr & 0x01 == 0 )            // Even Address.
		   {
            AD_DataBuff.ucVAR[1] = ADC0H;           // Get  High 8 Byte.  
            AD_DataBuff.ucVAR[0] = ADC0L & 0xf0;    // Get  Low  4 Byte.  

	         ExSRAM_PageSetting( ExSramWrRdPag );    // 切换到外部SRAM
	         ExSramWrRdAdrPt  = ExSramWrRdAdr;       //  
            *ExSramWrRdAdrPt = AdcDatBuff.ucVAR[1]; // Save High 8 Byte
            ExSramWrRdAdr++;
            ExInSRAM_Select(0);                     // 切换回内部SRAM 
         }
         else
		   {
            AD_DataBuff.ucVAR[1] = ADC0H;           // Get  High 8 Byte.  
            ucTMP = ADC0L;                          // Get  Low  4 Byte.  
            ucTMP = ucTMP >> 4;                     // Unite with Last Sample's Low  4 Byte.
            AD_DataBuff.ucVAR[0] = ucTMP | AD_DataBuff.ucVAR[0];   		                                       

	         ExSRAM_PageSetting( ExSramWrRdPag );    // 切换到外部SRAM
	         ExSramWrRdAdrPt  = ExSramWrRdAdr;
            *ExSramWrRdAdrPt = AD_DataBuff.ucVAR[0];// Save Low  8 Byte.
            ExSramWrRdAdr++;

	         ExSramWrRdAdrPt = ExSramWrRdAdr;
            *ExSramWrRdAdrPt = AD_DataBuff.ucVAR[1];// Save High 8 Byte.
            ExSramWrRdAdr++;	    
            ExInSRAM_Select(0);                     // 切换回内部SRAM 
		   }

⌨️ 快捷键说明

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