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

📄 all.c

📁 集成运放参数测量总程序
💻 C
字号:
#include"reg51.h"
#include"INTRINS.H"
#include<math.h>
/*-----------------------------------------------------------------------*/
/*-------------------------变量定义--------------------------------------*/
sbit P10=P1^0;/*继电器控制2,1,3,4*/
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;


sbit AD9851_OUT=P1^4;/*AD8951信号源控制*/
sbit AD9851_CLK=P1^5;
sbit AD9851_FQUD=P1^6;

sbit TLC549_CS=P2^4;/*TLC549_AD采样控制*/
sbit TLC549_DATA=P2^3;
sbit TLC549_CLK=P2^2;             

sbit KEY_LD=P2^0;/*串行按键控制*/
sbit KEY_CLK=P2^1;
sbit KEY_DAT=P3^4;
sbit KEY_IRQ=P3^5;

sbit Lcd_RS=P2^7;/*液晶显示控制*/
sbit Lcd_RW=P2^6 ;
sbit Lcd_CS=P2^5 ;

char n; 	
unsigned char nl=0,nk=0,number,key_value=0;
unsigned long INPUT=0;
unsigned char cvoltage; 
float Ri=100,Rf=50000,Vs=11.4;/*******************Vs数值待定***************************/
unsigned long R=1000000;
float VL0,Vio,IVL0,IVL1,Iio,AVL0,Avd,KVL0,Kcmr;
float middle; 

unsigned char seg[]="   000.0000  ";
unsigned char dispram[8]={0,0,0,0,0,0,0,0};

/*---------------------------------------------------------------------*/
/*-----------------------------函数声明--------------------------------*/

void read(void);
void key_get();
void intimer(void);
//void SETUP_AD9851();
//void input(unsigned long datal,unsigned int datah);
unsigned char TLC549_AD(void);

void LcdWrite(unsigned char value , bit RS);
unsigned char LcdRead(bit RS);
void LcdWriteCmd(unsigned char value , unsigned char attrib);
void LcdWriteData(unsigned char value);
unsigned char LcdReadData();
void LcdInit(void);
void LocateXY(char x , char y);
void PutChar(char x , char y , char value);
void PutStr(char x , char y , char* str);
unsigned char Hex2Ascii(unsigned char hex);
void dispaly(void);
void team(float middle); 
void delay(unsigned int time); 

void Vio_test();
void Iio_test();
void Avd_test();
void Kcmr_test();

/*----------------------------------------------*/
/*------------通用延时程序----------------------*/
void delay(unsigned int time)     // time*0.5ms延时
{
   unsigned int i,j;

   for(j=0;j<time;j++)
     {
       for(i=0;i<60;i++)
       {;}
      }
}



/*---------------------------------------------------*/
/*-------------------液晶显示模块--------------------*/

void LcdWrite(unsigned char value , bit RS)
{
	
	Lcd_RS = RS ;	
	Lcd_RW = 0 ;	
	Lcd_CS = 0 ;
	
	P0 = value ;
	
	Lcd_CS = 1 ;
	
}

/***************************************
说明: 	LCD读函数,完成LCD读操作的物理时序
RS:		0 - 写指令
		1 - 写数据
return:	读出的具体值
*****************************************/
unsigned char LcdRead(bit RS)
{
	unsigned char rt ;	
	Lcd_RS = RS ;	
	Lcd_RW = 1 ;
	
	P0 = 0xff ;
	
	Lcd_CS = 0 ;
	Lcd_CS = 0 ;
	Lcd_CS = 0 ;
	Lcd_CS = 0 ;
	
	rt = P0 ;
	
	Lcd_CS = 1 ;

	return rt ;
}	

/***************************************
说明: 	LCD写指令
value:	写的具体值
attrib:	0 - 不检测忙信号
	   	1 - 监测忙信号
*****************************************/
void LcdWriteCmd(unsigned char value , unsigned char attrib)
{
	
	if(attrib)
		while( LcdRead(0)&0x80 ) ;

	LcdWrite(value , 0);
 }

/***************************************
说明: 	LCD写数据
*****************************************/
void LcdWriteData(unsigned char value)
{
 	
	while( LcdRead(0)&0x80 ) ;

	LcdWrite(value , 1);
}

/***************************************
说明: 	LCD读数据
*****************************************/
unsigned char LcdReadData()
{
	
	while( LcdRead(0)&0x80 ) ;

	return LcdRead(1);
}


/***************************************
说明: 	LCD初始化函数
*****************************************/
void LcdInit(void)
{
	delay(800);
	
	LcdWriteCmd(0x38 , 0 );
	
	delay(10);

	LcdWriteCmd(0x38 , 0 );
	delay(10);

	LcdWriteCmd(0x38 , 0 );
	delay(10);
	
	LcdWriteCmd(0x38 , 1 );

	LcdWriteCmd(0x08 , 1 );
	
	LcdWriteCmd(0x01 , 1 );
	
	LcdWriteCmd(0x06 , 1 );
	
	LcdWriteCmd(0x0c , 1 );

}

