📄 简易频谱分析.c
字号:
for(i=0;i<256;i++)
{
dispbuf2[i]=dispbuf1[i];
dispbuf1[i]=0;
}
else
for(i=0;i<256;i++)
{
dispbuf1[i]=dispbuf2[i];
dispbuf2[i]=0;
}
}
//读取fstart到fend,步进为step的数据,如果type=1;写入dispbuf1
uint readdate(uint fstart,uint fend,uint estep,uint type)
{
uint i,j;
uint max;
uint maxbuf1;
uint maxbuf2=0;
uint dstep;
if(aotostep)
{
estep=(2*fd/255);
dstep=1;
}
else
{
dstep=2*fd;
dstep/=step;
}
writestatus(1);//启动
for(i=fstart,j=0;i<fend;i+=estep,j+=dstep)
{
sendfreq(i);
while(readstatus())
clrWatchDog();
maxbuf1=readonedate(j);
if(maxbuf2<maxbuf1)
{
maxbuf2=maxbuf1;
max=j;
}
if(type)
dispbuf1[j]=maxbuf1;
}
return max;
}
void sendfreq(uint date)//写入频率控制字
{
float buf=(float)(date*60e6);
date=(uint)buf/2e27;
PA=date;
writedate();
}
uint readstatus()//读FPGA状态
{
if(readonedate(0x100))
return 1;
else
return 0;
}
void writestatus(uint date)//写FPGA状态
{
PA=0x101;//复位启动
alechontrol();
PA=date;
writedate();
}
void initIO()//初始化端口
{
ioawrite();
iobinit();
}
void ioawrite()//A设置为输出
{
PADIR=0xffff;
PAATB=0xffff;
PA=0xffff;
}
void ioaread()//A设置为输入
{
PADIR=0x0000;
PAATB=0x0000;
PA=0xffff;
}
void iobinit()
{
PBDIR=0xdf0f;//接键盘和控制端口
PBATB=0xdf0f;
PB=0xffff;
}
uint readonedate(uint addr)//从FPGA读入一个数据
{
uint buf;
PA=addr;
alechontrol();
ioaread();
readedate();
buf=PA;
ioawrite();
return (buf&0xff);
}
void displaycrt()//示波器显示
{
uint i;
for(i=0;i<256;i++)
{
PA=i;
writexchannel();
if(bdallow)
PA=dispbuf1[i];
else
PA=(dispbuf1[i]*255/bufmax);
writeychannel();
}
}
void delayxms(uint x)
{
uint y;
while(x--)
{
y=0xff;
while(y--)
clrWatchDog();
}
}
void initdispdate()
{
dispnumber(addr[0],0,fobuf[0]);
dispnumber(addr[1],0,fobuf[1]);
dispnumber(addr[2],0,fobuf[2]);
dispnumber(addr[3],0,fobuf[3]);
dispnumber(addr[4],0,fobuf[4]);
dispnumber(addr[0],1,fdbuf[0]);
dispnumber(addr[1],1,fdbuf[1]);
dispnumber(addr[2],1,fdbuf[2]);
dispnumber(addr[3],1,fdbuf[3]);
dispnumber(addr[4],1,fdbuf[4]);
dispnumber(addr[0],2,fsbuf[0]);
dispnumber(addr[1],2,fsbuf[1]);
dispnumber(addr[2],2,fsbuf[2]);
dispnumber(addr[3],2,fsbuf[3]);
dispnumber(addr[4],2,fsbuf[4]);
dispwavetype(hzaddr,0,wavetype);
}
void key()
{
uint i=0;
uint j;
uint buf;
uint tmp;
i=0;
clrline1;
readkey;
if(j!=nokey)
{
delayxms(40);
buf=j&0xf000;
tmp=j;
while(j!=nokey)
{
PB|=nokey;
readkey;
clrWatchDog();
if(tmp!=j)
break;
}
if(j==nokey)
keybuf=getkey(buf,i);
else
keybuf=0xff;
}
else
{//4
i++;
setline1;
clrline2;
readkey;
if(j!=nokey)
{
delayxms(40);
buf=j&0xf000;
tmp=j;
while(j!=nokey)
{
PB|=nokey;
readkey;
clrWatchDog();
if(tmp!=j)
break;
}
if(j==nokey)
keybuf=getkey(buf,i);
else
keybuf=0xff;
}
else
{//3
i++;
setline2;
clrline3;
readkey;
if(j!=nokey)
{
delayxms(40);
buf=j&0xf000;
tmp=j;
while(j!=nokey)
{
PB|=nokey;
readkey;
clrWatchDog();
if(tmp!=j)
break;
}
if(j==nokey)
keybuf=getkey(buf,i);
else
keybuf=0xff;
}
else
{//2
i++;
setline3;
clrline4;
readkey;
if(j!=nokey)
{
delayxms(40);
buf=j&0xf000;
tmp=j;
while(j!=nokey)
{
PB|=nokey;
readkey;
clrWatchDog();
if(tmp!=j)
break;
}
if(j==nokey)
keybuf=getkey(buf,i);
else
keybuf=0xff;
}
}//2
}//3
}//4
}//5
uint getkey(uint j,uint i)
{
uint k;
switch(j)
{
case 0xe000:k=i*4+0;break;
case 0xd000:k=i*4+1;break;
case 0xb000:k=i*4+2;break;
case 0x7000:k=i*4+3;break;
default:k=0xff;
}
return k;
}
void displaymenu()
{
write_word(0x00,0x00,0xd6d0);//中心频率:
write_word(0x01,0x00,0xd0c4);
write_word(0x02,0x00,0xc6b5);
write_word(0x03,0x00,0xc2ca);
dispnumber(0x08,0x00,0x000a);
write_word(0x00,0x01,0xc9a8);//扫频带宽:
write_word(0x01,0x01,0xc6b5);
write_word(0x02,0x01,0xb4f8);
write_word(0x01,0x01,0xbfed);
dispnumber(0x08,0x00,0x000a);
write_word(0x00,0x02,0xb2bd);//步进频率
write_word(0x01,0x02,0xbdf8);
write_word(0x02,0x02,0xc6b5);
write_word(0x03,0x02,0xc2ca);
dispnumber(0x08,0x00,0x000a);
write_word(0x00,0x03,0xcab5);//实际频率
write_word(0x01,0x03,0xbcca);
write_word(0x02,0x03,0xc6b5);
write_word(0x03,0x03,0xc2ca);
dispnumber(0x08,0x00,0x000a);
}
void datecheck()
{
uint i;
uint dispmax=0;
uint count;
uint mstep=(2*fd/255);
for(i=0;i<256;i++)
{
if(dispbuf1[i]<50)
dispbuf1[i]=0;
}
for(i=0;i<256;i++)
{
if(dispmax<dispbuf1[i])
dispmax=i;
}
if((i==0)&(dispbuf1[i]==0))
{
wavetype=NONE;
dispnumber(addr[0],3,0);
dispnumber(addr[1],3,0);
dispnumber(addr[2],3,0);
dispnumber(addr[3],3,0);
dispnumber(addr[4],3,0);
goto end;
}
else if(aotostep)
fr=fo+i*mstep;
else if(aotostep==0)
fr=fo+i*step;
frbuf[0]=fr/10000;
fr%=10000;
frbuf[1]=fr/1000;
fr%=1000;
frbuf[2]=fr/100;
fr%=100;
frbuf[3]=fr/10;
frbuf[4]=fr%10;
dispnumber(addr[0],3,frbuf[0]);
dispnumber(addr[1],3,frbuf[1]);
dispnumber(addr[2],3,frbuf[2]);
dispnumber(addr[3],3,frbuf[3]);
dispnumber(addr[4],3,frbuf[4]);
count=0;
for(i=0;i<256;i++)
{
if(dispbuf1[i]>100)
{
count++;
while(dispbuf1[i]>100)
i++;
}
}
if(count==0)
wavetype=NONE;
else if(count==1)
wavetype=AM;
else if(count==3)
wavetype=TM;
else if((count>=5)&((count%2)!=0))
wavetype=FM;
else
wavetype=OM;
end:
dispwavetype(hzaddr,0,wavetype);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -