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

📄 说明.txt

📁 在arm上模拟数字示波器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
       系统通过算法产生不同的波形,如方波、正弦波、正弦叠加波等,或者通过AD 采样波形发生器产生的信号,将上述波形通过快速傅立叶变换,产生不同的频谱图形,再通过打印机将波形打印出来。
       
         在液晶屏上将依次轮回绘出方波、正弦波、锯齿波、三角波,在屏的下部出现文字提示,其中“纵向:200mv”表示纵向一个小格的单位量;“横向:200ms”表示横向一个小格的单位量;“图形:时域”表示当前的图形是时域图形;“键盘:纵向”表示当前键盘的上下操作键的操作对象是纵向单位;可通过按键“F”依次切换到纵向、横向、图形。然后通过上升键和下降键进行相关项的调整。按键“0”可在模拟图形和实时采集的数据图形之间切换。
程序分析:
/*
;************************************************************************************************************
;*				        				北京精仪达盛科技有限公司
;*                                     	     研    发    部
;*
;*                                 	     http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;*
;* 文件名称 : main.c	
;* 文件功能 : 该文件为主程序。
;* 文件作者 : ARM开发小组
;* 创建日期 : 2004/04/20
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/

#include "..\inc\config.h"
//#include "..\inc\system.h"
#include <stdlib.h>
#define clreint   (*(unsigned short *)0x08007ffc)  //address 0x1FFE
#define seteint   (*(unsigned short *)0x08007ffe)  //address 0x1FFF
unsigned short data[2048];
static int flag=0;
extern unsigned char key_number;
extern unsigned int GetAd(void);
void dashedline(U16 x0, U16 y0,U16 x1, U16 y1)     //在液晶屏上绘制虚线
{
  U16 gaps;
  int count,i;
  Set_Color   (0x2626ff);
  if (x0==x1)
  { gaps=y1-y0;
    count=gaps/10;
    for (i=0;i<count;i++)
    { Draw_VLine(x0, y0+1,y0+3);
      //Draw_Point(x0, y0+2);
      y0=y0+10;
    }
   }
  if (y0==y1)
  { gaps=x1-x0;
    count=gaps/10;
    x0+=10;
    for (i=1;i<count+1;i++)
    {
      Draw_HLine(y0, x0-1,x0+1);
      //Draw_Point(x0, y0);
      x0=x0+10;
    }
   }
}  

void coordinate(int x,int y,int z)               //在液晶屏上绘制坐标轴
{  //x,y是坐标的原点,z是刻度的长度
  int i,rate=20;
  Set_Color   (GUI_BLACK);
  Draw_Line (x,y,319,y);
  Draw_Line (312,y-2,320,y);
  Draw_Line (312,y+2,320,y);
  Draw_Line (x,1,x,y);
  Draw_Line (x-2,8,x,0);
  Draw_Line (x+2,8,x,0);
  for (i=1;i<(319-x)/rate;i++)
  Draw_Line (x+rate*i,y,x+rate*i,y-z);
  for (i=0;i<y/rate;i++)
  Draw_Line (x,y-rate*i,x+z,y-rate*i);
}


//*************Init the Interrupt************//
void InitIrq5(void)                              //打开中断5,使键盘可用
{
  if (rEXTINPND & 0x02)
  {
    rEXTINPND = 0x2;
    rI_ISPC |=BIT_EINT4567;
  }
  rINTMSK  = ~(BIT_GLOBAL|BIT_EINT4567);  //开中断;
  pISR_EINT4567 = (int)EINT5_ISR;
    
}


//***************the ISR of the interrupt**********//
void  __irq EINT5_ISR(void)                       //键盘识别、处理函数
{
 char temp;
 U32 pixel1[256];
 U32 pixel2[256];
 static U32 tmp1[256];
 static U32 tmp2[256];
 U32 i;
 
 rINTMSK  |= BIT_EINT4567;
 temp=clreint;           //shut down the interrupt
 
 //Uart_Printf(0,"the data in 1FFE is %x\n",temp);
 
 for(i=0;i<512;i++)
 data[i] = dualram(i);        //read the data

 //for(i=0;i<256;i++)
 //Uart_Printf(0,"the data%d is %x\n",i,data[i]);
  
 for (i=0;i<256;i++)
 pixel1[i]= (U32) data[i];
 for (i=0;i<256;i++)
 pixel2[i]=(U32) data[i+256];
 
if (flag!=0)
 {
   Set_Color  (GUI_BLUE);
   for (i=3;i<159;i++) 
   Draw_Line (2*i,tmp1[i],2*i+2,tmp1[i+1]);
   for (i=3;i<159;i++)
   Draw_Line (2*i,233-tmp2[i],2*i+2,233-tmp2[i+1]);
  }
 //Set_Color(GUI_BLUE);
 //Fill_Rect(0,0,319,239);
 coordinate(5,117,5);
 
 Set_Color  (GUI_YELLOW);
 for (i=3;i<159;i++) 
 Draw_Line (2*i,pixel1[i],2*i+2,pixel1[i+1]);
 for (i=3;i<159;i++)
 Draw_Line (2*i,233-pixel2[i],2*i+2,233-pixel2[i+1]);
 
for (i=0;i<256;i++)
 {
  tmp1[i]= pixel1[i];
  tmp2[i]= pixel2[i];
 }
 
 rEXTINPND = 0x2;               //open the interrupt
 rI_ISPC |=BIT_EINT4567;
 rINTMSK  = ~(BIT_GLOBAL|BIT_EINT4567);
 
 flag++;
 seteint=0x55AA;             //turn to the DSP 
 
}

