📄 mainc.c
字号:
// 包含文件
#define MAINC_GLOBALS
#include "includes.h"
#include "charbank.h"
#include "math.h"
#define MAXIMUM(x,y) (x>y)?x:y
//sbit bb=P0^6;
//外部中断6(键盘用)
void ExtentInt6 (void) interrupt 18 {
_nop_();
P3IF &= 0XBF;//清中断标志
key_flag = 1;
}
//定时器3中断
void Timer3Int(void) interrupt 14 {
TMR3CN &= 0X7F; //清中断标志
Timer3Counter1++;
}
//ADC初始化程序
ADCInit(void){
AMX0CF = 0; //各通道单独输入
AMX0SL = 0; //通道选择
ADC0CF = 0x48; //系统时钟24M,SAR时钟2M,AD0SC=11,PGA=1
ADC0CN = 0x80; //ADC0使能,一直处于跟踪,向AD0BUSY写1启动转换,数据右对齐
REF0CN = 0x07; //ADC0基准取VREF0,内部温度传感器、内部偏压发生器、缓冲器工作
}
///////fft////////////////////
void kkfft(pr,pi,n,k,fr,fi,l,il)
int n,k,l,il;
float pr[],fr[];//修改
float pi[],fi[];
{ int it,m,is,i,j,nv,l0;
float p,q,s,vr,vi,poddr,poddi;
for (it=0; it<=n-1; it++)
{ m=it; is=0;
for (i=0; i<=k-1; i++)
{ 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;
}
return;
}
///////zqxpd////////////////////
float zqpd(si)
float si[];
{
float xdata dataR[512],dataI[512],fr_v[512],fi_v[512],Pyy1[512],Pyy2[512],data_Maxf[50],data_MaxPow[50],index_Maxf[50];
int i,k,Number,index_Number,hh;
float data_sum,data_temp,MM;
float Time=0;
Number=1024;index_Number=10;
for (i=0; i<Number/2; i++)
{
dataR[i] = si[i];
dataI[i] = 0;
}
kkfft(dataR,dataI,Number/2,index_Number-1,fr_v,fi_v,0,1);
for (i=0; i<Number/2; i++)
Pyy1[i]=sqrt(pow(fr_v[i],2)+pow(fi_v[i],2));
/////////////////////////////////////////////
for (i=Number/2; i<Number; i++)
dataR[i-Number/2]= si[i];
for (i=0; i<Number/2; i++)
dataI[i]=0;
kkfft(dataR,dataI,Number/2,index_Number-1,fr_v,fi_v,0,1);
for (i=0; i<Number/4; i++)
Pyy2[i]=sqrt(pow(fr_v[i],2)+pow(fi_v[i],2));
data_sum=0;
for(k=0;k<Number/4;k++)
{
data_temp=pow(Pyy1[k],2)-pow(Pyy2[k],2);
data_temp=pow(data_temp,2);
data_temp=sqrt(data_temp);
data_sum=data_sum+data_temp;
}
if(data_sum>15000)
Time=0; //非周期信号
else
{ //周期信号
hh=0;
for(i=0;i<20;i++) data_Maxf[i]=0;//清零
for(i=0;i<Number/4;i++)
{
if(Pyy1[i+1]>Pyy1[i]&&Pyy1[i+1]>Pyy1[i+2])//
{
if(Pyy1[i+1]>30)
{
data_MaxPow[hh]=Pyy1[i+1];//存储频点功率值
index_Maxf[hh]=i+1; //存储频点索引值
//data_Maxf[hh]=(float)(i+1)*20.07/Number/2*1000;//存储频点值
hh=hh+1;
}
}
}
for(i=0;i<hh;i++)
data_Maxf[i]=(float)index_Maxf[i]*20.07/512*1000;
MM=0;
for(i=0;i<hh;i++)
MM=MAXIMUM(MM,data_MaxPow[i]);
for(i=0;i<hh;i++)
if(data_MaxPow[i]==MM)
Time=1/data_Maxf[i]*1000;
}
return Time;
}
void chuxian(void){
unsigned char i;
Write_7281(0x14);Write_7281(0x70); //hex译码,显示0
lcd_initial(); //液晶初始化
lcd_clear_ram();
lcd_disp3232(0,16,0); //显示欢迎使用
lcd_disp3232(4,16,1);
lcd_disp3232(8,16,2);
lcd_disp3232(12,16,3);
for(i=0;i<5;i++){
Timer3Counter1 = 0;
while(Timer3Counter1 < 200);
}
}
void screen(void){ //主屏显示
lcd_initial(); //液晶初始化
lcd_clear_ram();
lcd_disp1616(0,0,0);lcd_disp1616(2,0,1);lcd_disp1616(4,0,2);lcd_disp1608(6,0,9);//总功率
lcd_disp_string(0,2,"f1:",3); //二个频率分量
lcd_disp_string(8,2,";",1);
lcd_disp_string(0,3,"f2:",3);
lcd_disp_string(8,3,";",1);
lcd_disp1616(0,48,3);lcd_disp1616(2,48,4);lcd_disp1608(4,48,9); //单位:Hz,mW
lcd_disp1608(6,48,11);lcd_disp1608(7,48,6);
lcd_disp_string(8,7,";",1);lcd_disp1608(9,48,8);lcd_disp1608(10,48,7);
}
void dealdata(float qq,unsigned char pp,unsigned char z){//q是数据,p是行数, z是种类区分频率和功率
unsigned char wei[5];
unsigned char woo[8];
unsigned char poo[5];
unsigned char goo[8];
if(z==0){
wei[0]= qq/10000;
wei[1]= (qq-wei[0]*10000)/1000;
wei[2]= (qq-wei[0]*10000-wei[1]*1000)/100;
wei[3]= (qq-wei[0]*10000-wei[1]*1000-wei[2]*100)/10;
wei[4]= (qq-wei[0]*10000-wei[1]*1000-wei[2]*100-wei[3]*10);
if(wei[0]!=0) lcd_disp_text(5,pp,wei[0]+0x10);
if((wei[1]||wei[0])!=0) lcd_disp_text(6,pp,wei[1]+0x10);
if((wei[2]||wei[1]||wei[0])!=0) lcd_disp_text(7,pp,wei[2]+0x10);
if((wei[3]||wei[2]||wei[1]||wei[0])!=0) lcd_disp_text(8,pp,wei[3]+0x10);
lcd_disp_text(9,pp,wei[4]+0x10);
}
else if(z==1){
woo[0]= qq/100;
woo[1]=(qq-woo[0]*100)/10;
woo[2]=qq-woo[0]*100-woo[1]*10;
woo[3]='.';
woo[4]=(qq-woo[0]*100-woo[1]*10-woo[2])*10;
woo[5]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1)*100;
woo[6]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1-woo[5]*0.01)*1000;
woo[7]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1-woo[5]*0.01-woo[6]*0.001)*10000;
if(woo[0]!=0) lcd_disp_text(5,pp,woo[0]+0x10);
if(woo[0]||woo[1]!=0) lcd_disp_text(6,pp,woo[1]+0x10);
lcd_disp_text(7,pp,woo[2]+0x10);
lcd_disp_string(8,pp,".",1);
lcd_disp_text(9,pp,woo[4]+0x10);
lcd_disp_text(10,pp,woo[5]+0x10);
lcd_disp_text(11,pp,woo[6]+0x10);
lcd_disp_text(12,pp,woo[7]+0x10);
}
else if(z==2){
poo[0]= qq/10000;
poo[1]= (qq-poo[0]*10000)/1000;
poo[2]= (qq-poo[0]*10000-poo[1]*1000)/100;
poo[3]= (qq-poo[0]*10000-poo[1]*1000-poo[2]*100)/10;
poo[4]= (qq-poo[0]*10000-poo[1]*1000-poo[2]*100-poo[3]*10);
if(poo[0]!=0) lcd_disp_text(3,pp,poo[0]+0x10);
if((poo[1]||poo[0])!=0) lcd_disp_text(4,pp,poo[1]+0x10);
if((poo[2]||poo[1]||poo[0])!=0) lcd_disp_text(5,pp,poo[2]+0x10);
if((poo[3]||poo[2]||poo[1]||wei[0])!=0) lcd_disp_text(6,pp,poo[3]+0x10);
lcd_disp_text(7,pp,poo[4]+0x10);
}
else if (z==3){
goo[0]= qq/100;
goo[1]=(qq-goo[0]*100)/10;
goo[2]=qq-goo[0]*100-goo[1]*10;
goo[3]='.';
goo[4]=(qq-goo[0]*100-goo[1]*10-goo[2])*10;
goo[5]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1)*100;
goo[6]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1-goo[5]*0.01)*1000;
goo[7]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1-goo[5]*0.01-goo[6]*0.001)*10000;
if(goo[0]!=0) lcd_disp_text(8,pp,goo[0]+0x10);
if(goo[0]||goo[1]!=0) lcd_disp_text(9,pp,goo[1]+0x10);
lcd_disp_text(10,pp,goo[2]+0x10);
lcd_disp_string(11,pp,".",1);
lcd_disp_text(12,pp,goo[4]+0x10);
lcd_disp_text(13,pp,goo[5]+0x10);
lcd_disp_text(14,pp,goo[6]+0x10);
lcd_disp_text(15,pp,goo[7]+0x10);
}
}
/******************** 主函数 ********************/
void main ( void ) {
unsigned char s,n,j,k,v,p,q,m,hh,dd;
unsigned int i,r,Number,index_Number,ff,NN,abc;
unsigned int xdata adresult[1024],index_Maxf[50];
float xdata MM,ram_v_m[1024],ram_v_I[1024],fr_v[1024],fi_v[1024],data_MaxPow[50],data_Maxf[50],P_Sub[50],abcd[50], aaa[50];
float sum_temp,PP,KK,n_Szd,P_Sum,Time;
bit zq_Flag;
SP = 0X80;
WDTCN = 0XDE; //禁止看门狗
WDTCN = 0XAD;
PortInitialization (); // 初始化端口
ExternalClock (); // 起振外部时钟,使它成为系统时钟
ExternIntInit();
ADCInit(); //ADC0初始化
Timer3Init();
EA = 1;
TMR3CN |= 0X04;
BC7281Init();//键盘初始化
chuxian(); ////////// 显示欢迎使用
screen(); ///初始液晶显示
s=1;
n=1;
p=0;
q=0;
m=0;
r=0;
ff=4;
dd=0;
while(1){
if(key_flag == 1){
while(key_flag) key_flag = 0; // 将数据读入,并加延时防抖动
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -