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

📄 oscilloscope1.c

📁 单片机通过DA对信号采样
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<AT89X52.H>
#include<absacc.h>
#include<intrins.h>
#define unchar  unsigned char 
#define unint   unsigned int
#define DisCmd XBYTE [0xC100]                     //7218控制字地址
#define DisData XBYTE [0xC000]                    //7218数据口地址
#define LedMode P1_5
#define scode 0xb0                                //7218软件译码方式命令字
#define bcode 0x90                                //B码译码方式命令字
#define hexcode 0xd0                              //软件译码方式命令字
#define CMD8155       XBYTE[0XEFF0]               //8155命令口
#define PA8155        XBYTE[0XEFF1]               //8155PA口
#define PB8155        XBYTE[0XEFF2]               //8155PB口
#define PC8155        XBYTE[0XEFF3]               //8155PC口
//*****************************************************************************************************
#define Wave_Frequence_Low      XBYTE[0XA0F0]  //测量波形频率低位
#define Wave_Frequence_High     XBYTE[0XA0F1]  //测量波形频率高位
//#define Wave_Amplitude_Add      XBYTE[0XA0F2]  //测量波形幅度
//#define Select_A              XBYTE[0xA0F3]  //|A路选通/断路            |     01/00
#define Select_AB               XBYTE[0xA0F3]  //|A,B路选通/断路          |     01/02/03(A,B,AB)
#define Frequence_Start         XBYTE[0XA0F4]  //频率测量控制字口         
//#define Vertical_Gain_A       XBYTE[0xA0F4]  //|A垂直增益挡位(三挡)   |     00/01/02
#define Vertical_Move_A         XBYTE[0xA0F5]  //|A垂直移动波形           |     00 ~ FF
//#define Select_B              XBYTE[0xA0F6]  //|B路选通/断路            |     01/00
//#define Vertical_Gain_B       XBYTE[0xA0F7]  //|B垂直增益挡位(三挡)   |     00/01/02
#define Vertical_Move_B         XBYTE[0xA0F8]  //|B垂直移动波形           |     00 ~ FF
#define Single_Auto_Select      XBYTE[0xA0F9]  //|单次/连续触发方式切换; |     01/00  
#define Trigger_Voltage         XBYTE[0xA0FA]  //|单次触发电平值          |     00 ~ FF
#define Lock_Wave               XBYTE[0xA0FB]  //|锁存当前波形;          |     先01后00
#define X_Freq_High             XBYTE[0xA0FC]  //|水平增益频率高八位;    |     00 ~ 3F
#define X_Freq_Low              XBYTE[0xA0FD]  //|水平增益频率低八位;    |     00 ~ FF
#define X_Move                  XBYTE[0xA0FE]  //|水平移动相位八位;      |     00 ~ C7
#define RESET                   XBYTE[0xA0FF]  //|重置信号reset;         |     置01

//*****************************************************************************************************
bit    Enter;                                               //enter键按下标志
bit    Glint_Flag;                                           //闪烁标志位
bit    Special_Down_Flag;
bit    Shift_Flag;
bit    Lock_Wave_Flag;
//bit    Select_A_Flag;
//bit    Select_B_Flag;
//bit    Lock_Wave;
bit    Led_On=1;
bit    tempflag;
unchar Select_Flag;
unchar AD_Channel;
//unchar AD_Controll;
long   Wave_Frequence;
//unchar Wave_Amplitude;
//unchar Frequence_Measure_Flag;                                 //波形频率测量标志
unchar keynum; 
unchar Single_Flag;                                            //单步标志
unchar Vertical_Pos_A;                                         //垂直偏移位置A
unchar Vertical_Pos_B;                                         //垂直偏移位置B
unchar Vertical_Gain_A_Grade;                                  //垂直增益等级A
unchar Vertical_Gain_B_Grade;                                  //垂直增益等B
unint  X_Frequence;                                            //X轴扫描频率
unint  X_Pos;                                                  //X轴平移位置
unint  Trigger_V;                                              //触发电平
unchar Key_Flag;                                              //功能键按键标志
unchar ledcursor=7;                                           //保存光标当前位置
unchar distab[8]={0x12,0x13,0x14,0x00,0x12,0x12,0x0e,0x11};   //要显示的内容 hello-pp
unchar code ledtab[]={ 0xfb,0xb0,0xed,0xf5,0xb6,0xd7,0xdf,0xf0,
                       //0,   1,    2,   3,   4,   5,   6,   7 
                       0xff,0xf7,0xfe,0x9f,0xcb,0xbd,0xcf,0xce,
                       //8    ,9   ,a   ,b   ,c    ,d  ,e    ,f  
                       0x80,0xbe,0x8b,0xee,0x84 };
                       //熄灭 H    L    P    -