void WriteAdToBuff(int *buff,int lenth) //将AD转换结果保存
  {
   int i;
   for(i=0;i<lenth;i++)
     {
      buff[i] =150*(1-((float)GetAd()/4096)*150);
      if(buff[i]<0) buff[i] = 0;      
     }
  }

void kfft(int *buff,int k,int l,int il)      //将时域图形转换成频域图形
   {int it,m,is,i,j,nv,l0,n;        //pr:输入的实部,k:log2(N)
    double p,q,s,vr,vi,poddr,poddi;  //fr输出的实部
    double pr[256],pi[256],fr[256],fi[256];
    n=0x1<<k;
    for (i=0; i<n; i++)         //fi:输出的虚部
      {
       *(pr+i) =((double) *(buff+i))/64;
       *(pi+i) = 0;
      }
    for (it=0; it<=n-1; it++)         //fi:输出的虚部
      { m=it; is=0;                //pi:输入的虚部
        for (i=0; i<=k-1; i++)    //n:贞的点数  
          { 
           j=m/2;is=2*is+(m-2*j);m=j;
          }
        fr[it] = pr[is];fi[it] = pi[is];
      }
    pr[0]=1.0;pi[0]=0.0;
    p=6.283185306/(1.0*n);
    pr[1]=cos(p); pi[1]=-sin(p);
    if (l!=0) pi[1]=-pi[1];
    for (i=2; i<=n-1; i++)
      { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
        s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
        pr[i]=p-q; pi[i]=s-p-q;
      }
    for (it=0; it<=n-2; it=it+2)
      { vr=fr[it]; vi=fi[it];
        fr[it]=vr+fr[it+1]; 
        fi[it]=vi+fi[it+1];
        fr[it+1]=vr-fr[it+1]; 
        fi[it+1]=vi-fi[it+1];
      }
    m=n/2; nv=2;
    for (l0=k-2; l0>=0; l0--)
       {m=m/2; nv=2*nv;
        for (it=0; it<=(m-1)*nv; it=it+nv)
         {
          for (j=0; j<=(nv/2)-1; j++)
            { p=pr[m*j]*fr[it+j+nv/2];
              q=pi[m*j]*fi[it+j+nv/2];
              s=pr[m*j]+pi[m*j];
              s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
              poddr=p-q; poddi=s-p-q;
              fr[it+j+nv/2]=fr[it+j]-poddr;
              fi[it+j+nv/2]=fi[it+j]-poddi;
              fr[it+j]=fr[it+j]+poddr;
              fi[it+j]=fi[it+j]+poddi;
            }
         }    
       }
    if (l!=0)
     {
      for (i=0; i<=n-1; i++)
        {
         fr[i]=fr[i]/(1.0*n);
         fi[i]=fi[i]/(1.0*n);
        }
     }   
    if (il!=0)
     { 
      for (i=0; i<=n-1; i++)
        { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
          if (fabs(fr[i])<0.000001*fabs(fi[i]))
            { if ((fi[i]*fr[i])>0) pi[i]=90.0;
              else pi[i]=-90.0;
            }
          else
            pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
        }
    }
   for (i=0;i<n;i++)
  		    {   //mo:输出的幅值,i是此幅值下的频率
     	     buff[i] = 100-(unsigned int)(0.8*sqrt(fr[i]*fr[i]+fi[i]*fi[i]));
	   	    }     
   }  

/**********clearn wave buff**********/
void ClearnWaveBuff(int *wave)           //清除波形缓冲器
   {
    int x;
    for (x=0;x<320;x++)
       wave[x]=0;
   }

/**********generate  sin wave**********/
void Sinwave(int *wave,int a,int num)    //正弦波发生器
   {//create the sin wave
    int x;
    ClearnWaveBuff(wave);
    for (x=0;x<320;x++) 
       wave[x]= (U32) (a*(1-sin(2*3.14159*x*num/320))/2);
   }

/**********generate square wave**********/
void Squarewave(int *wave,int a,int num)    //方波发生器
  { //create the square wave
    int x,i;
    ClearnWaveBuff(wave);
    for (x=0;x<num;x++) 
      {
       for(i=x*320/num;i<(x+1)*320/num;i++)
         {
          if(i<(x*320/num+320/(num*2))) wave[i] = a;
          else wave[i] = 0;
         }
      }
  }
/**********generate triangle wave**********/
void Trianglewave(int *wave,int a,int num)   //三角波发生器
  { //create the triangle wave
    int x,i;
    ClearnWaveBuff(wave);
    for (x=0;x<num;x++) 
      {
       for(i=x*320/num;i<(x+1)*320/num;i++)

⌨️ 快捷键说明

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