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

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

📁 自己搜集的一些有关于自制51单片机示波器的资料 包括源代码和相关知识介绍
💻 TXT
📖 第 1 页 / 共 2 页
字号:
数字示波器// Header: 数字示波器
// File Name:lcdII.c 
// Author: H.C.H
// Date:2007/8/15
//说明:基本成功


#include <SST89x5x4.H>
#include <math.h>
#include<ziku.h>
#define uint  unsigned int
#define uchar unsigned char
#define Disp_On    0x3f
#define Disp_Off   0x3e
#define Col_Add        0x40    //列地址
#define Page_Add 0xb8          //行地址
#define Start_Line 0xc0

//********************LCD128*64口定义**********************
#define pi 3.14159
#define Lcd_Bus     P1 
#define LCD_CON     P0 
sbit s0=P2^0;
sbit s1=P2^1;
sbit s2=P2^2;
sbit s3=P2^3;


sbit adclk=P2^5;
sbit adcs=P2^7;
sbit addata=P2^6;

unsigned char bdata adc;
sbit  adclow=adc^0;
sbit CS2=LCD_CON^3;             //  CS2
sbit CS1=LCD_CON^4;             //  CS1

sbit DI=LCD_CON^0;              //液晶数据指
sbit RW=LCD_CON^1;              //液晶读写
sbit E =LCD_CON^2;              //液晶使能
uchar state=0;
sbit beep=P2^4;
 
uchar max,min;
uchar d[3];
uchar dd[4];

struct complex 
{
    float real;
 float image;
};
struct complex xdata s[64];

uint data T2NOW=0,time2_count=65535;
unsigned long data fi_int=0,fs=0,fs_const=0; 
uchar data ii=0,T0_counter=0,Time_NO=2,T1_counter=0;
bit over=0;
struct complex mul(struct complex,struct complex);    /*定义复数乘*/
void FFT(struct complex *s);
//******************************子函数*********************
void delay1(uint);                 //延时程序
void write_cmd1(uchar);            //写命令操作字
void write_data1(uchar);           //写数据
void cls();                        //清屏程序
void init();                       //初始化程序
uchar read_data();                 //读数据
void line_h(uchar x,uchar y,uchar l);
void line_v(uchar x,uchar y,uchar l);
void screen1(void);
unsigned char key();
//************************延时子程序***********************


struct complex mul(struct complex x,struct complex y)
{
    struct complex z;
    z.real=x.real*y.real-x.image*y.image;
    z.image=x.real*y.image+x.image*y.real;
    return (z);
}

void FFT(struct complex *s)
{
    unsigned char idata nv2,nm1,k,level,i,j=0;
 unsigned char  idata ip,le,lei;
    struct complex idata v,w,t;
 float max;  
    nv2=64>>1;
    nm1=64-1;
    for(i=0;i<nm1;i++) 
 {
        if(i<j)
  {
      t=s[j];
      s[j]=s[i];
      s[i]=t;
  }
        k=nv2;
        while(k<=j)
  {
      j-=k;
      k=k>>1;
  }
        j+=k;
    }

    le=1;   
    for(level=1;level<=6;level++)
    {   
     lei=le;
        le<<=1;
        v.real=1.0;
  v.image=0.0;       
        w.real=cos(pi/lei);
  w.image=-sin(pi/lei);
        for(j=0;j<lei;j++)
        {
         for(i=j;i<64;i+=le)
            {
          ip=i+lei;
                   t=mul(s[ip],v);
                   s[ip].real=s[i].real-t.real;
                   s[ip].image=s[i].image-t.image;
                   s[i].real+=t.real;
                   s[i].image+=t.image;
           }
           v=mul(v,w);
       }
    }

 for(i=0;i<32;i++)
 s[i].real=sqrt(s[i].real*s[i].real+s[i].image*s[i].image); //幅值
 max=s[0].real;
 for(i=1;i<32;i++)if(max<s[i].real)max=s[i].real;
 for(i=0;i<32;i++)s[i].real=s[i].real*50/max;

}

unsigned char adconvert()  //ad设置
{   unsigned char i;
    adcs=1;
    adcs=0;
    adclk=0;
    for(i=0;i<8;i++)
    {   adclk=1; 
        adclow=addata;
        adclk=0;
        if(i<7) adc=adc<<1;
    }
    adclk=0;
    adcs=1;
    return(adc);
}

void delay1(uint t)             
{
        uint i,j;
        for(i=0;i<t;i++)
                for(j=0;j<10;j++);
}

