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

📄 clqdq730test.c

📁 电动机保护磁力启动器有断相短路过流保护漏锁功能
💻 C
字号:
/*******************************************************************************
*	Application: Ci Li Qi Dong Qi in W79E825
*	Edition:	Version:1.0
*	Company: CUMT
*   Author:  LH

*	Time: June 2008
*******************************************************************************/
   #include <W79E82x.h>
   
   // 电流处理数据
   unsigned char ADC_Point0,ADC_Point1,ADC_Point2,ADC_Point3;  //
   float ADC_SUM1,ADC_SUM2,ADC_SUM3,ADC_SUM4;

   unsigned char shc_flag=0; //短路标志计数
   unsigned char ADC_RD;
   unsigned char ADC_CH;
   unsigned char ld_count=0;
   
   long BPD1,BPD2,BPD3;  //
   unsigned int BPD4;
  
   unsigned int AD0_Buffer[8]; //AD0存储数组
   unsigned int AD1_Buffer[8]; //AD1存储数组
   unsigned int AD2_Buffer[8]; //AD2存储数组
   unsigned int AD3_Buffer[8]; //AD3存储数组	



   sbit P0_0=P0^0;  //控制灯D29
   sbit P0_1=P0^1;  //控制灯D32   
   sbit P0_7=P0^7;  //控制灯D33
   sbit P1_6=P1^6;  //控制灯D31
   sbit P1_7=P1^7;  //控制灯D30
   sbit P1_4=P1^4;  //控制继电器
   
  
   
   
   
   void initial(void)
   { 
   

   	TMOD=0x01;  //定时器工作在模式1
   	TH0=0xfd;   //四通道每周波采8点,采样间隔2.5/4=0.625ms
   	TL0=0x8f;

    P0M1=0x78;  //控制灯的I/O口要设置成推挽输出,AD的I/O口要设置成高阻输入
    P0M2=0x83;
   
    P1M1=0x00;
    P1M2=0xd0;
    
    P0=0;
    P1=0;

    CMP1=0; //比较器控制给0,禁止比较器
    CMP2=0;

    EA=1;
    ET0=1;
    EADC=0;
    AUXR1|=0x04;	// 打开ADC电路

    ADC_RD=0x55;
    
    
    ADC_Point0=0;
    ADC_Point1=0;
    ADC_Point2=0;
    ADC_Point3=0;


    

    ADC_CH=0;

    ADCCON=0;
    ADC_SUM1=0;  //用来判断的A判断值
     
    BPD1=0;  //用来判断的B判断值
    BPD2=0;
    BPD3=0;
    BPD4=0;

    shc_flag=0;



   
    P0_7=1;  //控制灯D33  正常状态D33亮
    
 

   }


   
  //***********************************************

  // ADC中断服务程序
//    void ADC_ISR() interrupt 11
//   {
//    ADC_RD=0xAA;
//    ADCCON&=0xe7;
//    ADC_H=ADCH;
//    ADC_L=ADCCON&0xc0;
//    ADC_L=ADC_L<<2;
//
//    //P0=0xff;
//    
//    AD0_buffer[0]=ADC_H*4+ADC_L;
//   }
//


//************************************
//定时器0中断服务程序
void T0M1_ISR(void) interrupt 1
{
	unsigned char i;
	unsigned char ADF;
	unsigned char ADC_H,ADC_L;
	
	

    
	ADF=0;

    	ADCCON&=0xef;
	    ADCCON|=0x08;
   
	    do
	{
		ADF=ADCCON&0x10;
		 
	}while(ADF!=0x10);
	    
    
	
    ADCCON&=0xe7;
    ADC_H=ADCH;
    ADC_L=ADCCON&0xc0;
    ADC_L=ADC_L<<2;
    
    
   


	
  
    switch(ADC_CH)
	{
		

		case 1:
	{

	    AD0_Buffer[ADC_Point0]=ADC_H*4+ADC_L;  
       
	    for(i=0;i<8;i++)
     	ADC_SUM1+=AD0_Buffer[i];
     	
     	 ADC_Point0++;
	   if(ADC_Point0==7)
    	ADC_Point0=0;

     
    	 ADC_SUM1/=8;   //采样八个值求平均值

         ADC_SUM1/=82;  //通道1入口电压为0.4V时,判断系数APD为1

		

      

	} break;

    case 2:
	{
		AD1_Buffer[ADC_Point1]=ADC_H*4+ADC_L;    

	    for(i=0;i<8;i++)
     	ADC_SUM2+=AD1_Buffer[i]; 
     
        ADC_Point1++;
	   if(ADC_Point1==7)
    	ADC_Point1=0;

       ADC_SUM2/=8;   //采样八个值求平均值

       ADC_SUM2/=82;  //通道1入口电压为0.4V时,判断系数APD为1
		
       

	} break;


	case 3:
	{
          
		AD2_Buffer[ADC_Point2]=ADC_H*4+ADC_L;  
       
	    for(i=0;i<8;i++)
     	ADC_SUM3+=AD2_Buffer[i];
     
     	ADC_Point2++;
	   if(ADC_Point2==7)
    	ADC_Point2=0;

       ADC_SUM3/=8;   //采样八个值求平均值

       ADC_SUM3/=82;  //通道1入口电压为0.4V时,判断系数APD为1

       	

	}  break;

	case 4:
	{
			
		AD3_Buffer[ADC_Point3]=ADC_H*4+ADC_L;  
       
	    for(i=0;i<8;i++)
     	ADC_SUM4+=AD3_Buffer[i];
     
     	 ADC_Point3++;
	   if(ADC_Point3==7)
    	ADC_Point3=0;

      ADC_SUM4/=8;   //采样八个值求平均值

      ADC_SUM4/=82;  //通道1入口电压为0.4V时,判断系数APD为1

      

    
	}  break;



	default:
	break;

	}



	 ADC_RD=0xaa;


    TH0=0xfd;   //重装定时器0
   	TL0=0x8f;
    
   	 

}

//=========================================

   //断相判断子程序
unsigned char duanxiang(void)
{
	  //断相判断
    float ADC_MAX=0;
	float ADC_MIN=0;
    if(ADC_SUM1>ADC_SUM2)
		{
			ADC_MAX=ADC_SUM1;
			ADC_MIN=ADC_SUM2;

		}
	else 
		{
			ADC_MIN=ADC_SUM1;
			ADC_MAX=ADC_SUM2;
		}


		if(ADC_MAX>ADC_SUM3)
		{
			if(ADC_MIN>ADC_SUM3)
			ADC_MIN=ADC_SUM3;
		}
		else 
		{
			ADC_MAX=ADC_SUM3;
		}


		if(ADC_MIN/ADC_MAX<=0.6)
	{
		BPD4+=2;   

	}
	if(ADC_MIN/ADC_MAX>=0.9)
	{
		BPD4-=2;
	}



	 if(BPD4>0xfffff)  //设置上限
      BPD4=0xfffff;
     if(BPD4<0)   //设置下限
      {BPD4=0;}

	if(BPD4>0xfff)
	          	  {       	
	            	P1_7=1;   //断相显示 灯D33
	            	P1_4=1;   // 跳继电器

	            	P0_7=0;  //正常灯D33灭    	
     
			        return 1;
	              }
     else 
	{
		P1_7=0;
		P1_4=0;
		P0_7=1;
		return 0;
	}

	  
  

}

//=============================================================

