📄 mainc.c
字号:
for(i=0;i<250;i++) { Delay(120);}
Write_7281(0x13 | 0x80 );
key_value = Read_7281();
/////////////////////////////////////////////
if(key_value==0x03){
s=1;
n=1;
p=0;
q=0;
m=0;
r=0;
ff=4;
dd=0;
screen(); ///初始液晶显示
}
/////////////////////////////////////////////////
else if (key_value==0x02) ff=1; //////20HZ档位设定
/////////////////////////////////////////////////
else if (key_value==0x0b) {ff=1;dd=1;}/////////////失真度显示设置
/////////////////////////////////////////////////
else if(key_value==0x0c) { //运行键
n=1;
while(n){
if(ff==4){Number=256;index_Number=8;}
else {Number=1024;index_Number=10;}
AMX0SL =P2&0x07;
for(i=0;i< Number;i++){
AD0INT = 0; //AD中断标志清0
AD0BUSY = 1; //启动AD
while(AD0INT ==0); //等待转换完毕
adresult[i] = ADC0H * 0X100 + ADC0L;
for(j=0;j<12;j++) ;
}
for(i=0;i<Number;i++)
{
ram_v_I[i]=0.0;
ram_v_m[i]=adresult[i];
}
/////////根据P口判断放大倍数
PP=0;
if(P2==1) KK=10;
else if (P2==0) KK=5;
else if (P2==2) KK=1;
else if (P2==6) KK=0.2;
//////////////////////////
sum_temp=0;
for(i=0;i<Number;i++)
fr_v[i]=2.48*adresult[i]/4096/KK;//数字量转换成模拟量
for(i=0;i<Number;i++)
sum_temp=sum_temp+fr_v[i]/Number; //求平均
for(i=0;i<Number;i++)
fr_v[i]=fr_v[i]-sum_temp;//降低直流电流
for(i=0;i<Number;i++)
PP=PP+pow(fr_v[i],2)/50.0/Number*1000*1.2;
///////////////////////////
sum_temp=0;
for(i=0;i<Number;i++)
sum_temp=sum_temp+ram_v_m[i]/Number; //求平均
for(i=0;i<Number;i++)
ram_v_m[i]=ram_v_m[i]-sum_temp;//降低直流电流
sum_temp=0;
for(i=0;i<Number;i++)
sum_temp=MAXIMUM(sum_temp,abs(ram_v_m[i]));//求最大值
for(i=0;i<Number;i++)
ram_v_m[i]=ram_v_m[i]/sum_temp; //数据归一化
//////////开始FFT变换//////////////////
kkfft(ram_v_m,ram_v_I,Number,index_Number,fr_v,fi_v,0,1);
for (i=0; i<=Number-1; i++)
ram_v_m[i]=pow(fr_v[i],2)+pow(fi_v[i],2); //功率谱
////////////FFT变换后开始找频点////////////
hh=0;
for(i=0;i<20;i++) {data_MaxPow[i]=0;data_Maxf[i]=0;index_Maxf[i]=0;}//清零
for(i=0;i<Number/2;i++)
{
if(ram_v_m[i+1]>ram_v_m[i]&&ram_v_m[i+1]>ram_v_m[i+2])//
{
if(ff==1)//1204点 20H档位
{
if(ram_v_m[i+1]>3000)
{
data_MaxPow[hh]=ram_v_m[i+1];//存储频点功率值
index_Maxf[hh]=i+1; //存储频点索引值
data_Maxf[hh]=(float)(i+1)*20.07/Number*1000;//存储频点值
hh=hh+1;
}
}else if(ff==4)//256点 20H档位
{
if(ram_v_m[i+1]>200)
{
data_MaxPow[hh]=ram_v_m[i+1];//存储频点功率值
index_Maxf[hh]=i+1; //存储频点索引值
data_Maxf[hh]=(float)(i+1)*20.07/Number*1000;//存储频点值
hh=hh+1;
}
}
}
}
/////////根据各频点求各频点功率分量///////////////
sum_temp=0;
for(i=0;i<20;i++) P_Sub[i]=0;//清零
for(i=0;i<hh;i++)
sum_temp=sum_temp+ram_v_m[index_Maxf[i]];//各频点功率总和
for(i=0;i<hh;i++)
P_Sub[i]=PP*ram_v_m[index_Maxf[i]]/sum_temp*0.97;//各频点功率分量
sum_temp=0;
///////根据频点求失真度:只针对单点正弦信号/////////
if(dd==1)//按下失真度键处理
{
P_Sum=0;
sum_temp=0;
MM=0;
NN=0;
for(i=0;i<hh;i++)
MM=MAXIMUM(MM,data_MaxPow[i]);
for(i=0;i<hh;i++)
if(data_MaxPow[i]==MM)
NN=i;
for(i=0;i<Number/2;i++)
P_Sum=P_Sum+ram_v_m[i];//求整个频谱上所有功率
for(i=0;i<10;i++)
sum_temp= sum_temp+ram_v_m[index_Maxf[NN]+i];
for(i=0;i<10;i++)
sum_temp= sum_temp+ram_v_m[index_Maxf[NN]-i-1];//求单个频点周围功率
n_Szd=(P_Sum-sum_temp)/P_Sum;//计算失真度
n_Szd=sqrt(n_Szd)*100;
}
/////////求频谱分量功率////////////////////
sum_temp=0;
for(i=0;i<Number/2;i++)
sum_temp=sum_temp+ram_v_m[i];//得到频谱功率总和
for(i=0;i<Number/2;i++)
ram_v_I[i]=PP/sum_temp*ram_v_m[i];
/////////频谱处理:归一化,供LCD显示频谱////////////////////
sum_temp=0;
for(i=0;i<Number/2;i++)
sum_temp=MAXIMUM(sum_temp,ram_v_m[i]);
for(i=0;i<Number/2;i++)
ram_v_m[i]=ram_v_m[i]/sum_temp*64;
////////////////////////////////////////////////////////////
for(i=0;i<hh;i++)
{
sum_temp=0;
for(k=0;k<hh;k++)
if(sum_temp<P_Sub[k])
{
abc=k;
sum_temp=P_Sub[k];
}
abcd[i]= data_Maxf[abc];
aaa[i]=sum_temp;
P_Sub[abc]=0;
}
for(i=0;i<hh;i++)
{
P_Sub[i]=aaa[i];
data_Maxf[i]=abcd[i];
}
//2. 调用数据处理和显示部分 如:
//但如果运行完的时间小于5MS则加延时使其达5MS
for(v=0;v<3;v++)
for(k=0;k<5;k++){
lcd_disp_text(3+k,4+v,0);
}
for(v=0;v<3;v++)
for(k=0;k<3;k++){
lcd_disp_text(11+k,4+v,0);
}
dealdata(PP,1,3); //LCD显示总功率
dealdata(data_Maxf[0],2,2); //LCD显示频点
dealdata(data_Maxf[1],3,2); //LCD显示频点
dealdata(P_Sub[0],2,3); //LCD显示频点1功率分量
dealdata(P_Sub[1],3,3); //LCD显示频点2功率分量
if(dd==1){
lcd_disp1616(0,32,8); lcd_disp1616(2,32,9); lcd_disp1616(4,32,10);
lcd_disp1608(6,32,9); dealdata(n_Szd,5,3);
} //LCD显示失真度
if(key_flag == 1) n=0;
}
}
////////////////////////////////////////////////////////////////////
else if(key_value==0x0f) n=0; //暂停
///////////////////////////////////////////////////////////////////
else if(key_value==0x00){ //显示频谱
lcd_initial(); //液晶初始化
lcd_clear_ram();
for(i=0;i<128;i++)
for(j=0;j<=ram_v_m[i];j++){
showdot(i,j);
}
}
////////////////////////////////////////////////////////////////////
else if(key_value==0x01){ //左移
p++;
if(p<=24){
lcd_initial(); //液晶初始化
lcd_clear_ram();
for(i=0;i<128;i++)
for(j=0;j<=ram_v_m[i+p*16];j++){
showdot(i,j);
}
m=128+p*16;
}
}
////////////////////////////////////////////////////////
else if(key_value==0x02){ //右移
r++;
if(p>=0){
lcd_initial(); //液晶初始化
lcd_clear_ram();
for(i=0;i<128;i++)
for(j=0;j<=ram_v_m[m-r*16];j++){
showdot(i,j);
}
}
}
//////////////////////////////////////////////////////////
else if(key_value==0x0e){ //回放显示
lcd_initial(); //液晶初始化
lcd_clear_ram();
for(i=0;i<4;i++){
lcd_disp_string(0,i*2,"f :",5);dealdata(data_Maxf[i],i*2,0);
lcd_disp_text(1,i*2,i+0x10);
lcd_disp_string(0,i*2+1,"p :",5);dealdata(P_Sub[i],i*2+1,1);
lcd_disp_text(1,i*2+1,i+0x10);
}
q=0;
}
/////////////////////////////////////////////////////////
else if(key_value==0x0d){ //下一屏
q++;
if(q<5){
lcd_initial(); //液晶初始化
lcd_clear_ram();
for(i=0;i<4;i++){
lcd_disp_string(0,i*2,"f :",5);dealdata(data_Maxf[i+q*4],i*2,0);
if(i+q*4<10) lcd_disp_text(1,i*2,i+q*4+0x10);
else if(i+q*4<20 && i+q*4>=10) {
lcd_disp_text(1,i*2,(i+q*4)/10+0x10);
lcd_disp_text(2,i*2,(i+q*4)%10+0x10);
}
lcd_disp_string(0,i*2+1,"p :",5);dealdata(P_Sub[i+q*4],i*2+1,1);
if(i+q*4<10) lcd_disp_text(1,i*2+1,i+q*4+0x10);
else if(i+q*4<20 && i+q*4>=10) {
lcd_disp_text(1,i*2+1,(i+q*4)/10+0x10);
lcd_disp_text(2,i*2+1,(i+q*4)%10+0x10);
}
}
}
else if(q>=5){
lcd_initial(); //液晶初始化
lcd_clear_ram();
lcd_disp1616(2,32,5);
lcd_disp1616(4,32,6);///显示已完毕
lcd_disp1616(6,32,7);
}
}
//////////////////////////////////////
else if(key_value==0x07) { //判断周期性
if(ff==1){Number=256;index_Number=8;}
else {Number=1024;index_Number=10;}
AMX0SL =P2&0x07;
for(i=0;i< Number;i++){
AD0INT = 0; //AD中断标志清0
AD0BUSY = 1; //启动AD
while(AD0INT ==0); //等待转换完毕
adresult[i] = ADC0H * 0X100 + ADC0L;
for(j=0;j<12;j++) ;
}
for(i=0;i<Number;i++)
ram_v_m[i]=adresult[i];
sum_temp=0;
for(i=0;i<Number;i++)
sum_temp=sum_temp+ram_v_m[i]/Number; //求平均
for(i=0;i<Number;i++)
ram_v_m[i]=ram_v_m[i]-sum_temp;//降低直流电流
sum_temp=0;
for(i=0;i<Number;i++)
sum_temp=MAXIMUM(sum_temp,abs(ram_v_m[i]));//求最大值
for(i=0;i<Number;i++)
ram_v_m[i]=ram_v_m[i]/sum_temp; //数据归一化
//////////周期性判断//////////////////
Time=zqpd(ram_v_m);
lcd_initial(); //液晶初始化
lcd_clear_ram();
if(Time==0){
lcd_disp1616(0,0,13);lcd_disp1616(2,0,11);lcd_disp1616(4,0,12);
}
else if(Time!=0){
lcd_disp1616(0,0,11);lcd_disp1616(2,0,12);//显示周期Time数值
lcd_disp_string(5,0,":",1);
dealdata(Time,2,1);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -