基于sst单片机的数字示波器(很有价值).txt

来自「自己搜集的一些有关于自制51单片机示波器的资料 包括源代码和相关知识介绍」· 文本 代码 · 共 852 行 · 第 1/2 页

TXT
852
字号
         }
      CS2=0;CS1=1;
      for(k=0;k<8;k++)
      {
             write_cmd1(Page_Add+k);
             write_cmd1(Col_Add);           //列地址0
             for(j=0;j<64;j++)         //列地址自动加一
                  write_data1(0x00);
         }
}


//****************显示小数字*******************************




//***************************初始化LCD屏*******************
void init()  
{
  delay1(100);
  CS2=1; CS1=0;
  delay1(100);
  write_cmd1(Disp_Off);
  write_cmd1(Page_Add);
  write_cmd1(Start_Line);
  write_cmd1(Col_Add);
  write_cmd1(Disp_On);
  CS2=0; CS1=1;
  delay1(100);
  write_cmd1(Disp_Off);
  write_cmd1(Page_Add);
  write_cmd1(Start_Line);
  write_cmd1(Col_Add);
  write_cmd1(Disp_On);
}

void line_h(uchar x,uchar y,uchar l)
{
    uchar i;
 for(i=0;i<l;i++) point(x+i,y);
      
}

void line_v(uchar x,uchar y,uchar l)
{
    uchar i;
 for(i=0;i<l;i++) point(x,y+i);
      
}







wave()
{
    uchar data i,j,t=64;
 uint te;
 uchar xdata s[120];
 uchar tt=1;
/* line_h(8,0,120);
 line_h(8,63,120);
 line_v(8,0,64);
 line_v(127,0,64);
 for(i=1;i<4;i++)
     for(j=4;j<64;j++)point(j*2,16*i);

    for(i=0;i<10;i++)
     for(j=0;j<32;j++)point(12*i+8,j*2);
 
 */
 while(1)
 {
    
  cls();
  line_h(8,0,120);
     line_h(8,63,120);
     line_v(8,0,64);
     line_v(127,0,64);

  for(i=1;i<4;i++)
         for(j=4;j<64;j++)point(j*2,16*i);

     for(i=0;i<10;i++)
        for(j=0;j<32;j++)point(12*i+8,j*2);

  display_num(0,55,str_num,0);
  for(i=0;i<5;i++) display_num(0,3+11*i,str_num,5-i);
  for(i=0;i<6;i++)
  {
      point(6,5+11*i);point(7,5+11*i);
  }
  
     for(i=0;i<120;i++)
     {
      s[i]=adconvert();
        }
   for(i=1;i<120;i++)
   {
     
       te=s[i]*53;
          te=te/255;
          point(i+8,60-te);
          point(i+8,59-te);
     }
     for(i=0;i<5;i++)display8_16(60+7*i,55,str_vp,i);
     vp_p(s);
     for(i=0;i<3;i++)

     display_num(92+7*i,55,str_num,d[2-i]);
     point(100,61);point(100,62);
     /*screen1();
     te=fi_int&0x7ff;
     dd[0]=te/1000;
     dd[1]=te/100-dd[0]*10;
     dd[2]=te/10-dd[1]*10-dd[0]*100;
     dd[3]=te%10;

     for(i=0;i<4;i++)display_num(10+6*i,55,str_num,dd[i]);
     display_num(10+24,55,str_num,10);
     display_num(10+24+5,55,str_num,11);*/
     for(i=0;i<100;i++)delay1(500);
     if(key()!=0)
     {
         state=1;
      cls();
      break;

     }     
 }
}


/************************测频率*******************************/
void timer2(void) interrupt 5 using 3
{ TF2=0;
time2_count--;
  
 }
/**************************采样******************************/
void time1(void) interrupt 3 using 2  
{ 
  EA=0;
  TR1=0;
  TH1=(65536-1365)/256;
  TL1=(65536-1365)%256;   
  s[ii].real=adconvert();
  s[ii].image=0;
  ii++;
  TR1=1;
  EA=1;
  if(ii>=64)
  { 
      ET1=0;
   TR1=0;
   EA=0; 
   ii=0;  
   over=1;   
  }  
}
/**************************对外部计数***************************/
void time0(void) interrupt 1 using 1
{
 if(T0_counter<=Time_NO)
   {T0_counter++;    
    TR2=1;//启动T2
    }
 if(T0_counter>Time_NO)//够4个,停止T2,T0
    { 
   TR2=0;TR0=0;EA=0;ET0=0;ET2=0;T0_counter=0;//停止T0,T2            
      T2NOW=0;T2NOW=((T2NOW|TH2)<<8)|TL2;
      fi_int=(((Time_NO/2)*5461167)/((65535-time2_count)*65536+T2NOW+1+(65535-time2_count)*13));//计算频率
               
      time2_count=65535;   
      TH2=0;        
      TL2=0;
   TH0=0;
   TL0=0;
   /*if(fi_int>=625)
   {
       fs=42655/625;
   }
   else {fs=42665/fi_int;}//3276800/12/fi_int
   */
   TH1=(65536-1365)/256;
   TL1=(65536-1365)%256;
   ET1=1;
   TR1=1;//启动T1进行采样
   EA=1; 
      
     }
}   
/************************测频率并显示波形**********************/
void screen1(void)
{
 TMOD=0x16;//T0对外部计数,T1对内部定时
 TH0=255;
 TL0=255;//计1次数
 T2CON=0x00;//16位重装
 //CKCON=0x28;//T0,T2 在4 clock 下工作
 TH2=0;
 TL2=0;
 RCAP2L=0;
 RCAP2H=0;//初值清零
 PT0=1;//设置T0的优先级别高,T0继续判断是否到了4个周期 
 ET0=1;//开T/C0中断
 ET1=1;//开T/C1中断
 ET2=1;//开T/C2中断
 EA=1; 
 TR1=0;
 TR2=0;
 TR0=1;//启动T0
over=0;
while(over==0);
over=0;
   
}
 
  
unsigned char key()
{    unsigned char  k,tem,keytem;
    // uchar idata d[150]; 
     keytem=0;
  s0=1;s1=1;s2=1;s3=1;
     tem=P2 & 0x0f;
     if(tem!=0x0f)
     {   beep=0;
         for(k=0;k<40;k++)
         tem=P2 & 0x0f;
         if(tem!=0x0f)
         {    if(tem==0x07) keytem=1;
              else if(tem==0x0b) keytem=2;
              else if(tem==0x0d) keytem=3;
              else if(tem==0x0e) keytem=4;
         }
      }
      while(tem!=0x0f)
      tem=P2 & 0x0f;  
      beep=1;
      return(keytem);
}