void ch1_gl(void)
{
		if (ADC_SUM1>=8)
		
	    {
		    shc_flag++;
		   
		        if(shc_flag>96)  //连续检测到12周波短路过流再跳
		    {
		    	shc_flag=0;
	            P0_1=1; //短路灯D32亮
	            P1_4=1; // 跳继电器
                P0_7=0;  //正常灯D33灭
	            EA=0;
	            while(1);
		    }
		    
		}
		
   else if(ADC_SUM1>=6)
         {BPD1+=75;}  //D31  P0_1=0;
   else if(ADC_SUM1>=5)
		 {BPD1+=60;}
   else if(ADC_SUM1>=4)
		 { BPD1+=30;}
   else if(ADC_SUM1>=3)
		 {	BPD1+=20;}
   else if(ADC_SUM1>=2)
		 {	BPD1+=12;}
   else if(ADC_SUM1>=1.5)
		 {	BPD1+=6;
	
	     }   //D30  P1_7=1;
   else if(ADC_SUM1>=1.2)
		 {	BPD1+=1;
	
	
	      }//D32 P0_1=1;P1_6=0; 
   


   else if(ADC_SUM1<=0.9)
   
   {
   
           if(ADC_SUM1<=0.6)
	   	    {
		
		   	   if(ADC_SUM1<=0.4)
			
				   {
					   if(ADC_SUM1<=0.2)
					   {  BPD1-=6;  }
					   else {BPD1-=4;}
				   }
		   else {BPD1-=3;} 
		     }

           else  { BPD1-=1;}
  
     	}  
    else 	{;}


    
   
       
   
   if(BPD1>0xfffff)  //设置上限
      BPD1=0xfffff;


   if(BPD1<0)   //设置下限
	{
		BPD1=0;
		
	}
    
}

void ch2_gl(void)
{
	 //2通道过流判断=------------------------------------------------------------------

	if (ADC_SUM2>=8)
		
	    {
		    shc_flag++;
		    
		        if(shc_flag>96)  //连续检测到12周波短路过流再跳
		    {
		    	shc_flag=0;
	            P0_1=1; //短路灯D32亮
	            P1_4=1; // 跳继电器
                P0_7=0;  //正常灯D33灭
	            EA=0;
	            while(1);
		    }
		    
		}
		
   else if(ADC_SUM2>=6)
         {BPD2+=75;}  //D31  P0_1=0;
   else if(ADC_SUM2>=5)
		 {BPD2+=60;}
   else if(ADC_SUM2>=4)
		 { BPD2+=30;}
   else if(ADC_SUM2>=3)
		 {	BPD2+=20;}
   else if(ADC_SUM2>=2)
		 {	BPD2+=12;}
   else if(ADC_SUM2>=1.5)
		 {	BPD2+=6;
	
         }   
   else if(ADC_SUM2>=1.2)
		 {	BPD2+=1;
	
	
	      }
   


   else if(ADC_SUM2<=0.9)
   
   {
   
           if(ADC_SUM2<=0.6)
	   	    {
		
		   	   if(ADC_SUM2<=0.4)
			
				   {
					   if(ADC_SUM2<=0.2)
					   {  BPD2-=6;  }
					   else {BPD2-=4;}
				   }
		   else {BPD2-=3;} 
		     }

           else  { BPD2-=1;}
  
     	}  
    else 	{;}


    
   
       
   
   if(BPD2>0xfffff)  //设置上限
      BPD2=0xfffff;


   if(BPD2<0)   //设置下限
	{
		BPD2=0;
		
	}

}

void ch3_gl(void)
{
	//3通道过流判断-------------------------------------------------------------------
	if (ADC_SUM3>=8)
		
	    {
		    shc_flag++;
		    
		        if(shc_flag>96)  //连续检测到12周波短路过流再跳
		    {
		    	shc_flag=0;
	            P0_1=1; //短路灯D32亮
	            P1_4=1; // 跳继电器
                P0_7=0;  //正常灯D33灭
	            EA=0;
	            while(1);
		    }
		    
		}
		
   else if(ADC_SUM3>=6)
         {BPD3+=75;}  //D31  P0_1=0;
   else if(ADC_SUM3>=5)
		 {BPD3+=60;}
   else if(ADC_SUM3>=4)
		 { BPD3+=30;}
   else if(ADC_SUM3>=3)
		 {	BPD3+=20;}
   else if(ADC_SUM3>=2)
		 {	BPD3+=12;}
   else if(ADC_SUM3>=1.5)
		 {	BPD3+=6;
	
	      }   
   else if(ADC_SUM3>=1.2)
		 {	BPD3+=1;
	
	
	      }
   


   else if(ADC_SUM3<=0.9)
   
   {
   
           if(ADC_SUM3<=0.6)
	   	    {
		
		   	   if(ADC_SUM3<=0.4)
			
				   {
					   if(ADC_SUM3<=0.2)
					   {  BPD3-=6;  }
					   else {BPD3-=4;}
				   }
		   else {BPD3-=3;} 
		     }

           else  { BPD3-=1;}
  
     	}  
    else 	{;}


    
   
       
   
   if(BPD3>0xfffff)  //设置上限
      BPD3=0xfffff;


   if(BPD3<0)   //设置下限
	{
		BPD3=0;
		
	}
   
}