//*****************************************************************************************************
extern void lcd_init();
extern void lcd_write_passage(unchar *string);
extern void lcd_write_sentence(unchar row,unchar col,unchar *string);
extern void lcd_write_command(unchar c);
extern void lcd_write_data(unchar ddata); //向LCD模块的字符发生器或显存写一个字节data。 
extern void lcd_clear();
//*****************************************************************************************************
void delay200ms()
 { 
   int i=10000,j=1000;
   for(;i>0;i--)
   for(;j>0;j--);
  } 
//***************************************************************************************   
void display(unchar dot)
{
   unchar i; 
   LedMode=1;
   DisCmd=scode;            //采用软件译码
   LedMode=0;
   if(Led_On)
   {
   for(i=0;i<8;i++)                    //将distab中的数据送如7218
   {
     if((i==dot)&(dot!=0))
	   DisData=ledtab[distab[i]]+0x80; //查表转化并将字型送入7218
	else
       DisData=ledtab[distab[i]];      //查表转化并将字型送入7218
   } 
  }
} 
//*************************************************************************************** 
void distab_clear()
{
  unchar i;
  for(i=0;i<8;i++)
  {
  distab[i]=0x10;
  }
} 
//***************************************************************************************  
void glint() //glintflag为1闪烁,flag为0,不闪烁;
{
  unchar  i;
  while(Glint_Flag&Led_On)            //光标位置闪烁
   {
    LedMode=1;
    DisCmd=scode;         //采用软件译码
	LedMode=0;
    for(i=0;i<8;i++)      //将distab中的数据送如7218       
      {
        if(i==ledcursor)
	        DisData=0x80; //查表转化并将字型送入7218 
	    else
            DisData=ledtab[distab[i]]; //查表转化并将字型送入7218
      }
	 delay200ms();
	 LedMode=1;
	 DisCmd=scode;            
	 display(0);
     delay200ms();
   }
}
//***************************************************************************************
/*初始化:A0F3:1, A0F4:2, A0F5:00, A0F6:0, A0F7:2, A0F8:00, A0F9:0, 
          A0FA:00, A0FB:0, A0FC:40, A0FD:00;初始挡位, A0FE:00  */
void FpgaInitial()          //初始化程序
{
  Select_AB=1;
// Vertical_Gain_A=2;
  Vertical_Move_A=0;
  //Select_A=0;
//Vertical_Gain_B=2;
  Vertical_Move_B=0;
  Single_Auto_Select=0;
  Trigger_Voltage=0;
  Lock_Wave=0;
  X_Freq_High=0x03;
  X_Freq_Low=0xE8;
  X_Move=0;
  Frequence_Start=0;
}
//***************************************************************************************
void Reset()         //Fpga复位
{
  //Special_Down_Flag=1;
  RESET=00;
}
//***************************************************************************************
void Set_X_Freq()   //设置X轴扫描频率,Key_Flag:1
{  
   Shift_Flag=1;
   //unint Freq,temp;
   Led_On=1;
   Key_Flag=1;
   ledcursor=4;
   Glint_Flag=1;
   distab[0]=0x00;
   distab[1]=0x00;
   distab[2]=0x00;
   distab[3]=0x00;
   distab[4]=0x00;
   distab[5]=0x10;
   distab[6]=0x10;
   distab[7]=0x01;
   display(0);
   lcd_clear();
   lcd_write_sentence(1,0,"请输X 轴扫描频率");
   lcd_write_sentence(2,1,"频率范围:");
   lcd_write_sentence(3,1,"0-100KHZ");
   
}
//***************************************************************************************
void Set_X_Pos()
{
   Shift_Flag=1;
   lcd_clear();
   Key_Flag=2;
   ledcursor=2;
   Glint_Flag=1;
   Led_On=1;
   distab[0]=0x00;
   distab[1]=0x00;
   distab[2]=0x00;
   distab[3]=0x10;
   distab[4]=0x10;
   distab[5]=0x10;
   distab[6]=0x10;
   distab[7]=0x02;
   display(0); 
   lcd_write_sentence(1,0,"请输入水平移相");
   lcd_write_sentence(2,1,"位置范围:");
   lcd_write_sentence(3,2,"0-200");
   
}
void Set_Trigger_Voltage()
{
   Shift_Flag=1;
   lcd_clear();
   Key_Flag=3;
   ledcursor=2;
   Led_On=1;
   Glint_Flag=1;
   distab[0]=0x00;
   distab[1]=0x00;
   distab[2]=0x00;
   distab[3]=0x10;
   distab[4]=0x10;
   distab[5]=0x10;
   distab[6]=0x10;
   distab[7]=0x03;
   //display(2); 
   lcd_write_sentence(1,0,"请输入触发电平");
   lcd_write_sentence(2,1,"电平范围:");
   lcd_write_sentence(3,2,"0-5V");
   
 }
//***************************************************************************************
void Lock_Current_Wave()
{
  //Special_Down_Flag;
  Lock_Wave_Flag=!Lock_Wave_Flag;
  Led_On=0;
  //Lock_Wave=Lock_Wave_Flag;
  lcd_clear();
  if(Lock_Wave_Flag)
  {
  lcd_write_sentence(2,1,"波形锁存成功!");
  Lock_Wave=1;
  }
  else
  {
  lcd_write_sentence(2,1,"波形解除锁定!");
  Lock_Wave=0;
  }
}
//***************************************************************************************
void Single_Select()
{
  //Special_Down_Flag
  lcd_clear();
  Led_On=0;
  Single_Flag=!Single_Flag;
  //Single_Auto_Select=Single_Flag;
  lcd_clear();
  lcd_write_sentence(1,0,"当前触发状态:");
  if(Single_Flag)
  {
   lcd_write_sentence(2,1,"单步");
   TR0=0;
   Single_Auto_Select=1;
   Single_Auto_Select=0;
  }
  else
  {
  lcd_write_sentence(2,1,"连续");
  TR0=1;
  }
}

//***************************************************************************************
/*
void Select_AB_Channel()
{
  lcd_clear();
  Led_On=0;
  
 // if(Select_Flag%3)
 // Select_Flag=0;
 // else
 // {
   if(AD_Controll)
   {
   switch(Select_Flag%3)
   {
    case 0:
    Select_AB=1;
	//Select_B=0;
    lcd_clear();
    lcd_write_sentence(2,1,"A 路选通");
    lcd_write_sentence(3,1,"B 路关闭");
	break;
    case 1:
    Select_AB=2;
	//Select_B=1;
    lcd_clear();
    lcd_write_sentence(2,1,"A 路关闭");
    lcd_write_sentence(3,1,"B 路选通");
	break;
	case 2:
    Select_AB=3;
	//Select_B=1;
    lcd_clear();
    lcd_write_sentence(2,1,"A 路选通");
    lcd_write_sentence(3,1,"B 路选通");
	break;
    default:
	break;
 //  }
    }
    Select_Flag++; 
   }
}
*/
//***************************************************************************************
void Input_Select()   //AD114输入选择
{
 unchar temp1,temp2;
 temp1=AD_Channel%3;
 temp2=PB8155;
 temp2=temp2&0xFC;
 switch(temp1)
 {
  case 0:
  //AD_Controll=0;
  PB8155=temp2;
  lcd_clear();
  lcd_write_sentence(2,1,"A 路选通");
  lcd_write_sentence(3,1,"B 路关闭");
  Select_AB=1;
  break;
  case 1:
  //AD_Controll=0;
  PB8155=temp2+2;
  Select_AB=2;
  lcd_clear();
  lcd_write_sentence(2,1,"A 路关闭");
  lcd_write_sentence(3,1,"B 路选通");
  break;
  case 2:
  //AD_Controll=1;
  lcd_clear();
  PB8155=temp2+1;
  lcd_write_sentence(2,1,"A 路选通");
  lcd_write_sentence(3,1,"B 路选通");
  Select_AB=3;
  break;
 }
  AD_Channel++;
}

//***************************************************************************************
void Vertical_GainA()
{ 
  unchar temp;
  Led_On=1;
  Key_Flag=4;
  if(Vertical_Gain_A_Grade<7)
  {
    Vertical_Gain_A_Grade++;
  }
  else
  Vertical_Gain_A_Grade=0;
  distab_clear();
  distab[0]=Vertical_Gain_A_Grade;
  display(0);
  temp=PB8155;
  temp=temp&0x03;
  PB8155=temp+_crol_(Vertical_Gain_A_Grade,5);
  //if(Vertical_Gain_A_Grade>2)
  //Vertical_Gain_A_Grade=0;
  //else
  //{
  // Vertical_Gain_B=Vertical_Gain_B_Grade;
  lcd_clear();
  lcd_write_sentence(1,0,"当前垂直增益档位");
  lcd_write_sentence(2,2,"A 路");
  //lcd_write_sentence(3,1,"0.01V/div");
  //lcd_write_command(0x8A);
  //lcd_write_data(0x30+Vertical_Gain_B_Grade);
  switch(Vertical_Gain_A_Grade)
   {
   case 0:
   lcd_write_sentence(3,1,"10mV/div");
   break;
   case 1:
   lcd_write_sentence(3,1,"20mV/div");
   break;
   case 2:
   lcd_write_sentence(3,1,"50mv/div");
   break;
   case 3:
   lcd_write_sentence(3,1,"0.1V/div");
   break;
   case 4:
   lcd_write_sentence(3,1,"0.2V/div");
   break;
   case 5:
   lcd_write_sentence(3,1,"0.5v/div");
   break;
   case 6:
   lcd_write_sentence(3,1,"1V/div");
   break;
   case 7:
   lcd_write_sentence(3,1,"2v/div");

⌨️ 快捷键说明

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