void amp()
{
    uchar i,ii;
 for(i=2;i<33;i++)
 {
     for(ii=0;ii<s[i-2].real;ii++)
  {
         point(i*2,55-ii);
      point(i*2-1,55-ii);

   }
 }
}

hextobcd(uint x)
{
    uint i,t=1000;
 uint temp;
 temp=x;
 for(i=0;i<4;i++)
 {
     d[3-i]=x/t;
  x=x%t;
  t=t/10;
 }
 if(temp>1000)
 {
     for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
 }
 else if(temp>100)
 {
     d[3]=14;
     for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
 }
 else if(temp>10)
 {
     d[3]=d[2]=14;
     for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
 }

}


void cursor(uchar x)
{
    uchar i;
    CS1=0;CS2=1;
 write_cmd1(Page_Add+7);
 write_cmd1(Col_Add);
    for(i=0;i<64;i++)write_data1(0);
    write_cmd1(Page_Add+7);
 write_cmd1(Col_Add+x-2);
 write_data1(0x8);
 write_data1(0x4);
 write_data1(0xfe);
 write_data1(0x4);
 write_data1(0x8);   
}

static_fft()
{
   
 uchar i,j,iii;
 uchar ii=1;
 cls();
 line_h(0,0,68);
 line_h(0,55,68);
 hextobcd(0);
 for(i=0;i<8;i++)display_e(0,70+7*i,str_fft,i);
 for(i=0;i<2;i++)display_h(2,70+12*i,str_f,i);
 for(i=0;i<2;i++)display_num(10+105+5*i,19,str_num,i+10);//HZ
    for(j=1;j<7;j++)
 for(i=1;i<68;i=i+2) point(i,8*j);
 for(j=1;j<6;j++)
 for(i=2;i<56;i=i+2) point(11*j,i);
 line_v(0,0,56);
 line_v(68,0,56);
    amp();
 while(1)
 {
     
  iii=key();
  if(iii==1)
  {
     ii++;if(ii==32)ii=1;
  }
  else if(iii==2)
  {
      if(ii==1)ii=32;
   ii--;
  }
  else if (iii==3) 
  {
     cls();
     state=1;
     break;
  }
  cursor(2*ii);
  hextobcd(95*(ii-1));
  

 }
}

fft_screen()
{ 

    uchar i,j,iii;
 uchar ii=1;
 while(1)
 {
     cls();
     line_h(0,0,68);
     line_h(0,55,68);
  hextobcd(0);
  for(i=0;i<8;i++)display_e(0,70+7*i,str_fft,i);
  //for(i=0;i<4;i++)display_num(2,95+5*i,str_num,i+1);//频率
  for(i=0;i<2;i++)display_h(2,70+12*i,str_f,i);
  for(i=0;i<2;i++)display_num(10+105+5*i,19,str_num,i+10);//HZ
     for(j=1;j<7;j++)
     for(i=1;i<68;i=i+2) point(i,8*j);
     for(j=1;j<6;j++)
     for(i=2;i<56;i=i+2) point(11*j,i);
     line_v(0,0,56);
     line_v(68,0,56);

     for(i=0;i<64;i++)
  {
      s[i].real=adconvert();
   s[i].image=0;
  }
     FFT(s);
     amp();
  iii=key();
  if(iii==1)
  {
     ii++;if(ii==32)ii=1;
  }
  else if(iii==2)
  {
      if(ii==1)ii=32;
   ii--;
  }
  else if(iii==3)
  {
      cls();
   state=2;
   break;
  } 
  else if(iii==4)
  {
      cls();
   state=0;
   break;
  }
  cursor(2*ii);
  hextobcd(95*(ii-1));
  for(i=0;i<100;i++)delay1(500);
  

 }
}


main()
{
    init();
 cls();

 while(1)
 {
     if(state==0) wave();
   else if (state==1)fft_screen();
  else if (state==2)static_fft();


 }

}

⌨️ 快捷键说明

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