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

📄 oscilloscope3.c

📁 单片机通过DA对信号采样
💻 C
📖 第 1 页 / 共 2 页
字号:
 distab[3]=0x10;
 distab[4]=0x10;
 distab[5]=0x10;
 distab[6]=0x10;
 distab[7]=0x04;
}
//***************************************************************************************
void Vertical_MoveB()
{
 Shift_Flag=1;
 LED_CURSOR=2;
 Key_Flag=7;
 lcd_clear();
 Led_On=1;
 Glint_Flag=1;
 lcd_write_sentence(1,0,"请输入纵向平移值");
 lcd_write_sentence(2,1,"B 路波形");
 distab[0]=0x00;
 distab[1]=0x00;
 distab[2]=0x00;
 distab[3]=0x10;
 distab[4]=0x10;
 distab[5]=0x10;
 distab[6]=0x10;
 distab[7]=0x05;
}
//***************************************************************************************
void Frequence_Measure()         //测量当前波形的频率和波形
{
  long temph,templ;
  unint temp;
  //Frequence_Measure_Flag=!Frequence_Measure_Flag;
  //while(Frequence_Measure_Flag)
  //{
  unint i=5000;
  Frequence_Start=1;
  Frequence_Start=0;
  while(--i);
  temph=Wave_Frequence_High;
  templ=Wave_Frequence_Low;
  //templ=(templ+temph<<8)*3052/100;
  //temph=temph<<8;
  //temp=(templ+temph)*61;
  //Wave_Frequence=temp>>1;
  Wave_Frequence=(templ+temph*0x100)*2;
  //Wave_Frequence=10000000/(templ+temph*0x100);
  lcd_clear();
  lcd_write_sentence(1,0,"当前频率:        ");
  //lcd_write_sentence(2,1,"A 路波形");
  lcd_write_command(0x91);
  temp=Wave_Frequence/10000;
  lcd_write_data(0x30+temp);
  Wave_Frequence%=10000;
  temp=Wave_Frequence/1000;
  lcd_write_data(0x30+temp);
  Wave_Frequence%=1000;
  temp=Wave_Frequence/100;
  lcd_write_data(0x30+temp);
  Wave_Frequence%=100;
  temp=Wave_Frequence/10;
  lcd_write_data(0x30+temp);
  Wave_Frequence%=10;
  temp=Wave_Frequence;
  lcd_write_data(0x30+temp);
  //Wave_Frequence%=10000;
  lcd_write_sentence(2,4," HZ"); 
  //}
  //lcd_write_sentence(2,5,"暂停");
  //以下为测量幅度
  temp=Wave_Amplitude_Add;
  switch(Vertical_Gain_B_Grade)
   {
   case 0:
   Wave_Amplitude=(temp*8)/255;
   break;
   case 1:
   Wave_Amplitude=(temp*16)/255;
   break;
   case 2:
   Wave_Amplitude=(temp*40)/255;
   break;
   case 3:
   Wave_Amplitude=(temp*100)/255;
   break;
   case 4:
   Wave_Amplitude=(temp*160)/255;
   break;
   case 5:
   Wave_Amplitude=(temp*500)/255;
   break;
   case 6:
   Wave_Amplitude=(temp*800)/255;
   break;
   case 7:
   Wave_Amplitude=(temp*1600)/255;
   break;
   default:
   break;
   }
  //Wave_Amplitude=temp;
  lcd_write_sentence(3,0,"当前幅度:        ");
  lcd_write_command(0x99);
  temp=Wave_Amplitude/100;
  lcd_write_data(0x30+temp);
  lcd_write_sentence(4,2,".");
  Wave_Amplitude%=100;
  temp=Wave_Amplitude/10;
  lcd_write_data(0x30+temp);
  Wave_Amplitude%=10;
  temp=Wave_Amplitude;
  lcd_write_data(0x30+temp);
  //Wave_Frequence%=10000;
  lcd_write_sentence(4,4," V"); 
  
}
//***************************************************************************************
 void ENTER_down()              //ENTER键按下,根据特殊功能号,执行相应的功能
 {
  unint temp;
  ENTER=!ENTER;
  //Led_On=0;
  Glint_Flag=!Glint_Flag;
  Shift_Flag=0;
  switch(Key_Flag)
  {
   case 1:
      X_Frequence=distab[4]*10000+distab[3]*1000+distab[2]*100+distab[1]*10+distab[0];
	  //Frequence*=5;
      temp=_iror_(X_Frequence,8);
      X_Freq_High=temp;
      temp=X_Frequence%256;
      X_Freq_Low=temp;
      ENTER=0;
      lcd_clear();
      lcd_write_sentence(1,0,"频率设置成功!");
      lcd_write_sentence(2,1,"当前频率:");
      lcd_write_command(0x89);
      lcd_write_data(0x30+distab[4]);
      lcd_write_data(0x30+distab[3]);
      lcd_write_data(0x30+distab[2]);
      lcd_write_data(0x30+distab[1]);
      lcd_write_data(0x30+distab[0]);
      lcd_write_sentence(3,4,"HZ");
   break;
   case 2:
     ENTER=0;
	 lcd_clear();
     X_Pos=distab[2]*100+distab[1]*10+distab[0];
	 if(X_Pos>200)
	 {
	 X_Pos=0;
     lcd_write_sentence(2,0,"输入范围太大!");
	 }
	 else
	 {
     X_Move=X_Pos;
     lcd_write_sentence(1,0,"水平移相成功");
     lcd_write_sentence(2,1,"当前水平偏移:");
     lcd_write_command(0x8a);
     lcd_write_data(0x30+distab[2]);
	 lcd_write_data(0x30+distab[1]);
     lcd_write_data(0x30+distab[0]);
	 }
   break;
   case 3:
     ENTER=0;
	 lcd_clear();
     Trigger_V=distab[2]*100+distab[1]*10+distab[0];
     if(Trigger_V>500)
     {
      lcd_write_sentence(1,0,"电平输入太大!");
      lcd_write_sentence(2,0,"请重新输入!");
      Trigger_V=0;
     }
     else
     { 
     Trigger_Voltage=Trigger_V/2;
     lcd_write_sentence(1,0,"触发电平设置成功");
     lcd_write_sentence(2,1,"当前触发电平:");
     lcd_write_command(0x89);
     lcd_write_data(0x30+distab[2]);
	 lcd_write_sentence(3,2,".");
     lcd_write_data(0x30+distab[1]);
     lcd_write_data(0x30+distab[0]);
     lcd_write_sentence(3,4,"V");
     }
   break;
   case 6:
     Vertical_Pos_A=distab[2]*100+distab[1]*10+distab[0];
	 Vertical_Move_A=Vertical_Pos_A;
	 lcd_clear();
	 lcd_write_sentence(1,1,"当前垂直偏移A:");
	 lcd_write_command(0x91);
     lcd_write_data(0x30+distab[2]);
	 lcd_write_data(0x30+distab[1]);
     lcd_write_data(0x30+distab[0]);
   break;
   case 7:
     Vertical_Pos_B=distab[2]*100+distab[1]*10+distab[0];
     Vertical_Move_B=Vertical_Pos_B;
	 lcd_clear();
     lcd_write_sentence(1,1,"当前垂直偏移B:");
	 lcd_write_command(0x91);
     lcd_write_data(0x30+distab[2]);
	 lcd_write_data(0x30+distab[1]);
     lcd_write_data(0x30+distab[0]);
   break;
   default:
   break;
   }
 } 


