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

📄 main.c

📁 本系统参照片上系统的设计架构、采用FPGA与SPCE061A相结合的方法
💻 C
字号:
extern double log10(double);
//System function
extern void IO_INIT(void);
extern void WATCHDOG_CLEAR(void); 
//Bus function
extern void SET_ADDR(char); 
extern void WRITE_DATA(char);
extern char READ_DATA(void);
//AD function
extern void  AD_Enable(void);
extern void  AD_Select(int);
extern int   AD_Data(void);
//Lcd function
extern void LCD_Init(void);
extern void LCD_Play(void);
extern void send_d(char);
extern void send_i(char);
//sinc signal generate function;
extern char *RES_SINC_SA;
//系统初始化程序
void System_Init(void);
void send_sinc_table(void);
void Play_OFF_V(void);
void Play_OFF_V(void);
//parament function
int OFF_V(void);
//Key service;
int Key;
int  Time;
int  Div;
char buff[16]={' '};      
int point;   

int Status;
int print_buff[7][5];

main()
{int i;
 IO_INIT();
 System_Init(); 
 L_Fill(0x10,"  电子设计大赛  ");
 L_Fill(0x08,"放大器参数测试仪");
 Key=0;
 Div=0x8000;
 Delay(4048);
 L_Fill(0x10,"  选择测量参数  "); 
 L_Fill(0x08,"                "); 
while(1)   
  {
  switch(Key)
    {
    case 53:
    case 61:
    case 37:
    case 45:
      SET_ADDR(0x40);
      WRITE_DATA(0x12);
      Delay(0xff);
      SET_ADDR(0x40);
      WRITE_DATA(0x02);         
      Key=0;
      WATCHDOG_CLEAR();    
      break;
     case 46:
    // 上升时间测量:
       Delay(0xff);
       Play_Rise_Time();
       Key=0;
       WATCHDOG_CLEAR();
    break;         
    case 3:
    //共模抑制比参数测量
       Delay(0xff);
       Play_CMRR();
       Key=0;
       WATCHDOG_CLEAR();
    break;
    
    case 5:
    //开环电压增益
       Delay(0xff);
       Play_KAV();
       WATCHDOG_CLEAR();  
       Key=0;
    break;
    case 6:
    //自动测试功能
       Delay(0xff);
       KAV();
       Delay(1024);
       Play_KAV();   
       CMRR();
       Delay(1024);
       Play_CMRR();
       OFF_V();
       Delay(1024);
       Play_OFF_V();   
       OFF_I();
       Delay(1024);
       Play_OFF_I();
       Delay(1024);
       Play_BWG();
       Delay(0xff);
       Play_Rise_Time();
       Title();
       for(Status=1;Status<7;Status++)
          Print();
       sign();   
       Key=0;       
       WATCHDOG_CLEAR();
    break;
    case 11:
      frequency_up();
      Delay(0xff);  
      Key=0;
      break;
    case 19:
      frequency_down();
      Delay(0xff);
      Key=0;
      break;
    case 13:
       Delay(0xff);
       Play_OFF_V();
       Key=0;
       WATCHDOG_CLEAR();
    break;
    case 14:
       Key=0;
       Delay(0xff);
       Play_PC();
       WATCHDOG_CLEAR();
    break;
    case 0x15:
       Delay(0xff);
       Play_OFF_I();  
       Key=0;     
       WATCHDOG_CLEAR();
    break;
//-3dB带宽测量
    case 29:
    Delay(0xff);
    Play_BWG();
    Key=0;
    WATCHDOG_CLEAR();
    default:
      break;   
// 打印功能      
    case 54:
    Delay(0xff);
    Title();
    Print();
    Key=0;
    sign();
    WATCHDOG_CLEAR();
    break;
    }
    WATCHDOG_CLEAR();
  }
}

void System_Init(void)
  {
  LCD_Init();
  send_sinc_table();
  SET_ADDR(0x40);
  WRITE_DATA(0x02); 
  }
  
void send_sinc_table(void)
  {int i;
   SET_ADDR(0x01);
   WRITE_DATA(0x02);     
   for(i=0;i<256;i++)
   {
   SET_ADDR(0x02);
   WRITE_DATA(i);    
   SET_ADDR(0x04);
   WRITE_DATA(RES_SINC_SA[i]); 
   WATCHDOG_CLEAR();
   }
   SET_ADDR(0x01);
   WRITE_DATA(0x03);        
   for(i=256;i<500;i++)
   {
   SET_ADDR(0x02);
   WRITE_DATA(i);    
   SET_ADDR(0x04);
   WRITE_DATA(RES_SINC_SA[i]);  
   WATCHDOG_CLEAR();
   }   
   for(i=500;i<512;i++)
   {
   SET_ADDR(0x02);
   WRITE_DATA(i);    
   SET_ADDR(0x04);
   WRITE_DATA(0x00);  
   WATCHDOG_CLEAR();
   }          
   SET_ADDR(0x01);
   WRITE_DATA(0x00);         
} 
//液晶显示子程序
   void Play_OFF_V(void)
   {
   int Temp;
   send_i(0x01);  
   L_Fill(0x10,"  输入失调电压  ");
   L_Fill(0x08,"          mV    ");
   Temp=OFF_V()*3.3;
   Status=1;
   Play_num(Temp);  
   }
   void Play_OFF_I(void)
   {
   int Temp;
   send_i(0x01);  
   L_Fill(0x10,"  输入失调电流  ");
   L_Fill(0x08,"         nA     ");
   Temp=OFF_I()*3.3;
   Status=2;
   Play_num(Temp);  
   }  
   void Play_CMRR(void)
   {
   int Temp;
   LCD_Init();
   L_Fill(0x10,"  共模抑制比  ");
   L_Fill(0x08,"        dB      ");
   Temp=CMRR();
   Temp=20*log10(Temp*3.3);
   Temp=120-Temp;
   Status=3;
   Play_dB(Temp);  
   }     
   void Play_KAV(void)
   {
   int Temp;
   send_i(0x01); 
   L_Fill(0x10,"  开环放大倍数  ");
   L_Fill(0x08,"         dB     ");
   Temp=KAV()*3.3;
   Temp=log10(Temp);
   Temp=120-20*Temp;
   Status=4;
   Play_dB(Temp);  
   }     
   void Play_BWG(void)
   {
   int i,Temp[4];
   int freq;
   send_i(0x01);  
   L_Fill(0x10,"    -3dB带宽    ");
   L_Fill(0x08,"         kHz    ");   
   Status=5;
   BWG();
   point+=7;   
   
   for(i=0;i<4;i++)
    {
    Temp[i]=0x30+freq%10;
    freq=freq/10;
    print_buff[Status][i]=Temp[i]; 
    }
    send_i(0x8A);
   for(i=3;i>=0;i--)
     send_d(Temp[i]);  
   }
   
void Play_PC()
{  int i;
   send_i(0x01);
   L_Fill(0x10,"Connect with PC");
   while(!Key)
   {send_i(0x88);
    for(i=0;i<16;i++)
      {Delay(0xff);
       send_d('>');
       }
   L_Fill(0x08,"                ");   
   }
}
   
void Play_Rise_Time(void)
  {int i,Temp[4];
   int rise_Time;
   L_Fill(0x10,"    上升时间    ");
   L_Fill(0x08,"          ns    ");   
   send_i(0x008A);  
   Status=6;

   for(i=0;i<4;i++)
    {
    Temp[i]=0x30+rise_Time%10;
    rise_Time=rise_Time/10;
    print_buff[Status][i]=Temp[i];    
    }
  for(i=3;i>=0;i--)
     send_d(Temp[i]);     
  } 
//数据转换子程序
  void Play_num(int num)   
  {
  int i,Temp[4]={0};
  int num_buff;
  num_buff=num;
  send_i(0x008a);
  for(i=0;i<4;i++)
    {
    Temp[i]=0x30+num_buff%10;
    num_buff=num_buff/10;
    print_buff[Status][i]=Temp[i];
    }
  for(i=3;i>=0;i--)
  {send_d(Temp[i]);  
   if(i==3)
   send_d('.'); 
  }
}
  
  void Play_dB(int num)
  {
  int i,Temp[3];
  int num_buff;
  num_buff=num;
  send_i(0x008a);
  for(i=0;i<3;i++)
    {
    Temp[i]=0x30+num_buff%10;
    num_buff=num_buff/10;
    print_buff[Status][i]=Temp[i];
    }
  for(i=2;i>=0;i--)
     send_d(Temp[i]);
  }
