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

📄 fourwireohemmeter.c

📁 四线电阻测量仪源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			   CalCF=0;
			   break;
	 
	 case 13:  Channel = 5; 	// Only for initial Meter, channel 1 & channel 3 is read, 	   	  		
	 	  	   AutoGain = 1;
			   Target =1 ;      // Target resistance = inital resistance  * 80 / 2.05
			   CalCF=0;
			   break;
	 case 14:  Channel = 6; 		   	  		
	 	  	   AutoGain = 1;
			   CalCF=0;
			   break;
	 case 15:  Channel = 0; 		   	  		
	 	  	   AutoGain = 1;
			   CalCF=0;
			   break;
	 default:  Channel = 0;
	 		   AutoGain = 1; 
			   CalCF=0;
			   break; 
	}
}


void dec_to_char(double dec, char chr[])
{	 int i,zero,demcial;
	 long long_dec;
	 char temp1[]=" ";
	 char temp2[]="-----";
	 char temp3[]=".";
	 
	 
	 
	 if(dec >= 0) 
	 {		
	 		
	 		 if(dec >= 10000 && dec < 100000)
	 		 { 
	 		  zero =0;
			  demcial=0;
	 		 }
	 		 else if(dec >= 1000 && dec < 10000)
	 		 {
	    	  zero =1;
			  demcial=0;
	 		 } 
	 		 else if(dec >= 100 && dec < 1000)
	 		 {
	    	  zero =2;
			  demcial=0;
			  } 
	 		 else if(dec >= 10 && dec < 100)
	 		 {
	    	  zero =0;
			  demcial=2;
			 } 
	 		 else if(dec >= 5 && dec < 11)
	 		 {
	    	  zero =0;
			  demcial=2;
	 		 }
	 		 else if(dec >= 0 && dec < 5)
	 		 {
	    	  zero =0;
			  demcial=3;
	 		 }
	 
	 		 if(demcial == 0)
			 {		long_dec = (long) dec;
			 		for(i=4;i>0;i--)
	 		 		{
	  		  	 	 	chr[i]= number[long_dec%10];
			  	 	 	long_dec-=(long_dec%10);
			  	 		long_dec =long_dec/10;
	 		 	 		}
			  	 
				 	chr[0]= number[long_dec];
			  	 
				 	for(i=0;i<zero;i++)
	 		  	 	{
	  		   	  		chr[i]=temp1[0];
	 		  	 	}
			  
			  }
			  else if(demcial == 2)
			  {
			   	   long_dec = dec*100;
			   	   for(i=4;i>2;i--)
	 		 	   {
	  		  	 	 	chr[i]= number[long_dec%10];
			  	 	 	long_dec-=(long_dec%10);
			  	 		long_dec =long_dec/10;
	 		 	 	}
					
					chr[2]= temp3[0];
			  	 
					for(i=1;i>0;i--)
	 		 	  	{
	  		  	 	 	chr[i]= number[long_dec%10];
			  	 	 	long_dec-=(long_dec%10);
			  	 		long_dec =long_dec/10;
	 		 	 	}
			  	 			
				 	chr[0]= number[long_dec];
			  	 
				 	for(i=0;i<zero;i++)
	 		  	 	{
	  		   	  		chr[i]=temp1[0];
	 		  	 	}
			  }
			  else if(demcial == 3)
			  {
			   	   long_dec = dec*1000;
			   	   for(i=4;i>1;i--)
	 		 	   {
	  		  	 	 	chr[i]= number[long_dec%10];
			  	 	 	long_dec-=(long_dec%10);
			  	 		long_dec =long_dec/10;
	 		 	 	}
					
					chr[1]= temp3[0];
			  	 	chr[0]= number[long_dec];
			  	 
				 	for(i=0;i<zero;i++)
	 		  	 	{
	  		   	  		chr[i]=temp1[0];
	 		  	 	}
			  }
	 		  
	}
	else
	{
	  	 for(i=0;i<5;i++)
	 	 {
	  		chr[i]= temp2[i];
		 }
	 }
}

void set_channel(int ch_num)
{
 	 	DDRB=0xFF;
		dg_clear_a0();
		dg_clear_a1();
				 
		switch(ch_num)
		{
		case 1:	 dg_clear_a0();
			 	 dg_set_a1();
				 break;
		case 2:	 dg_set_a0();
			 	 dg_set_a1();
				 break;
		case 3:	 dg_set_a0();
			 	 dg_clear_a1();
				 break;
		case 4:	 dg_clear_a0();
			 	 dg_clear_a1();
				 break;
		default: 	 dg_clear_a0();
			 	 	 dg_clear_a1();
				 	 break;
		}
		delay_time(5);
}
void resis_cal()
{	 long temp;
		temp=0;
		Vm = 0;
		temp = (higher << 8);
		temp |= lower;
		Vm = (temp>>2) ;
		V = (Vm*0.00061045)/Gain ;
		Rm = V/Current;
}
double measure(int ch, int gain)
{	 		double R[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
			int i;
			int index;
			int tmp;
			dis_lcd();
			delay_time(2);
			set_channel(ch);
			delay_time(10);	
			gain_control(gain,ch);
			
			delay_time(5);	
			
			PORTA=0x00;
			DDRA=0x00;
			//DDRB=0xFF;
			
			delay_time(15);	
			
			for(i=0;i<30;i++)
		 	{
			 higher =0x00;
			 lower=0x00;
			
			  ad_conv();
			  resis_cal();
			  R[i]=Rm;
			  delay_time(1);
			}
			dis_ad679();
			
			index = compare(R,30);
			
			
			return (R[index-13]+R[index-12]+R[index-11]+R[index-10]+R[index-9]+R[index-8]+R[index-7]+R[index-6]+R[index-5]+R[index-4]+R[index-3]+R[index-2]+R[index-1]+R[index]+R[index+1]+R[index+2]+R[index+3]+R[index+4]+R[index+5]+R[index+6]+R[index+7]+R[index+8]+R[index+9]+R[index+10]+R[index+11]+R[index+12]+R[index+13])/27;
			
}
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = 0x86;
 UBRRL = 0x0C; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x18;
}


//call this routine to initialise all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 uart0_init();

 MCUCR = 0x0A;
 GICR  = 0xC0;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialised
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{ 
 char index[]="abcd";
 int i,j;
 DDRD |= (1 << DDD4);
 PORTD |= (1 << DDD4);
 delay_time(5);
 PORTD &= ~(1 << DDD4); 
 delay_time(5);
 
	for(i=0;i<4;i++)
	{
	 TransmitBit(index[i]);
	 for(j=0;j<5;j++)
 	 {
	  TransmitBit(Resis[i][j]); 
	  }
	}

}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)

{
        int i;
  		DDRD |= (1 << DDD5);
 		PORTD |= ( 1 << DDD5);
 		delay_time(3);
 		PORTD &= ~(1 << DDD5); 
		
		switch(ReceiveBit())
		{
		 case 0x21:
		       
               DDRD |= (1 << DDD4);
               PORTD |= (1 << DDD4);
               delay_time(5);
               PORTD &= ~(1 << DDD4); 
               delay_time(5);
 
	           for(i=0;i<5;i++)
 	               {
	                  TransmitBit(string11[i]); 
	               }
	
		 
		 //Channel =1;
		 	  	    break;
		 }
		
		
}
void main(void)
{ 	 		 unsigned int a;
             double R;
			 double CalR[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
			 double CalF[4]={1,1,1,1};
			 int ch,i,j,k;
			 int cal_ind;
			 
		
          LCD_background();
	      hard_config();
	      if(Target == 1)
	        {
	          LCD_cmd((0x80 | 0x00));			   // Shift to Line 1 - 00H
	          LCD_print(string4);   			   // Print String 4
    
	          LCD_cmd((0x80 | 0x40));			   // Shift to Line 2 - 40H
	          LCD_print(string9);   			   // Print String 3
	
	          LCD_cmd((0x80 | 0x1D));			   // Shift to Line 2 - 1BH
	          LCD_print(string6);   			   // Print String 5
	
	          LCD_cmd((0x80 | 0x5D));			   // Shift to Line 2 - 5AH
	          LCD_print(string10);   			   // Print String 6
		    }
		 
		 switch (Channel)
		 {
		 case 0: 		 ch= 1;j=0;break;
		 case 1:		 ch= 1;j=0;break;
		 case 2:  		 ch= 2;j=0;break;
		 case 3:  		 ch= 3;j=0;break;
		 case 4:  		 ch= 4;j=0;break;
		 case 5:  		 ch= 1;j=0;break;
		 case 6:  		 ch= 2;j=1;break;
		 
		}
		 
		 DDRC = 0xFF;
		 if( CalCF == 1)
		 {
		  	 LCD_cmd((0x80 | 0x05));			   
		 	 delay_time(10);
		 	 LCD_print(string8);  
		 	 LCD_cmd((0x80 | 0x22));			  
		 	 delay_time(10);
		 	 LCD_print(string8);
		 	 LCD_cmd((0x80 | 0x45));	
		 	 delay_time(10);
		 	 LCD_print(string8);    	
		 	 LCD_cmd((0x80 | 0x62));			   
		 	 LCD_print(string8);   	 			   
		 
		 
		 	 while(j<4)
			 {
		  	  		 
					for(i=0;i<60;i++)
					 		{
		   			  		delay_time(1000000);
		   			  		}
												
					 if(HardCalF == 40)
					 {	   		 
		 	   		 		for(i=0;i<100;i++)
							{
							 measure(j+1,1000);
							}
							
							for(i=0;i<20;i++)
							{
							 CalR[i]=measure(j+1,1000);
							}
							cal_ind=compare(CalR,20);
		 			 }
					 else if(HardCalF == 1500)
					 {
			   		  	  	for(i=0;i<100;i++)
							{
							 measure(j+1,100);
							}
							
							for(i=0;i<20;i++)
							{
							 CalR[i]=measure(j+1,100);
							}
							cal_ind=compare(CalR,20);
		 			 }  
		 	   		 R = CalR[cal_ind];
					 CalF[j] = R /HardCalF;
					 
					 dec_to_char(R,Rm_string);
					
		 	if(Channel ==5 | Channel == 6)
			{
			 	j=j+2;
			}
			else 
			{
			 	 j++;
			}
			}
		 }
		 
		for(i=0;i<100;i++)
		 {
		 delay_time(10000000);
		 }
	// enable watch dog
	   WDR();
	   WDTCR=0x0E;
	//Loop - reading
	
		while(1)
		{	
		    WDR(); 
			R = measure(ch,pre_gain[ch-1])/CalF[ch-1];
			
			if (AutoGain == 1) 
			{
			   if (R < Gain_change[0] && pre_gain[ch-1] !=1000)
			   {
			   R = measure(ch,1000)/CalF[ch-1];
			   pre_gain[ch-1] = 1000;
			   }
			   else if (R <  Gain_change[1] && R >=Gain_change[2] && pre_gain[ch-1] != 100)  
			   {
			   R = measure(ch,100)/CalF[ch-1];
			   pre_gain[ch-1] = 100;
			   }  
			   else if( R >= Gain_change[3] && pre_gain[ch-1] !=10)
			   {
			   R = measure(ch,10)/CalF[ch-1];
			   pre_gain[ch-1] = 10;
			   }
			 }
			
			
			dec_to_char(R,Rm_string);
			for( i =0;i<5;i++)
			{
			Resis[ch-1][i] =Rm_string[i];
			}
			switch(ch)
			{
			case 1: if(Channel ==1)
					{
					 LCD_cmd((0x80 | 0x05));			   // Shift to Line 1 - 00H
				 	 LCD_print(Rm_string);   			   // Print String 4
					  ch=1;
					}
					else if(Channel ==5)
					{
					  LCD_cmd((0x80 | 0x05));			   // Shift to Line 1 - 00H
				 	  LCD_print(Rm_string);   			   // Print String 4
					
					 if(Target == 1) 
					 {
					  if((R*80/2.05) > 9999)
					  {
					  dec_to_char(-1,Rm_string);
					  }
					  else
					  {
					  dec_to_char((R*80/2.05),Rm_string);
					  }
					  LCD_cmd((0x80 | 0x45));			   // Shift to Line 1 - 00H
				 	  LCD_print(Rm_string); 
					 }
					 ch=3;
					}
					else 
					{
					 LCD_cmd((0x80 | 0x05));			   // Shift to Line 1 - 00H
				 	 LCD_print(Rm_string);   			   // Print String 4
					 ch++;
					}				 	
					break;
			case 2: LCD_cmd((0x80 | 0x22));			   // Shift to Line 1 - 00H
				 	LCD_print(Rm_string);   			   // Print String 4
					if(Channel ==2)
					{		   
					  ch=2;
					}
					else if(Channel ==6)
					{
					 ch=4;
					}
					else 
					{
					 ch++;
					}				 	
					break;
			case 3: if(Channel ==3)
					{		   
					  LCD_cmd((0x80 | 0x45));	// Shift to Line 1 - 00H
				 	  //delay_time(10);
				 	  LCD_print(Rm_string);   			   // Print String 4		   		   
					  ch=3;
					}
					else if(Channel ==5)
					{
					  LCD_cmd((0x80 | 0x22));	// Shift to Line 1 - 00H
				 	  //delay_time(10);
				 	  LCD_print(Rm_string);   			   // Print String 4		   		   
					 
					 if(Target == 1) 
					 {
					  if((R*80/2.05) > 9999)
					  {
					  dec_to_char(-1,Rm_string);
					  }
					  else
					  {
					  dec_to_char((R*80/2.05),Rm_string);
					  }
					  LCD_cmd((0x80 | 0x62));			   // Shift to Line 1 - 00H
				 	  LCD_print(Rm_string); 
					 }
					 ch=1;
					}
					else 
					{
					 LCD_cmd((0x80 | 0x45));	// Shift to Line 1 - 00H
				 	 LCD_print(Rm_string);   			   // Print String 4		   		   
					 ch++;
					}				 	
			
					break;
			case 4: LCD_cmd((0x80 | 0x62));			   // Shift to Line 1 - 00H
				 	LCD_print(Rm_string);   			   // Print String 4
					if(Channel ==4)
					{		   
					  ch=4;
					}
					else if(Channel ==6)
					{
					 ch=2;
					}
					else 
					{
					 ch=1;
					}				 	
			
					break;
			}
		  //Transmit Data
			init_devices();
			delay_time(300);
			CLI();
	}
}


⌨️ 快捷键说明

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