📄 说明.txt
字号:
系统通过算法产生不同的波形,如方波、正弦波、正弦叠加波等,或者通过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 + -