//-----------------------------------------------------


  //主程序
   void main (void)
   {
	unsigned char dx=0;
	unsigned char lb=0;	
	unsigned char gl=0;
   	initial();
    TR0=1;    
    


	
   	while(1)
    {   
	
 //1通道采样过流判断----------------------------------------------------------------------	
		ADC_CH=1;  //设定一通道采样
		ADCCON=0;
		
        while(ADC_RD==0x55);
        ADC_RD=0x55;
         
        if(dx==0)
		{
			ch1_gl();
		}
	     
    	
   
 
//2通道采样过流判断----------------------------------------------------------------------

    	ADC_CH=2; //设定二通道采样    	
    	ADCCON=1;	
    		
        while(ADC_RD==0x55);
        ADC_RD=0x55;
    	
 
        if(dx==0)
		{
			ch2_gl();
		}
	     

//3通道采样过流判断----------------------------------------------------------------------------
    	ADC_CH=3;  //设定三通道采样    	
    	ADCCON=2;	
    		
        while(ADC_RD==0x55);
        ADC_RD=0x55;
        
     
        if(dx==0)
		{
			ch3_gl();
		}
	     



 //4通道采样及漏电闭锁判断----------------------------------------------------------------------
         
   
    do

		{

	ADC_CH=4;   //设定四通道采样
    ADCCON=3;		
    while(ADC_RD==0x55);
    ADC_RD=0x55;


    if(gl==0&&dx==0)
		{



			if(ADC_SUM4>=1)  // 漏电闭锁判断
		{
			ld_count++;   //漏电闭锁计数

		    P1_7=0;
		}
	    else  {
	           ld_count=0; 
			   } 



     	if(ld_count>0xf0)
        	{  
	        ld_count=0xf0;
	 
          	}



	if(ld_count>=50)   //连续判断50次即为漏电
			{
				P1_6=1;  //漏电闭锁灯D31亮
				P1_4=1;  //跳继电器
				P0_7=0;  //正常灯D33灭                		
				lb=1;
			}

    else
        	{
		
		         P1_6=0;//漏电闭锁灯D31灭
		         P0_7=1; //正常灯D33亮
		         P1_4=0;
		         lb=0;
         	 }

		

		}


		} while(lb);		
		
	 



//过流判断++++++++++++++++++++++++++++++++++++++++++++++++++++++

   if(dx==0)
		{

	
			if(BPD1>=0x18000||BPD2>=0x18000||BPD3>=0x18000)  //判断过流
       {	    
          P0_0=1;  // 过流D29亮

          P0_7=0;  //正常灯D33灭

          P1_4=1;  //控制继电器

          gl=1; 
        
	   }	


     if(BPD1<0x18000&&BPD2<0x18000&&BPD3<0x18000) 
     {

     P0_0=0; //不过流D29灭
     P0_7=1; //正常灯D33亮
     P1_4=0;

     gl=0;

	 }
    	

    if(gl==1)
    continue;


		}

     

   

//---------------------------------//判断断相

   	  if((ADC_SUM1<1.2&&ADC_SUM1>0.9)||(ADC_SUM2<1.2&&ADC_SUM2>0.9)||(ADC_SUM3<1.2&&ADC_SUM3>0.9))
		{  

        
		  
		dx=duanxiang();
		
		}

 
 
    
	
	}
 
   }

⌨️ 快捷键说明

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