//参数测量部分
    //输入失调电压测量
    int OFF_V(void)
  	{
  	int i;
  	long int buff;
    SET_ADDR(0x40);
    WRITE_DATA(0x02);
    //AD 转换测量
      AD_Enable();
      AD_Select(0x06);
      Delay(512);  
        buff=0;
     for(i=0;i<256;i++)
      buff+=AD_Data();
     if(buff<0x35000)
      return 
        buff/256;
      SET_ADDR(0x40);
      WRITE_DATA(0x0A);
      Delay(512);
        buff=0;
     for(i=0;i<256;i++)
      buff+=AD_Data(); 
     return
      buff/256;       
  	}  	 
    //输入失调电流测量
    void OFF_I(void)
    {int i;
  	 long int buff_1;
  	 long int buff_2;
     SET_ADDR(0x40);
     WRITE_DATA(0x22);
     Delay(512);  
    //AD 转换测量
      AD_Enable();
      AD_Select(0x06);
        buff_1=0;
     for(i=0;i<256;i++)
        buff_1+=AD_Data();
     SET_ADDR(0x40);
     WRITE_DATA(0x26);   
    Delay(512);  
    //AD 转换测量
      AD_Enable();
      AD_Select(0x06);
        buff_2=0;
     for(i=0;i<256;i++)
        buff_2+=AD_Data(); 
     if(buff_2>buff_1)   
        return (buff_2-buff_1)/256;     
      else
        return (buff_1-buff_2)/256;  
    }
    //共模抑制比测量
    int CMRR(void)
    {
    int i;
    long int Temp;
    SET_ADDR(0x40);
    WRITE_DATA(0x10);
    Delay(512);
      AD_Enable();
      AD_Select(0x04);
      Temp=0;
     for(i=0;i<200;i++)
     {
      Temp+=AD_Data();
      Delay(1);
     }
      return Temp/256;
    }
      
    //开环放大倍数测量
    void KAV(void)
    {int i;
    long int Temp;
    SET_ADDR(0x40);    
    WRITE_DATA(0x13);
    Delay(512);
    AD_Enable();
    AD_Select(0x04);
      Temp=0;
     for(i=0;i<200;i++)
     {
     Temp+=AD_Data();
     Delay(1);
     }
    return Temp/200;
    }
    //带宽增益积测量
    void BWG(void)
    { unsigned int i;
      AD_Enable();
      AD_Select(0x03);
     for(i=0xFFFF;i>0x7fff;i-=4)
     {
      SET_ADDR(0x08);
      WRITE_DATA(i);  
      SET_ADDR(0x10);
      WRITE_DATA(i>>8); 
      WATCHDOG_CLEAR(); 
      if(AD_Data()<0x2000)
         return i;      
      }     
      return i;
     }    
    
    //上升时间测量
    int Rise_Time(void)
    {
    SET_ADDR(0x20);
    WRITE_DATA(0x00);  
    return READ_DATA(); 
    }
     
 void Delay(int interval)
 {
   Time=0;
 while(Time<interval)
   WATCHDOG_CLEAR();  
 }
 
 
 frequency_up()
 {
 if(Div>=0x8000)
   Div--;
   SET_ADDR(0x08);
   WRITE_DATA(Div);  
   SET_ADDR(0x10);
   WRITE_DATA(Div>>8); 
   WATCHDOG_CLEAR();     
 }
 
 frequency_down()
 {
 if(Div<0xffff)
   Div++;
   SET_ADDR(0x08);
   WRITE_DATA(Div);  
   SET_ADDR(0x10);
   WRITE_DATA(Div>>8); 
   WATCHDOG_CLEAR();  
 }
 

⌨️ 快捷键说明

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