📄 mainproject.c
字号:
// frequency();
//aaa:
//电压最大值
i=(int)(Vmax);
ShowHZ168(8,20,i);
j=(int)((Vmax-(float)i)*10);
ShowHZ168(10,20,j);
k=(int)((Vmax-(float)i-(float)j/10)*100);
ShowHZ168(11,20,k);
l=(int)((Vmax-(float)i-(float)j/10-(float)k/100)*1000);
ShowHZ168(12,20,l);
/*
ShowHZ1616(1,37,27); //有
ShowHZ1616(3,37,28); //效
ShowHZ1616(5,37,26); //值
ShowHZ168(7,37,14); //:
ShowHZ168(10,37,15); //.
*/
i=(int)(VITUREu);
ShowHZ168(8,37,i);
j=(int)((VITUREu-(float)i)*10);
ShowHZ168(10,37,j);
k=(int)((VITUREu-(float)i-(float)j/10)*100);
ShowHZ168(11,37,k);
l=(int)((VITUREu-(float)i-(float)j/10-(float)k/100)*1000);
ShowHZ168(12,37,l);
//----------以下为液晶屏右边,显示电流数据-----------
/*
ShowHZ1616(20,1,4); //电
ShowHZ1616(22,1,6); //流
ShowHZ168(24,1,x+3); //1,2,3
ShowHZ1616(16,20,24); //最
ShowHZ1616(18,20,25); //大
ShowHZ1616(20,20,26); //值
ShowHZ168(22,20,14); //:
ShowHZ168(25,20,15); //.
*/
i=(int)(Imax);
ShowHZ168(23,20,i);
j=(int)((Imax-(float)i)*10);
ShowHZ168(25,20,j);
k=(int)((Imax-(float)i-(float)j/10)*100);
ShowHZ168(26,20,k);
l=(int)((Imax-(float)i-(float)j/10-(float)k/100)*1000);
ShowHZ168(27,20,l);
/*
ShowHZ1616(16,37,27); //有
ShowHZ1616(18,37,28); //效
ShowHZ1616(20,37,26); //值
ShowHZ168(22,37,14); //:
ShowHZ168(25,37,15); //.
*/
i=(int)(VITUREi);
ShowHZ168(23,37,i);
j=(int)((VITUREi-(float)i)*10);
ShowHZ168(25,37,j);
k=(int)((VITUREi-(float)i-(float)j/10)*100);
ShowHZ168(26,37,k);
l=(int)((VITUREi-(float)i-(float)j/10-(float)k/100)*1000);
ShowHZ168(27,37,l);
//----------以下为液晶屏下面,显示有功功率、无功功率、功率因数、频率-----------
/*
ShowHZ1616(1,54,27); //有
ShowHZ1616(3,54,31); //功
ShowHZ1616(5,54,31); //功
ShowHZ1616(7,54,8); //率
ShowHZ168(9,54,14); //:
ShowHZ168(12,54,15); //.
*/
// i=(int)(powe/100);
// ShowHZ168(10,54,i);
j=(int)(Ppower);
ShowHZ168(10,54,j);
k=(int)((Ppower-(float)j)*10);
ShowHZ168(12,54,k);
l=(int)((Ppower-(float)j-(float)k/10)*100);
ShowHZ168(13,54,l);
o=(int)((Ppower-(float)j-(float)k/10-(float)l/100)*1000);
ShowHZ168(14,54,o);
/*
ShowHZ1616(16,54,30); //无
ShowHZ1616(18,54,31); //功
ShowHZ1616(20,54,31); //功
ShowHZ1616(22,54,8); //率
ShowHZ168(24,54,14); //:
ShowHZ168(27,54,15); //.
*/
// i=(int)(qpowe/100);
// ShowHZ168(25,54,i);
j=(int)(Qpower);
ShowHZ168(25,54,j);
k=(int)((Qpower-(float)j)*10);
ShowHZ168(27,54,k);
l=(int)((Qpower-(float)j-(float)k/10)*100);
ShowHZ168(28,54,l);
o=(int)((Qpower-(float)j-(float)k/10-(float)l/100)*1000);
ShowHZ168(29,54,o);
/*
ShowHZ1616(1,71,31); //功
ShowHZ1616(3,71,8); //率
ShowHZ1616(5,71,32); //因
ShowHZ1616(7,71,10); //数
ShowHZ168(9,71,14); //:
ShowHZ168(13,71,15); //.
*/
i=(int)Qz;
ShowHZ168(10,71,i);
j=(int)((Qz-(float)i)*10);
ShowHZ168(12,71,j);
k=(int)((Qz-(float)i-(float)j/10)*100);
ShowHZ168(13,71,k);
l=(int)((Qz-(float)i-(float)j/10-(float)k/100)*1000);
ShowHZ168(14,71,l);
/*
ShowHZ1616(16,71,7); //频
ShowHZ1616(18,71,8); //率
ShowHZ168(20,71,14); //:
ShowHZ168(24,71,15); //.
*/
i=(int)(fre/100);
ShowHZ168(21,71,i);
j=(int)((fre-(float)i*100)/10);
ShowHZ168(22,71,j);
k=(int)(fre-(float)i*100-(float)j*10);
ShowHZ168(23,71,k);
l=(int)((fre-(float)i*100-(float)j*10-(float)k)*10);
ShowHZ168(25,71,l);
o=(int)((fre-(float)i*100-(float)j*10-(float)k-(float)l/10)*100);
ShowHZ168(26,71,o);
show(boxing1,clear1);
show(boxing2,clear2);
// delay_ms(250);
// delay_ms(250);
// goto aaa;
}
//-------------以下为液晶屏选择界面------------------
void xuanze(void)
{
ClearScreen();
ShowHZ1616(5,20,4); //电
ShowHZ1616(7,20,5); //压
ShowHZ1616(9,20,4); //电
ShowHZ1616(11,20,6); //流
ShowHZ168(13,20,1); //1
ShowHZ1616(20,20,4); //电
ShowHZ1616(22,20,5); //压
ShowHZ1616(24,20,4); //电
ShowHZ1616(26,20,6); //流
ShowHZ168(28,20,2); //2
ShowHZ1616(5,50,4); //电
ShowHZ1616(7,50,5); //压
ShowHZ1616(9,50,4); //电
ShowHZ1616(11,50,6); //流
ShowHZ168(13,50,3); //3
ShowHZ1616(20,50,7); //频
ShowHZ1616(22,50,33); //谱
ShowHZ1616(24,50,34); //分
ShowHZ1616(26,50,35); //析
}
//----------以下为按键控制---------------
void cursor(void)
{
xuanze();
switch(cursor_reg)
{
case 0:
ReverseShowHZ(5,20,16,16); //电
ReverseShowHZ(7,20,16,16); //压
ReverseShowHZ(9,20,16,16); //电
ReverseShowHZ(11,20,16,16); //流
ReverseShowChar(13,20,16); //1
break;
case 1:
ReverseShowHZ(20,20,16,16); //电
ReverseShowHZ(22,20,16,16); //压
ReverseShowHZ(24,20,16,16); //电
ReverseShowHZ(26,20,16,16); //流
ReverseShowChar(28,20,16); //2
break;
case 2:
ReverseShowHZ(5,50,16,16); //电
ReverseShowHZ(7,50,16,16); //压
ReverseShowHZ(9,50,16,16); //电
ReverseShowHZ(11,50,16,16); //流
ReverseShowChar(13,50,16); //3
break;
case 3:
ReverseShowHZ(20,50,16,16); //频
ReverseShowHZ(22,50,16,16); //谱
ReverseShowHZ(24,50,16,16); //分
ReverseShowHZ(26,50,16,16); //析
break;
default:break;
}
}
void key_left(void)
{
if(cursor_reg==0) cursor_reg=3;
else cursor_reg--;
cursor();
while((PCDATDIR&0xf0)==0x60)
{;}
delay_ms(250);
while((PCDATDIR&0xf0)==0x60)
{;}
delay_ms(10);
}
void key_right(void)
{
if(cursor_reg==3) cursor_reg=0;
else cursor_reg++;
cursor();
while((PCDATDIR&0xf0)==0x50)
{;}
delay_ms(250);
while((PCDATDIR&0xf0)==0x50)
{;}
delay_ms(10);
}
void key_down(void)
{
switch(cursor_reg)
{
case 0x0:
show_voltage(1);
break;
case 0x1:
show_voltage(2);
break;
case 0x2:
show_voltage(3);
break;
case 0x3:
showfft();
break;
default:break;
}
while((PCDATDIR&0xf0)==0x30)
{
delay_ms(250);
if((PCDATDIR&0xf0)==0x30)
delay_ms(10);
}
}
void key_back(void)
{
flag_show =0;
InitLCD();
xuanze();
cursor();
while((PCDATDIR&0xf0)==0x40)
{;}
delay_ms(250);
while((PCDATDIR&0xf0)==0x40)
{;}
delay_ms(10);
}
void key_scane(void)
{ int i;
if((PCDATDIR&0x80) == 0)
{
delay_ms(10);
if((PCDATDIR&0x80) == 0)
{ i= PCDATDIR&0xf0;
switch(i)
{
case 0x60:
key_left();
break;
case 0x50:
key_right();
break;
case 0x30:
key_down();
break;
case 0x40:
key_back();
break;
default:break;
}
}
}
flag_set=0;
}
/* 采样来的数据放在dataR[ ]数组中,运算前dataI[ ]数组初始化为0 */
void FFT(float dddd[256])
{
int x0,x1,x2,x3,x4,x5,x6,x7,i,xx;
int L,j,k,b,p;
double TR,TI,temp; //,dddd[256]
/* for(i=0;i<256;i++)
{
dddd[i]=0.25+cos((float)(2*pi*i/256))+0.25*cos((float)(4*pi*i/256))+2*cos((float)(6*pi*i/256));
w[i]=0;
}
*/
/********** following code invert sequence ************/
for(i=0;i<256;i++)
{
dataR[i]=dddd[i];
}
for(i=0;i<256;i++)
{
x0=x1=x2=x3=x4=x5=x6=x7=0;
x0=i&0x01;
x1=((int)(i/2))&0x01;
x2=((int)(i/4))&0x01;
x3=((int)(i/8))&0x01;
x4=((int)(i/16))&0x01;
x5=((int)(i/32))&0x01;
x6=((int)(i/64))&0x01;
x7=((int)(i/128))&0x01;
xx=x0*128+x1*64+x2*32+x3*16+x4*8+x5*4+x6*2+x7;
// xx=x0*32+x1*16+x2*8+x3*4+x4*2+x5;
dataI[xx]=dataR[i];
}
for(i=0;i<256;i++)
{
dataR[i]=dataI[i];
dataI[i]=0;
}
/************** following code FFT *******************/
for(L=1;L<=8;L++) /* for(1) l=1 to m */
{
b=1;
i=L-1;
while(i>0) /* b= 2^(L-1) */
{
b=b*2;
i--;
}
for(j=0;j<=b-1;j++) /* for (2) j=0 to 2^(l-1)-1 */
{
p=1;
i=8-L;
while(i>0) /* p=pow(2,7-L)*j; */
{
p=p*2;
i--;
}
p=p*j;
for(k=j;k<256;k=k+2*b) /* for (3) k=j to 2^m-1 step 2^l */
{
TR=dataR[k];
TI=dataI[k];
temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];
} /* END for (3) */
} /* END for (2) */
} /* END for (1) */
for(i=0;i<4;i++) /* 只需要32次以下的谐波进行分析 */
{
w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
// w[i]=w[i]/64;
}
// w[0]=w[0]/2;
} /* END FFT */
showfft(void)
{
int j,i;
flag_show=2;
sin_cos();
ClearScreen();
for(i=5;i<=14;i++) //显示横坐标
{
for(j=0;j<8;j++)
{
boxing_show(i,100,j);
}
}
ShowHZ168(5,103,0);
ShowHZ168(7,103,1);
ShowHZ168(9,103,2);
ShowHZ168(11,103,3);
for(i=16;i<=25;i++) //显示横坐标
{
for(j=0;j<8;j++)
{
boxing_show(i,100,j);
}
}
ShowHZ168(16,103,0);
ShowHZ168(18,103,1);
ShowHZ168(20,103,2);
ShowHZ168(22,103,3);
for(i=30;i<=110;i++) //显示纵坐标
{
boxing_show(5,i,7);
}
for(i=30;i<=110;i++) //显示纵坐标
{
boxing_show(16,i,7);
}
show1();
}
show1(void)
{
int a,j,i;
FFT(adcin1);
for(i=0;i<4;i++)
{
a=(int)(w[i]);
if(a!=clear3[i])
{
for(j=0;j<clear3[i];j++)
{
Clear_boxing(5+i*2,100-j,1);
}
}
for(j=0;j<a;j++)
{
boxing_show(5+i*2,100-j,1);
}
clear3[i]=a;
}
FFT(adcin2);
for(i=0;i<4;i++)
{
a=(int)(w[i]);
if(a!=clear4[i])
{
for(j=0;j<clear3[i];j++)
{
Clear_boxing(16+i*2,100-j,1);
}
}
for(j=0;j<a;j++)
{
boxing_show(16+i*2,100-j,1);
}
clear4[i]=a;
}
}
void main(void)
{
int i,j,k,l,o,p,r,z,x;
disable();
initial();
InitLCD();
enable();
inixint2();
xuanze();
cursor();
for(i=0;i<64;i++)
{
clear1[i]=109;
clear2[i]=109;
clear3[i]=0;
}
loop:
inicap4();
/* ShowHZ1616(1,1,7); //频
ShowHZ1616(3,1,8); //率
ShowHZ168(5,1,14); //:
ShowHZ168(10,1,15); //. */
while(1) //等待捕获两个计算器值计算频率
{
if(m==2)
{
CAPCONB &=0X05FFF;
break;
}
}
frequency();
// show_frequency();
iniadc(); //开始采样
while(1) //等待采样结果
{
if(adcount<256)
adc();
else //采样数达到256后停止采样
{
adcount=0;
// T1CON |=0x0040; //T1停止工作
T1CON &=0xFFBF;
// ADCCTRL1 |=0x4000;
break;
}
}
// xuanze();
// cursor();
// inixint2();
// while(1)
// {
if(flag_set==1)
key_scane();
// }
if(flag_show==1) shuju(1);
if(flag_show==2) show1();
goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -