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

📄 fourwireohemmeter.c

📁 四线电阻测量仪源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
 //ICC-AVR application builder : 12/4/2003 11:24:31 AM
// Target : 8535;
// Crystal: 6.0000Mhz
#include <math.h>
#include <macros.h>
#include <iom16v.h>

#define LCD_RS              (1 << 5) 
#define LCD_RW              (1 << 7)
#define LCD_EN              (1 << 6)

#define AD_OE 	 	   	 	(1 << 2)
#define AD_SC	            (1 << 3)
#define AD_HBE	 	        (1 << 4)

#define DG_A0				(1 << 0)
#define DG_A1				(1 << 1)

#define CURRENT_CH1    	 	(1 << 0)
#define CURRENT_CH2    	  	(1 << 1)
#define CURRENT_CH3    	  	(1 << 2)

#define GAIN_1		(1 << 3)
#define GAIN_2		(1 << 4)
#define GAIN_3		(1 << 5)
#define GAIN_4		(1 << 2)
#define GAIN_5		(1 << 1)
#define GAIN_6		(1 << 0)
#define GAIN_7		(1 << 6)
#define GAIN_8		(1 << 7)




#define lcd_set_rs()   	  	(PORTB |= LCD_RS)			
#define lcd_set_rw()  		(PORTB |= LCD_RW)
#define lcd_set_en()  		(PORTB |= LCD_EN)

#define ad_set_hbe()	(PORTB |= AD_HBE)
#define ad_set_sc()	 	(PORTB |= AD_SC)
#define ad_set_oe()	 	(PORTB |= AD_OE)

#define dg_set_a0()		(PORTB |= DG_A0)
#define dg_set_a1()		(PORTB |= DG_A1)

#define gain_control_set_G1()	(PORTC |= GAIN_1)
#define gain_control_set_G2()	(PORTC |= GAIN_2)
#define gain_control_set_G3()	(PORTC |= GAIN_3)
#define gain_control_set_G4()	(PORTC |= GAIN_4)
#define gain_control_set_G5()	(PORTC |= GAIN_5)
#define gain_control_set_G6()	(PORTC |= GAIN_6)
#define gain_control_set_G7()	(PORTD |= GAIN_7)
#define gain_control_set_G8()	(PORTD |= GAIN_8)

#define set_current_ch1() 	(PORTC |= CURRENT_CH1)
#define set_current_ch2() 	(PORTC |= CURRENT_CH2)
#define set_current_ch3() 	(PORTC |= CURRENT_CH3)

#define lcd_clear_rs()	  	(PORTB &= ~LCD_RS)
#define lcd_clear_rw()  	(PORTB &= ~LCD_RW)
#define lcd_clear_en()  	(PORTB &= ~LCD_EN)

#define ad_clear_hbe()	 	(PORTB &= ~AD_HBE)
#define ad_clear_oe()	 	(PORTB &= ~AD_OE)
#define ad_clear_sc()	 	(PORTB &= ~AD_SC)

#define dg_clear_a0()		(PORTB &= ~DG_A0)
#define dg_clear_a1()		(PORTB &= ~DG_A1)

#define gain_control_clear_G1()	(PORTC &= ~GAIN_1)
#define gain_control_clear_G2()	(PORTC &= ~GAIN_2)
#define gain_control_clear_G3()	(PORTC &= ~GAIN_3)
#define gain_control_clear_G4()	(PORTC &= ~GAIN_4)
#define gain_control_clear_G5()	(PORTC &= ~GAIN_5)
#define gain_control_clear_G6()	(PORTC &= ~GAIN_6)
#define gain_control_clear_G7()	(PORTD &= ~GAIN_7)
#define gain_control_clear_G8()	(PORTD &= ~GAIN_8)

#define clear_current_ch1() 	(PORTC &= ~CURRENT_CH1)
#define clear_current_ch2() 	(PORTC &= ~CURRENT_CH2)
#define clear_current_ch3() 	(PORTC &= ~CURRENT_CH3)

char string1[]="*4-W-Meter(HDL)*" ; 	  		  		//*15*//
char string2[]="* Setting Curr *" ; 	  		  		//*15*//
char string3[]="ELG1:";                        //*5*//  
char string4[]="ELG1:";                   	//*5*//  
char string5[]="ELG2:";                        //*5*//
char string6[]="ELG2:";                       //*5*//  
char string7[]="Setting Up";					  //*10*//
char string8[]="Cal";
char string9[]="S_T1";					  //*10*//
char string10[]="S_T2";
char string11[]="@V1.7";

				


char number[]="0123456789";                    //*10*//
char Rm_string[]="XXXXX";					   //*5*//

unsigned int lower,higher;
long Vm;
char Resis[4][5]={"XXXXX","XXXXX","XXXXX","XXXXX"};
int Gain_change[4];
double Current,V,Rm;
double Gain;
int Channel;
int AutoGain;
int HardCalF;
int CalCF;
int Target;
int pre_gain[4]={10,10,10,10};

void delay_time(int count)
{	 int i;
	 for(i=1;i<count;i++)
	 WDR();
}
void TransmitBit( unsigned int bit)
{
 while( !(UCSRA & (1<<UDRE))){}
 UDR=bit;  
 delay_time(5);
 //		   	Channel=bit;
}
unsigned char ReceiveBit()
{
 while( !(UCSRA & (1<<RXC))){}
 return UDR;  
 //		   	Channel=bit;
}
void dis_lcd()
{
 	 DDRB=0xFF;
	 lcd_clear_rs();
	 //lcd_clear_rw();
	 //lcd_clear_en();
	 
	 lcd_clear_en();
	 lcd_set_rw();
			
}
void dis_ad679()
{
 	 	DDRB=0xFF;		  // Set PORTB to outport
 	 	ad_set_sc();	 		
		ad_set_hbe();	 		
		ad_set_oe();	
}
double compare(double num[], int index)
{ 
  unsigned int i,j;
  double tmp;
 for(i=0;i<index;i++)
  {
   for(j=i;j<index;j++)
   	{
		 if(num[j] < num[i])
   		 {
			tmp = num[j];
			num[j]=num[i];
			num[i]=tmp;
			
   		  }
  	}
   }
  

   return ((int) index/2);
}
void ad_conv()
{	 		
			delay_time(30);
			
			ad_set_hbe();
			ad_set_sc();
			ad_set_oe();
			
			ad_clear_hbe();
			ad_clear_sc();
			delay_time(30);
			ad_set_sc();
			delay_time(3);
			ad_clear_oe();
			delay_time(30);
			higher=PINA;
			
			ad_set_oe();
			ad_set_hbe();
			ad_clear_sc();
			delay_time(30);
			ad_set_sc();
			delay_time(3);
			ad_clear_oe();
			delay_time(30);
			lower=PINA;
			
			ad_set_hbe();
			ad_set_sc();
			ad_set_oe();

}
void check_LCD_busy()
{ 
  DDRB=0xFF;
  lcd_clear_rw();
  lcd_clear_rs();
  lcd_clear_en();
  
  lcd_set_rw();
  delay_time(2);
  lcd_set_en();
  delay_time(3);
  DDRA=0x00;
  delay_time(3);
  while ( (PINA & 0x80) != 0 ) {} // Check the LCD BUSY bit, LCD_DB7 = 1 (LCD is Busy), LCD_DB =0 (LCD is ready for instruction)
  lcd_clear_rs();
  lcd_clear_en();
  lcd_clear_rw();
  
 
}
void LCD_cmd(unsigned char lcd_command )
{	
    check_LCD_busy();
			
	DDRA=0xFF ;		  	   			   //Set PORTA to outport
	DDRB=0xFF ;		  	   			   //Set PORTB to outport
	
	//delay_time(3000000);
	delay_time(300);
	
	lcd_clear_en();
	lcd_clear_rs();
	lcd_clear_rw();
	
	PORTA = lcd_command ; 			   // Outport the LCD Instruction
   	lcd_set_en();
	delay_time(1);
	lcd_clear_en();					   // LCD_R/W'= 0 , LCD_EN=0, LCD_RS =0
}
void LCD_print_char(unsigned char a )
{
		check_LCD_busy();
			
		DDRA=0xFF ;		  	   			   //Set PORTA to outport
		DDRB=0xFF ;		  	   			   //Set PORTB to outport
		
		lcd_clear_en();
		lcd_clear_rs();
		lcd_clear_rw();
		
		PORTA =a ;
		
		delay_time(30);
		
		lcd_set_rs();
   		lcd_set_en();
		delay_time(1);
		lcd_clear_en();
   		lcd_clear_rs();
		
		delay_time(30) ;
		//delay_time(3000) ;
}
void LCD_print(char string_print[])
{	int i;
	i = 0;
	while(string_print[i] != 0)
	{
	 	LCD_print_char(string_print[i++]);
	}
}

void LCD_init()
{  
   check_LCD_busy();
   LCD_cmd(0x38) ;	   				   // Function Set- set to 8 bits interface 
   LCD_cmd(0x01) ; 					   //Display Clear 
   LCD_cmd(0x0c) ;					   // Display ON
   LCD_cmd(0x06) ; 				 	   // Address Counter Increment
}
void LCD_background()
{	
 	LCD_init() ;
	LCD_cmd((0x80 | 0x0C));			   // Shift the Line 1 - 0EH	
	LCD_print(string1);   			   // Print String 1
    
	LCD_cmd((0x80 | 0x4C));			   // Shift to Line 2 - 4EH
	LCD_print(string2);   			   // Print String 2

	LCD_cmd((0x80 | 0x00));			   // Shift to Line 1 - 00H
	LCD_print(string4);   			   // Print String 4
    
	LCD_cmd((0x80 | 0x0A));			   // Shift to Line 1 - 0DH
	LCD_print_char(0xF4);			   // Print symbol of "ohm"
	
	LCD_cmd((0x80 | 0x40));			   // Shift to Line 2 - 40H
	LCD_print(string6);   			   // Print String 3
	
	LCD_cmd((0x80 | 0x4A));			   // Shift to Line 1 - 0DH
	LCD_print_char(0xF4);			   // Print symbol of "ohm"
	
	LCD_cmd((0x80 | 0x1D));			   // Shift to Line 2 - 1BH
	LCD_print(string3);   			   // Print String 5
	
	LCD_cmd((0x80 | 0x27));			   // Shift to Line 1 - 27H
	LCD_print_char(0xF4);			   // Print symbol of "ohm"
	
	LCD_cmd((0x80 | 0x5D));			   // Shift to Line 2 - 5AH
	LCD_print(string5);   			   // Print String 6
	
	LCD_cmd((0x80 | 0x67));			   // Shift to Line 2 - 67H
	LCD_print_char(0xF4);			   // Print symbol of "ohm"
	
}
int get_info()
{ 
  DDRC = 0xFF;
  PORTC |= (1<<6);
  PORTC |= (1<<7);
	
  delay_time(2);
  DDRC = 0x00;
  delay_time(100);	
  return (PINC);
}
void set_current(int curr)
{	
	unsigned int current_get; 
 	int check;
	char curr1[]="*I=100uA-40~100*";
	char curr2[]="*I=40uA -1k~3k *";
	char curr3[]="*** I =  5uA ***";
	char curr4[]="*I = 40uA (def)*";
	

	DDRC = 0xFF;
	PORTC &= (~(1<<6));
	PORTC &= (~(1<<7));
	
	switch(curr)
	{
		 case 1:	   
		 	  		  // clear_current_ch1();
		 	  		  // set_current_ch2();
		 			  // set_current_ch3();
					   
					   LCD_cmd((0x80 | 0x4C));			   // Shift to Line 2 - 4EH
    				   LCD_print(curr1);   			   // Print String 2
					   break;
		
		 case 2:	   
		 	  		  // set_current_ch1();
		 	  		  // clear_current_ch2();
		 			  // set_current_ch3();
					   
					   LCD_cmd((0x80 | 0x4C));			   // Shift to Line 2 - 4EH
    				   LCD_print(curr2);   			   // Print String 2
					   break;
		
		 case 3:	   
		 	  		 //  set_current_ch1();
		 	  		 // set_current_ch2();
		 			 //  clear_current_ch3();
					   
		 	  		   LCD_cmd((0x80 | 0x4C));			   // Shift to Line 2 - 4EH
    				   LCD_print(curr3);   			   // Print String 2
					   break;
					   
		 case 4:       
		 	  		 //  clear_current_ch1();
		 	  		 //  set_current_ch2();
		 			 //  clear_current_ch3();
					   
					   LCD_cmd((0x80 | 0x4C));			   // Shift to Line 2 - 4EH
    				   LCD_print(curr4);   			   // Print String 2
					   break;
	}
}
void gain_control(int amp, int ch)
{
 	 
	 DDRC=0xFF;
	 DDRD |= (1 << DDD6);
	 DDRD |= (1 << DDD7);
	
	 switch(amp+ch)
	 {
	  	case 11:	Gain=16.6667;
			 		gain_control_set_G1();
		 			gain_control_set_G2();
		 			break;
		case 12:	Gain=16.6667;	
			 		gain_control_set_G3();
		 			gain_control_set_G4();
		 			break;
		case 13: 	Gain=16.6667;	
			 		gain_control_set_G5();
		 			gain_control_set_G6();
		 			
					break;
		case 14:	Gain=16.6667;	
			 		gain_control_set_G7();
		 			gain_control_set_G8();
		 			
					break;
		case 101:	Gain=100;
			 		gain_control_clear_G1();
		 			gain_control_set_G2();
		 			break;
		case 102:	Gain=100;
			 		gain_control_clear_G3();
		 			gain_control_set_G4();
		 			break;
		case 103:	Gain=100;
			 		gain_control_clear_G5();
		 			gain_control_set_G6();
		 			break;
		case 104:	Gain=100;
			 		gain_control_clear_G7();
		 			gain_control_set_G8();
		 			break;
		case 1001:	Gain=250;
			 		gain_control_set_G1();
		 			gain_control_clear_G2();
		 			break;
		case 1002:	Gain=250;
			 		gain_control_set_G3();
		 			gain_control_clear_G4();
		 			break;
		case 1003:	Gain=250;
			 		gain_control_set_G5();
		 			gain_control_clear_G6();
		 			break;
		case 1004:	Gain=250;
			 		gain_control_set_G7();
		 			gain_control_clear_G8();
		 			break;
	}
	
} 
void hard_config()
{ 	 unsigned int config_index;
	  
  
   	// determine the current setting
	config_index = get_info();
	
	switch((config_index & 0x03))
	{
	case 3:   set_current(1);
		 	  Current = 0.0001;
			  Gain_change[0] = 60;
			  Gain_change[1] = 600;
			  HardCalF=40;
			  break;
			  
	case 2:   set_current(2);
		 	  Current = 0.00004;
			  Gain_change[0] = 995;
			  Gain_change[1] = 2495;
			  Gain_change[2] = 1000;
			  Gain_change[3] = 2500;
			  HardCalF=1500;
			  break;
	case 1:   set_current(3);
		 	  Gain_change[0] = 50;
			  Gain_change[1] = 500;
			  Current = 0.000005;
			  break;
	case 0:   set_current(4);
			  Current = 0.00004;
			  Gain_change[0] = 100;
			  Gain_change[1] = 1000;
			  break;
	}
	
	AutoGain = 0;
	Target = 0;
	
	switch(((config_index & 0x3C)>>2))
	{
	 case 0:   Channel = 0; 		   	  		
	 	  	   AutoGain = 1;
			   CalCF=0;
			   break;
	 case 1:   Channel = 1; 
	 	  	   gain_control(10,1);
			   pre_gain[0]=10;
			   CalCF=0;
			   break;
	 case 2:   Channel = 2; 
	 	  	   gain_control(10,2);
			    pre_gain[1]=10;
			   CalCF=0;
			   break;
	 case 3:   Channel = 3; 
	 	  	   gain_control(10,3);
			    pre_gain[2]=10;
			   CalCF=0;
			   break;
	 case 4:   Channel = 4; 
	 	  	   gain_control(10,4);
			    pre_gain[3]=10;
			   CalCF=0;
			   break;
	 case 5:   Channel = 1; 
	 	  	   gain_control(100,1);
			    pre_gain[0]=100;
			   CalCF=0;
			   break;
	 case 6:   Channel = 2; 
	 	  	   gain_control(100,2);
			    pre_gain[1]=100;
			   CalCF=0;
			   break;
	 case 7:   Channel = 3; 
	 	  	   gain_control(100,3);
			    pre_gain[2]=100;
			   CalCF=0;
			   break;
	 case 8:   Channel = 4; 
	 	  	   gain_control(100,4);
			    pre_gain[3]=100;
			   CalCF=0;
			   break;
	 case 9:   Channel = 1; 
	 	  	   gain_control(1000,1);
			    pre_gain[0]=1000;
			   CalCF=0;
			   break;
	 case 10:  Channel = 2; 
	 	  	   gain_control(1000,2);
			   pre_gain[1]=1000;
			   CalCF=0;
			   break;
	 case 11:  Channel = 3; 
	 	  	   gain_control(1000,3);
			   pre_gain[2]=1000;
			   CalCF=0;
			   break;
	 case 12:  Channel = 4; 
	 	  	   gain_control(1000,4);
			   pre_gain[3]=1000;

⌨️ 快捷键说明

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