📄 program.c
字号:
}
/* ************************************************************************
** 函 数 名:void XBFX()
** 功能描述:全周波傅立叶积分计算各次谐波的幅值,并返回结果.
*************************************************************************** */
void XBFX()
{
long D,SHU; //数据.
int n_x,k_x,i,n; //循环参数.
float Ur,Ui,Urn,Uin,UIL[2]; //数据处理中间变量.
for(n=0;n<2;n++) //两路信号.
{
for(n_x=0;n_x<5;n_x++) //计算.
{
Urn=0.0; //实部.
Uin=0.0; //虚部.
for(k_x=0;k_x<32;k_x++) //n_x次谐波.
{
D=DATA[CHAN*2+n][k_x]; //取数据计算.
Urn=Urn+D/409.6*cos((2*n_x+1)*(k_x+1)*0.196);
Uin=Uin+D/409.6*sin((2*n_x+1)*(k_x+1)*0.196);
}
Ur=Urn/16.0; //
Ui=Uin/16.0;
SHU=(long)(760*sqrt(Ur*Ur+Ui*Ui)); //
UI[n][n_x]=SHU; //
UI[n][5]=SHU*SHU+UI[n][5]; //第n_x次谐波幅值.
if(n_x==0)
UIL[n]=atan(Ui/Ur); //相位.
}
UI[n][5]=(long)sqrt(UI[n][5]); //总幅值.
for(i=0;i<5;i++) //
{
SHU=UI[n][i]*1000; //
SHU=SHU/(UI[n][5]); //
UP[n][i]=SHU; //第i次谐波占有率.
}
SHU=1000*(UI[n][5]-UI[n][0]); //
UP[n][5]=SHU/UI[n][5]; //畸变率.
}
L[CHAN]=abs((long)(1000*(UIL[0]-UIL[1])-40)); //功率因数角.
S[CHAN]=(long)(UI[0][5]*UI[1][5]); //S.
P[CHAN]=(long)(S[CHAN]*cos(L[CHAN]/1000.0)); //P.
Q[CHAN]=(long)(S[CHAN]*sin(L[CHAN]/1000.0)); //Q.
}
/* ***********************************************************************
** 函 数 名:void ABCSH()
** 功能描述:显示双通道数据处理结果.
************************************************************************** */
void ABCSH()
{
LCDCLEAN(12,1,50,7); //清除数据显示区.
OUTNUM(UI[0][5],1,54,1); //显示U*值.
OUTNUM(UI[1][5],1,54,2); //显示I*值.
OUTNUM(P[CHAN],2,54,3); //显示P*值.
OUTNUM(Q[CHAN],2,54,4); //显示Q*值.
OUTNUM(S[CHAN],2,54,5); //显示S*值.
OUTNUM(L[CHAN],3,54,6); //显示L*值.
OUTNUM(F,2,54,7); //显示F*值.
}
/* ***********************************************************************
** 函 数 名:void XBSH()
** 功能描述:谐波分析结果显示.
************************************************************************** */
void XBSH()
{
int n,i; //参数.
LCDCLEAN(12,2,126,7); //清除数据显示区.
for(n=0;n<2;n++) //
{
for(i=0;i<6;i++) //
{
OUTNUM(UI[n][i],1,28+n*64,2+i); //显示第i次谐波.
OUTNUM(UP[n][i],3,56+n*64,2+i); //显示第i次谐波占有率.
}
}
}
/* ***********************************************************************
** 函 数 名:void ADALLSH()
** 功能描述:多通道数据处结果显示.
************************************************************************** */
void ADALLSH()
{
OUTNUM(UI[0][5],1,40,(2+CHAN)); //显示U*值.
OUTNUM(UI[1][5],1,40,(5+CHAN)); //显示I*值.
OUTNUM(P[CHAN],2,114,(2+CHAN)); //显示P*值.
OUTNUM(Q[CHAN],2,114,(5+CHAN)); //显示Q*值.
}
/* ***********************************************************************
** 函 数 名:void ADALL()
** 功能描述:多通道采样处理显示.
************************************************************************** */
void ADALL()
{
LCDCLEAN(10,2,50,6); //清除数据显示区.
LCDCLEAN(76,2,50,6); //清除数据显示区.
for(CHAN=0;CHAN<3;CHAN++) //
{
ADWORDS=ADCAN+CHAN*2; //确定控制字.
ADALLSH(); //显示.
ADCHX(); //采样.
XBFX(); //计算.
}
CHAN=0; //还原通道.
ADWORDS=ADCAN; //还原控制字.
}
/* ***********************************************************************
** 函 数 名:void PLJS()
** 功能描述:计算频率.
************************************************************************** */
void PLJS()
{
int i,QH,FF[5]; //参数.
QH=(CCP>9)?0:10; //判断取数位置.
for(i=0;i<5;i++) //
{
FF[i]=FT[i+QH]; //取数.
}
F=(FF[4]>FF[3])?(FF[4]-FF[3]):(FF[4]+65536-FF[3]);
F=(long)(100000000/F); //判断,并计算频率.
}
/* ***********************************************************************
** 函 数 名:void CYTZ()
** 功能描述:零点检测法,采样频率调整.
************************************************************************** */
void CYTZ()
{
int i,n,PL[2]; //参数.
while(1)
{
ADCHX(); //AD采样.
for(i=0,n=0;n<2;i++) //零点判断.
{
if(DATA[CHAN*2][i-1]<=DATA[CHAN*2][i]&&DATA[CHAN*2][i]>=DATA[CHAN*2][i+1])
{
PL[n]=i; //第n个零点.
n++; //
}
}
if((PL[1]-PL[0])==32) //两个零点的间隔=32.
{
break; //退出.
}
if((PL[1]-PL[0])>32) //两个零点的间隔>32.
AD++; //加大采样间隔.
else
AD--; //否则,减小采样间隔.
if(BACK==1) //达不到要求.
{
BACK=0; //标志位清零.
AD=50; //AD还原.
break; //退出.
}
OUTNUM(AD,0,120,0); //显示调整结果.
}
}
/* ***********************************************************************
** 函 数 名:void MUNS()
** 功能描述:按键功能设置.
************************************************************************** */
void MUNS()
{
KEY=KEYIN(); //读按键值.
switch(KEY) //
{
case 0XFE: //
{
ADWORDS=ADCAN; //MAX197控制字.
MAXD=1; //置标志位.
MAXA=BACK=NEXT=SURE=GUID=0; //屏蔽其它标志位.
CHAN=0; //确定通道.
break; //退出.
}
case 0XFD: //
{
ADWORDS=ADCAN+2; //MAX197控制字.
MAXD=1; //置标志位.
MAXA=BACK=NEXT=SURE=GUID=0; //屏蔽其它标志位.
CHAN=1; //确定通道.
break; //退出.
}
case 0XFB: //
{
ADWORDS=ADCAN+4; //MAX197控制字.
MAXD=1; //置标志位.
MAXA=BACK=NEXT=SURE=GUID=0; //屏蔽其它标志位.
CHAN=2; //确定通道.
break; //退出.
}
case 0XF7: //
{
MAXA=1; //置标志位.
MAXD=BACK=NEXT=SURE=GUID=0; //屏蔽其它标志位.
break; //退出.
}
case 0XEF: //
{
BACK=1; //置标志位.
MAXD=MAXA=NEXT=SURE=GUID=0; //屏蔽其它标志位.
break; //退出.
}
case 0XDF: //
{
NEXT=1; //置标志位.
MAXD=MAXA=BACK=SURE=GUID=0; //屏蔽其它标志位.
break; //退出.
}
case 0XBF: //
{
SURE=1; //置标志位.
MAXD=MAXA=BACK=NEXT=GUID=0; //屏蔽其它标志位.
break; //退出.
}
case 0X7F: //
{
GUID=1; //置标志位.
MAXD=MAXA=BACK=NEXT=SURE=0; //屏蔽其它标志位.
break; //退出.
}
}
}
/* ************************************************************************
** 函 数 名:interrupt HI_ISR()
** 功能描述:高优先级中断服务程序.
*************************************************************************** */
void interrupt HI_ISR()
{
if(CCP1IF==1) //
{
CCP1IF=0; //清中断标志.
FT[CCP]=CCPR1L+(CCPR1H<<8); //读计数器当前值.
CCP++; //增量加1.
if(CCP==20) //超出.
CCP=0; //归零.
}
}
/* ***********************************************************************
** 函 数 名:void interrupt low_priority LOW_ISR()
** 功能描述:按键功能设置.
************************************************************************** */
void interrupt low_priority LOW_ISR()
{
if(TMR3IF==1)
{
ATRL=PORTA&0X0F; //保存PORTA当前状态.
BTRL=PORTB&0XF0; //保存PORTB当前状态.
PORTA=PORTA&0XF0; //屏蔽所有地址.
PORTB=PORTB&0X8F; //屏蔽所有控制信号.
TMR3IF=0; //清中断标志.
TMR3L=0X9A; //计数初值.
MUNS(); //读按键,置标志位.
PORTA=(ATRL|0XF0)&PORTA; //还原PORTA状态
PORTB=(BTRL|0X0F)&PORTB; //还原PORTB状态
}
}
/* ***********************************************************************
** 函 数 名:void GUIDE()
** 功能描述:绘制系统操作指导界面.
************************************************************************** */
void GUIDE()
{
int x,y;
LCDCLEAR(1); //清屏.
LCDCLEAR(2); //清屏.
for(y=0;y<3;y++) //界面占LCD屏6页.
{
for(x=0;x<32;x++) //102列,前51列在第一片LCD上显示.
{
LCDOUT(HELP[y][31-x],0X7F-x,y+0XBA,1); //输出数据.
}
for(x=0;x<32;x++) //102列,后51列在第一片LCD上显示.
{
LCDOUT(HELP[y][x+32],x+0x40,y+0XBA,2);
} //输出数据.
}
}
/* ***********************************************************************
** 函 数 名:void MUNM()
** 功能描述:按键功能设置.
************************************************************************** */
void MUNM()
{
LCDCLEAR(1); //清屏.
LCDCLEAR(2); //清屏.
LCDNUM(ABC[0],48,1); //标题.
LCDNUM(ABC[1],56,1); //标题.
LCDNUM(ABC[2],64,1); //标题.
LCDNUM(ABC[3],72,1); //标题.
LCDNUM(NUM[10],28,3); //0.
LCDNUM(ABC[4],36,3); //A相.
LCDNUM(ABC[5],44,3); //
LCDNUM(NUM[11],28,4); //1.
LCDNUM(ABC[6],36,4); //B相.
LCDNUM(ABC[7],44,4); //
LCDNUM(NUM[12],28,5); //2.
LCDNUM(ABC[8],36,5); //C相.
LCDNUM(ABC[9],44,5); //
LCDNUM(NUM[13],28,6); //3.
LCDNUM(ABC[10],36,6); //三相.
LCDNUM(ABC[11],44,6); //
LCDNUM(NUM[14],74,3); //4.
LCDNUM(ABC[12],82,3); //SET.
LCDNUM(ABC[13],90,3); //
LCDNUM(NUM[15],74,4); //5.
LCDNUM(ABC[14],82,4); //HEI.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -