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

📄 mpr.c

📁 用C8051F300实现的电动机保护继电器,通过电位器调节整定电流和启动延时时间.
💻 C
字号:

///////////////////////////////////////
//MOTOR PROTECTION RALAY
/////////////////////////////////////

#include <c8051f300.h>
#include <stdio.h>
//---------------------全局变量-----------------------------------------
#define uchar   unsigned char   
#define uint    unsigned int 
#define ulong   unsigned long 
#define SYSCLK  24500000  
bit AD4_end_flag =0;
bit duan_xiang_flag=0;
uchar  IN0; 
uchar  IN1;
uchar  IN2; 
uchar max_IN0;
uchar max_IN1;
uchar max_IN2;                      
uint  max_total=0;
uint  QUAN;
uint  IN3 ;                         	
uint current_PTM;	                	//电位器对应电流值
uint RATE;				                //三相最大值与电位器电流值的比值
uint   count =0;
uint count_AD4 = 0;
uint total_AD4 = 0;
uint time_300 = 0;
ulong comp_55000 =0;  	 
uint total_IN0=0,total_IN1=0,total_IN2=0,K= 3;
uint total_IN0_av,total_IN1_av,total_IN2_av;
uint count_IN0 =0;
uint count_IN1 =0;
uint count_IN2 =0;	
sbit LED_green = P0^3;	                  //  运行时的灯显示
sbit LED_yellow  = P0^5;	              //  过载时的灯显示
sbit LED_red    = P0^6;	                  //  断相时的灯显示
sbit RY         = P0^7; 	              //  继电器

//====================函数清单=======================
void Port_IO_Init()	;
void Oscillator_Init() ;
void ADC_Init()	;
void Timer2_Init ();
void Timer2_ISR();
void ADC_ISR();
void delay10ms();
void delay500ms();
//**********************************************************
void Port_IO_Init()
{
    P0MDIN    = 0xE1;
    P0MDOUT   = 0xE0;
	P0       |= 0x17;
    XBR0      = 0x1E;
    XBR2      = 0x40;
}

void Oscillator_Init()
{
    OSCICN    = 0x07;	          //采用系统时钟24.5MHZ
}
void ADC0_Init ()
{
   ADC0CN = 0x90;                      // ADC0不使能,将T2启动ADC0转换
   AMX0SL = 0xf4;                      // 选择电位器通道
   ADC0CF = (SYSCLK/6000000) << 3;     // ADC conversion clock <= 6MHz AD转化时间
   ADC0CF |= 0x01;                     // PGA gain = 1
   REF0CN = 0x00;                      //  VREF = Vref, bias	 
}
void Timer2_Init ()
{
   TMR2CN = 0x00;                      // STOP Timer2; Clear TF2H and TF2L;
                                       // disable low-byte interrupt; disable
                                       // split mode; select internal timebase
   CKCON |= 0x20;                      // Timer2 uses SYSCLK as its timebase

   TMR2RLH  = 0xF9;                   // Init reload values (-counts,system 24.5/12)
   TMR2RLL  = 0x96;
   TMR2H    = 0xff;                   // set to reload immediately
   TMR2L    = 0xff; 
   ET2 = 1;                            //  disable Timer2 interrupts
   TR2 = 1;                           // start Timer2
}
//***************************主程序 *************************************
void main ()
{  EA=0;
   PCA0MD    &= ~0x40;                                   //禁止看门狗
   Port_IO_Init();
   Oscillator_Init();
   ADC0_Init ();
   AD0EN=  1;
 delay500ms();
   do{
   count_AD4++;
   ADC0CN = 0x90;								      //ADC开始使能
   delay10ms();
   IN3 = ADC0;
   AD0INT = 0;
   total_AD4 = (total_AD4 + IN3);}
   while (count_AD4 !=0x0A);
  IN3 = total_AD4/0x0A;     

   Timer2_Init ();
   TR2  =  1;		                                  //timer2开始计数   
   EA   =  1;
   LED_yellow = 1;
   LED_red    = 1;
   LED_green  = 1;
   while(1){										  //打开全局中断
     }
  }
              

//-----------------------------------------------------------------------------
//                          Timer2_ISR
//-----------------------------------------------------------------------------
void Timer2_ISR(void) interrupt 5 using 3  {       
	    TF2H =0 ;
		ADC0CF    =  23;	
       time_300 ++ ;			 
//------------------------------读三相ADC------------------------------------        
          count = count+1;
            if (count ==1) 
           { AMX0SL = 0xf1;
		     IN2 = ADC0;                 // 通道P0.3的数据
            total_IN2=total_IN2+IN2;
           if (ADC0!=0){ if (max_IN2< ADC0){max_IN2 = ADC0;}}		  
	     //     if( IN2==0)	 
		//	   {  count_IN2++; }
	         AD0INT = 0; 
             ADC0CN = 0x90;
		     }
		   if(count ==2)
		   { AMX0SL = 0xf2; 
			 IN0 = ADC0;                //  通道P0.1的数据 
            total_IN0=total_IN0+IN0;
             if (ADC0!=0){ if (max_IN0< ADC0){max_IN0 = ADC0;}}		  
 //              if( IN0==0)     
//			    {  count_IN0++; }
	         AD0INT = 0; 
             ADC0CN = 0x90;
		     }
		   if(count ==3)
		   { AMX0SL = 0xf3; 
		     IN1 = ADC0;               //   通道P0.2的数据
             total_IN1=total_IN1+IN1;
             if (ADC0!=0){ if (max_IN1< ADC0){max_IN1 = ADC0;}}		  
 //              if( IN1==0)	
//			      {  count_IN1++; }	
	         AD0INT = 0;
             ADC0CN = 0x90;
			 count = 0; }	           		
//			 if (count_IN0==0x50||count_IN1==0x50||count_IN2 ==0x50)        
//			 { duan_xiang_flag=1; 	}			
			
//---------------------------------------------------------------------------------------
	 if (time_300==300) {
	             count_IN0 =0;
				 count_IN1 =0;
				 count_IN2 =0;	            
			     time_300=0;
				 total_IN0_av=(total_IN0-max_IN0)/50;
                 total_IN1_av=(total_IN1-max_IN1)/50;
                 total_IN2_av=(total_IN2-max_IN2)/50;
				 max_IN0=0;
				 max_IN1=0;
				 max_IN2=0;				 				 		 
 if (total_IN0_av>total_IN1_av){ max_total = total_IN0_av;}
     else {max_total = total_IN1_av;}
   if (total_IN2_av> max_total)
   { max_total = total_IN2_av; }
 if (total_IN0_av<0x03||total_IN1_av<0x03||total_IN2_av < 0x03)        
			 { duan_xiang_flag=1; 	}			
                total_IN0=0;		 
				total_IN1=0;
				total_IN2=0;
				current_PTM	= IN3/0x33;
	            RATE = max_total*100/current_PTM;	    //????
				LED_yellow =1;
				LED_red    =1;
//------------------------------------------------------------------------------------------
           if (max_total>IN3 & duan_xiang_flag==0)       //过载
		       { 
			    LED_yellow = 0;
                LED_green    = 1;
	            LED_red = 1;
			if(RATE >0x78)	{
	               if( 0x78<RATE & RATE<=0x96)  
	                      { QUAN=0x64;  }	            // 1.2<x<1.5
                   if( 0x96< RATE & RATE<=0xc8)
	                      { QUAN=0xb7;  }			    // 1.5< x <=2
                   if( 0xc8<RATE & RATE<=0x012c)
	                      {	QUAN=0xb7;  }				// 2 < x <=3
                   if( 0x012c<RATE&RATE<=0x0190)
	                      {  QUAN=0x0157;  }				//3 <x <=4
                   if( 0x0190<RATE&RATE<=0x01F4)
	                      {	QUAN=0x0226;  }		        //4<x<5 
	               if( 0x01F4<RATE &RATE<=0x02D0)
	                      {  QUAN= 0x1130; }             //5<x<=7.2		                    		
		         comp_55000=comp_55000+QUAN ;                 //权值
                if(comp_55000>=550000) 
                 { comp_55000 = 0;
				    RY=0;}                                 //继电器输出;   
				             }                                  
		                }
//------------------------------------------------------------------------------------------
		   if (duan_xiang_flag==1)	                 //断相
		       {  LED_green   = 1;  
	              LED_yellow = 1;
	              LED_red  = 0; 
				  duan_xiang_flag=0;
				if (max_total > IN3)
				{ LED_yellow = 0;}  	                                               
			       if(RATE >105) {
      if( 115<RATE & RATE<=150)   { QUAN=100;  }	            // 1.15<x<1.5
      if( 150< RATE & RATE<=200){ QUAN=220;  }			    // 1.5< x <=2
      if( 200 <RATE &RATE<=300){	QUAN=220;  }				// 2 < x <=3
      if( 300 <RATE &RATE<=400) { QUAN=392;  }				//3 <x <=4
      if( 400 <RATE&RATE<=500) {	QUAN=733;  }		        //4<x<5 
	  if( 500< RATE &RATE<=720){ QUAN=5000; }	 			//5<x<=7.2
	  	    comp_55000=comp_55000+QUAN  ;               //权值
                if(comp_55000>=550000) 
                 { RY=0;  }                             //继电器输出
				  		     	}
                  }

                          }                           
}
//------------------------------------------------------------------------------
void delay10ms()
{   uint j; 
    j=7269; while(j--); 
}  
void delay500ms(){
 uint i=500;
 uint j; 
   while(i--){
    j=600; while(j--); }
}  

⌨️ 快捷键说明

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