//***************************************************************************************
void keyprg(unchar key)  //键盘键值执行的程序
{  
  //unchar i;
  if((key<=9)&Shift_Flag)
   {   
      distab[LED_CURSOR]=KEYNUM;        //键值送入distab最低位保存
	   if(LED_CURSOR>0)                //光标移位
           LED_CURSOR--;
       else 
           LED_CURSOR=0;
    display(0); //显示键值
   	}
  else 
   {
    switch(key)
	   {
	     case 0x00:             
		      Set_X_Freq();
	     break;
	 	 case 0x01:             
		      Set_X_Pos();
	     break;	 
		 case 0x02:             
		      Set_Trigger_Voltage();
	     break;	 
		 case 0x03:             
		      Lock_Current_Wave();
	     break;	 
		 case 0x04:             
		      Single_Select();
	     break;	 
		 case 0x05:             
		      Vertical_GainA();
	     break;	 
		 case 0x06:             
		      //Vertical_GainB();
			  Frequence_Measure();
	     break;	 
		 case 0x07:             
		      Vertical_MoveA();
	     break;
	     case 0x08:             
		      Vertical_MoveB();
	     break;
		 case 0x09:             
		      //Select_AB_Channel();
              Input_Select();
	     break;
		 case 0x0A:             
		       //Reset();
			   //Input_Select();
			   //Frequence_Measure();
	     break;	 
		 case 0x0B:                              //功能键F2
	           Shift_Flag=!Shift_Flag;
	     break;	 
		 case 0x0C:                              //KeyprgBack();
		          if(LED_CURSOR<7)                //光标移位
                       LED_CURSOR++;
                   else 
                       LED_CURSOR=0;
                       display(0);               //显示键值
	     break;
	 	 case 0x0D:  //加
		           if(distab[LED_CURSOR]<0x09)
		                distab[LED_CURSOR]++;
                   else
                        distab[LED_CURSOR]=0;
                        display(0); //显示键值
	     break;	
 		 case 0x0E:    //减
		           if(distab[LED_CURSOR]>0)
		           distab[LED_CURSOR]--;
              
		 else
               distab[LED_CURSOR]=9;
			   display(0); //显示键值
		    
	     break;	 
		 case 0x0F:       
		          ENTER_down();        
	     break;	 
		 default:
	     break;	 
		}
	 }

}
//**************************************************************************************
void intt0() interrupt 0     //键盘中断
{ 
 
 //EX0=0;                //关键盘中断,禁止相应其他按键
 KEYNUM=P1;              //从p1口读入键盘值
 KEYNUM=KEYNUM&0x0f;     //取低四位;
 keyprg(KEYNUM);
 //if(ENTER)             //不是ENTER键,屏蔽中断
 //EX0=1;
}

//**************************************************************************************
void Initial8155()         //8155初始化程序
{
 CMD8155=0x0f;             //PA,PB基本输出方式,PC作为控制信号
}
//**************************************************************************************
void clock0_initial()      //定时器0初始化
{
 TMOD=0x01;
 TF0=0;
 TH0=00;
 TL0=00;
 TR0=1;
}
 
void clock0_int() interrupt 1     //定时器0中断,向FPGA送入连续触发脉冲
{
  TH0=00;
  TL0=00;
  tempflag=!tempflag;
  //if(Single_Flag)
  Single_Auto_Select=tempflag;
  //PA8155=tempflag;
  //PB8155=tempflag;
 }

//**************************************************************************************
void main()         
{
  //uint i; 
  //while(i--);
  EX0=1;
  ET0=1;
  EA=1;
  PX0=1;
  lcd_init();
  Initial8155();
  Led_On=1;
  display(0);
  lcd_write_passage("南开大学信科院电信系:史永杰,余建伟,岳文赫--  简易示波器");
  //lcd_clear();
  //lcd_write_sentence(4,4,"南开大学");
  FpgaInitial();
  clock0_initial();
  while(1)
    {
    if(Glint_Flag)
      glint();
    }
}

⌨️ 快捷键说明

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