//********************写命令到LCD**************************


void write_cmd1(uchar cmd)  
{

        DI=0; RW=0;
        Lcd_Bus=cmd;
        E=1;
        E=0;
  delay1(1);

}

void display_h(uchar page,uchar col,uchar code *english,uchar n)
{
  uchar j,i;
  if(col<64)
  {
          CS2=1;CS1=0;
   }
  else
  {
          CS2=0;CS1=1;
    col=col-64;
  }
  for(j=0;j<2;j++)
  {
       write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
       for(i=0;i<12;i++)
               write_data1(english[n*24+12*j+i]);
  }
}

void display_e(uchar page,uchar col,uchar code *english,uchar n)
{
  uchar j,i;
  if(col<64)
  {
          CS2=1;CS1=0;
   }
  else
  {
          CS2=0;CS1=1;
    col=col-64;
  }
  for(j=0;j<2;j++)
  {
       write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
       for(i=0;i<7;i++)
               write_data1(english[n*14+7*j+i]);
  }
}
//************************写数据到LCD**********************


void point(uchar x,uchar y)
{
  uchar y1,y2,pp;
  uchar datain;
  pp=1;
  y1=y>>3;
  y2=y%8;
  pp=pp<<y2;
  if (x<64)
  {
    CS2=1;
 CS1=0;
 write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);  
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    delay1(10);
    datain=read_data();

    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    datain=datain|pp;
    write_data1(datain);
  }
  else
  {

    CS2=0;
 CS1=1;
 write_cmd1(Page_Add+y1);
 write_cmd1(Col_Add+x-64);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    delay1(10);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    datain=datain|pp;
    write_data1(datain);
  }
  

  
}


vp_p(uchar *s)
{
    uchar i;
 unsigned long vp=0;
 max=s[0],min=s[0];
 for(i=1;i<120;i++)
 {
    if (max<s[i])max=s[i];
    if(min>s[i])min=s[i]; 
 }
 vp=max-min;
 vp=vp*500;
 vp=vp/255;

 d[2]=vp/100;
 d[1]=(vp-d[2]*100)/10+1;
 d[0]=vp%10;
    
}
void pointb(uchar x,uchar y)
{
  uchar y1,y2,pp;
  uchar datain;
  
  pp=1;
  y1=y>>3;
  y2=y%8;

  pp=~(pp<<y2);
  
  if (x<64)
  {
    CS2=1;
 CS1=0;
 write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);  
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    delay1(10);
    datain=read_data();

    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    datain=datain&pp;
    write_data1(datain);
  }
  else
  {

    CS2=0;
 CS1=1;
 write_cmd1(Page_Add+y1);
 write_cmd1(Col_Add+x-64);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    delay1(10);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    datain=datain&pp;
    write_data1(datain);
  }
   
}
//5*7
display_num(uchar x,uchar y,uchar *num,uchar n)
{
    uchar i,j,temp;
 for(j=0;j<5;j++)
 { temp=num[5*n+j];
     for(i=0;i<8;i++)
     {

      if(temp&1)point(x+j,y+i);
   else pointb(x+j,y+i);
   temp=temp>>1;
  }
  }
}

     
display8_16(uchar x,uchar y,uchar *num,uchar n)
{
    uchar i,j,temp;
 for(j=0;j<16;j++)
 { temp=num[16*n+j];
     if(j<8)
     { 
      temp=temp>>4;
      for(i=0;i<4;i++)
         {
       
          if(temp&1)point(x+j,y+i);
       else pointb(x+j,y+i);
       temp=temp>>1;
      }
  }
  else
  {   
      for(i=0;i<4;i++)
         {
       //temp=temp>>4;
             if(temp&1)point(x+j-8,y+i+4);
          else pointb(x+j-8,y+i+4);
           temp=temp>>1;
       }
   }
    
  }
}
     
   



void write_data1(uchar dout)  
{

        DI=1; RW=0;
        Lcd_Bus=dout;
        E=1;
        E=0;
     delay1(1);
}




//***************************读LCD数据*********************
 
uchar read_data()  
{
  uchar din;
  Lcd_Bus=0xff;
  DI=1; RW=1;
  E=0;
  E=0;
  E=1;
  E=1;
  E=1;
  din=Lcd_Bus;
  return din;        
}



//****************************清除内存*********************

void cls()  
{
        uchar j,k;
        CS2=1;CS1=0;
        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);

⌨️ 快捷键说明

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