/***************************************
说明: 	设置光标定位
*****************************************/
void LocateXY(char x , char y)
{
	unsigned char temp;

	temp = x & 0xf;
	y &= 0x1;
	if ( y )temp |= 0x40;
	temp |= 0x80;
	LcdWriteCmd(temp,1);
}

/***************************************
说明: 	显示字符
x: 横坐标 y: 纵坐标
value: 显示字符的ASC码
*****************************************/
void PutChar(char x , char y , char value)
{
	LocateXY(x,y);
	LcdWriteData(value);
}

/***************************************
说明: 	显示字符串
*****************************************/
void PutStr(char x , char y , char* str)
{
	unsigned char i,len=0;
	
	while (str[len] >31)
		len++;
	
	
	for (i=0;i<len;i++) 
	{
		PutChar(x++,y,str[i]);
		if ( x == 16 )
		{
			x = 0; y ^= 1;
		}
	}
}

unsigned char Hex2Ascii(unsigned char hex)
{
 if(hex>9)
    return' ';
 else                         
    return(hex+'0');
}

void display(void)
{                                                        
 unsigned char i; 
 for(i=0;i<8;i++)
    {
	 if(i==2)
	    seg[i+4]=46;
     else
	    seg[i+4]=Hex2Ascii(dispram[i]);
 	 }
 }     

 
void team(float middle) 
{   
    long m;
	m=(long)(middle*10000);  
	dispram[0]=m/1000000;   
	dispram[1]=(m%1000000)/100000;                                                                
	dispram[2]=(m%100000)/10000;                                      
	dispram[4]=(m%10000)/1000;           
	dispram[5]=(m%1000)/100;          
	dispram[6]=(m%100)/10;
    dispram[7]=m%10;             
    display();                                                                
    delay(100); 
}



/*-------------------------------------------------------*/
/*--------------------AD9851信号源模块-------------------*/


void input(unsigned long datal,unsigned int datah)
{

  unsigned char m,n;

  AD9851_FQUD=0;
   for(n=0;n<32;n++)
  { 

     AD9851_CLK=0;                                             
      if (datal&0x01)                                                
          AD9851_OUT=1;             
      else
          AD9851_OUT=0;             
      AD9851_CLK=1;           
        datal=datal>>1;
  } 
  
  for(m=0;m<8;m++)
  { 
  
     AD9851_CLK=0;                                           
      if (datah&0x01)                                                
         AD9851_OUT=1;            
      else
         AD9851_OUT=0;            
     AD9851_CLK=1;          
       datah=datah>>1;
  } 
  AD9851_FQUD=1;


}

void SETUP_AD9851()/*初始化*/

{
  input(0x00000000,0x01);
}



/*-----------------------------------------------------*/
/*---------------TLC549AD采样模块----------------------*/

unsigned char TLC549_AD(void)
{
  char i;
  unsigned char rt=0;
  TLC549_DATA=1;
  TLC549_CLK=0;
  TLC549_CS=0;

  if(TLC549_DATA&1)
    rt|=0x80;
  TLC549_CLK=1;
  TLC549_CLK=0;

  for(i=6;i>=0;i--)
     {
 	   TLC549_CLK=1;
	   if(TLC549_DATA&1)
		  rt|=1<<i;
       TLC549_CLK=0;
 	 }
  TLC549_CLK=1;
  TLC549_CS=1;	
  return rt;
}


/*------------------------------------------------------------*/
/*-------------------------串行按键模块-----------------------*/

void read()
{	  
		KEY_LD=0;
		KEY_CLK=1;
		KEY_IRQ=1;
		
	if(KEY_IRQ)
	{		
			
	  KEY_LD=1;
		_nop_();
		_nop_();
		KEY_LD=0;
		while(KEY_IRQ);
		{    	        
			INPUT=0;
			KEY_DAT=1;			
			for(n=14;n>=0;n--)
			{
				KEY_CLK = 0 ;
			
				if(KEY_DAT)
					INPUT|=1<<n;	    
				KEY_CLK = 1 ;
			}			
		}
	}
}

 void key_get()/*对应按键*/
{

  switch(INPUT)
     {
       case 1:
	               key_value=1;   break;/*切换键*/
       case 2:     
                   key_value=2;   break;/*测量键*/
       case 4:
	               key_value=3;   break;
       case 8:
	               key_value=4;   break;
       case 16:
	               key_value=5;   break;
       case 32:
	               key_value=6;   break;
       case 64:
	               key_value=7;   break;
       case 128:
	               key_value=8;   break;
       case 256:
	               key_value=9;   break;
       case 512:  
	               key_value=10;  break;
       case 1024:
	               key_value=11;  break;
       case 2048:
	               key_value=12;  break;
       case 4096: 
	               key_value=13;  break;
       case 8192:
	               key_value=14;  break;
       case 16384:
	               key_value=15;  break;
       case 32768: 
	               key_value=16;  break;      
       default:    break;
     }
}

/*---------------------------------------------------*/
/*----------------------测量模块---------------------*/
void Vio_test()
{
 P10=1;
 P11=1; 
 P12=0;
 P13=0;/*继电器一次动作*/
 _nop_();
 _nop_();
 cvoltage=TLC549_AD();
 VL0=(float)cvoltage*5/255;
 Vio=(float)(Ri*VL0/(Ri+Rf));
 team(Vio);
}

void Iio_test()
{
 /*继电器两次动作*/

 /*第一次动作*/
 P10=1;
 P11=1;
 P12=0;
 P13=0;
 _nop_();
 _nop_();
 cvoltage=TLC549_AD();
 IVL0=(float)cvoltage*5/255;
 /*第二次动作*/
 P10=0;
 P11=0;
 P12=0;
 P13=0;
 _nop_();
 _nop_();
 cvoltage=TLC549_AD();
 IVL1=(float)cvoltage*5/255;
 Iio=(float)((Ri*(IVL1-IVL0))/(R*(Ri+Rf)));
 team(Iio);
}

void Avd_test()
{
 /*继电器一次动作*/
 P10=1;
 P11=1;
 P12=0;
 P13=1;
 _nop_();
 _nop_();
 cvoltage=TLC549_AD();
 AVL0=(float)cvoltage*5/255;
 Avd=(float)(20*log((Vs*(Ri+Rf))/(AVL0*Ri)));
 team(Avd);
}

void Kcmr_test()
{
 /*继电器一次动作*/
 P10=1;
 P11=1;
 P12=1;
 P13=0;
 _nop_();
 _nop_();
 cvoltage=TLC549_AD();
 KVL0=(float)cvoltage*5/255;
 Kcmr=(float)(20*log((Vs*(Ri+Rf))/(KVL0*Ri)));
 team(Kcmr);
}

/*------------------------------------------*/
/*-----------------主函数-------------------*/
void main()
{
 P1=0xff;
 
 LcdInit();/*液晶初始化*/
 PutStr(0,0,"  MEASURE  ");

 SETUP_AD9851();/*AD8951初始化*/
 input(119,0x01);/*起始输出5HZ信号*/

 intimer();
 TR1=1;
 
 while(1)
 {
  
  key_get();
  switch(key_value)
      { 
	   case 1:   
 				  number=1;
                  PutStr(0,0,"Vio is     ");
                  PutStr(0,1,"  Press Key5  ");      
                  break;              
        case 2:  
                  number=2;
	              PutStr(0,0,"Iio is     ");  
                  PutStr(0,1,"  Press Key5  ");                  
                  break;                                                    
    	case 3:  
                  number=3;
	              PutStr(0,0,"Avd is     ");
                  PutStr(0,1,"  Press Key5  ");   
                  break;
        case 4:  
                  number=4;
    	          PutStr(0,0,"Kcmr is    ");
                  PutStr(0,1,"  Press Key5  "); 
				  break;
        case 5:   
                 if(number==1)             
                     { 
                       Vio_test();   
                        PutStr(0,1,seg);
                     }
               else if(number==2)
                      { 
                       Iio_test();
                        PutStr(0,1,seg);
                      }
               else if(number==3)
                      {
                       Avd_test();
                        PutStr(0,1,seg);
                      }
               else if(number==4)
                       { 
                         Kcmr_test();
                         PutStr(0,1,seg);
                       }         
               break;
                              /*信号源频率控制键*/ 
		case 6:P10=0;
		       nl++; 
               PutStr(0,0,"    +1HZ   ");
               PutStr(0,1,"                  ");
        	   input(119+23.9*nl,0x01);        
               break;
        case 7:P11=0;
    	       nl--;
               PutStr(0,0,"    -1HZ   ");
               PutStr(0,1,"                  ");
        	   input(119-23.9*nl,0x01);
               break;  
        case 8:P12=0;
		       nk++;
               PutStr(0,0,"    +1KHZ   ");
               PutStr(0,1,"                  ");
        	   input(119+23860.9*nk,0x01);
               break;
        case 9:P10=1;
		       nk--;
               PutStr(0,0,"    -1KHZ   ");
               PutStr(0,1,"                  ");
        	   input(119-23860.9*nk,0x01);
               break;
        default: break;
    }
  }                 
} 


/*----------------------------------------------------*/
/*---------------定时中断模块-------------------------*/

void intimer(void)/*5ms定时中断*/
{  

  TMOD=0x10;
  TH1=0xec;
  TL1=0x78;

  EA=1;
  ET1=1;
}

void timer(void) interrupt 3 using 2
{     
      TH1=0xec;
      TL1=0x78;
      TF1=0;
      TR1=0;
      read();
	   
  	  TR1=1;  
   	
}

                  

⌨️ 快捷键说明

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