📄 angle_measure.c
字号:
#include<c8051f020.h>
#include"initial.h"
//#define data_port P2
sbit one=P2^0;
sbit two=P2^1;
sbit three=P2^2;
sbit cl=P2^3;
sbit clr=P2^4;
sbit spul=P2^5;
sbit start=P2^6;
sbit end=P2^7;
/*sbit spul=P2^0;
sbit cl=P2^1;
sbit clr=P2^2;
sbit one=P2^3;
sbit two=P2^4;
sbit three=P2^5;
sbit start=P2^6;
sbit end=P2^7;*/
sbit phasecon=P0^4;
sbit fcon=P0^6;
uchar ii,j;
xdata long double impulse_1,impulse_2;
uchar code str11[]="OK!";//3
uchar code str22[]="Phase:"; //6
uchar code str33[]="F && T:1";//5
uchar code str44[]="Imp:2";//5
uchar code str55[]="Pha:3";//5
uchar code str66[]="Welcome!";// 8
uchar code str77[]="Phase Measure";//13
uchar code table[]={'0','1','2','3',
'4','5','6','7',
'8','9','.'};
extern keynum;
uchar five_1,four_1,three_1,two_1,one_1,zero_1,point_1,point_2;
uchar five_2,four_2,three_2,two_2,one_2,zero_2;
uchar five_3,four_3,three_3,two_3,one_3,zero_3;
uchar five_4,four_4,three_4,two_4,one_4,zero_4;
uchar five_5,four_5,three_5,two_5,one_5,zero_5;
xdata long uint bin0,bin1,bin2,bin3,tin0,tin1,tin2,tin3,positive,negative;
xdata long double bin,tin;
xdata long uint Fx,phase,TT;
void angle_measure()
{
Lcdinitial ();
delay(10);
display();
while(1)
{
keynum=KeyEn();
if(keynum==9)
{
display_2();
j++;
frequence();//测频率
}
if(keynum==10)
{
display_2();
j++;
impulse();//测脉宽
}
if(keynum==11)
{
display_2();
j++;
phase_measure();//测相位差
}
if(keynum==8)
{
write_command(0x01);
delay(10);
display();
}
}
}
void measure_bin()
{
three=0;
two=0;
one=0;
bin0=P0;
three=0;
two=0;
one=1;
bin1=P0;
three=0;
two=1;
one=0;
bin2=P0;
three=0;
two=1;
one=1;
bin3=P0;
bin=(bin3<<24)+(bin2<<16)+(bin1<<8)+bin0;
}
void measure_tin()
{
three=1;
two=0;
one=0;
tin0=P0;
three=1;
two=0;
one=1;
tin1=P0;
three=1;
two=1;
one=0;
tin2=P0;
three=1;
two=1;
one=1;
tin3=P0;
tin=(tin3<<24)+(tin2<<16)+(tin1<<8)+tin0;
}
void frequence()
{
// fcon=1;
// phasecon=0;
spul=1;
clr=1;
delay(20);
clr=0;
cl=1;
delay(1000);
cl=0;
while(start);
measure_bin();
if(bin==0)
{
frequence();
}
if(j==1) //第一次测的数据不准,第二次才开始正确
{
j=0;
frequence();
}
measure_tin();
Fx=(50000000*tin)/(bin*0.01);
TT=bin/(50*tin);
five_1=Fx/10000000;
four_1=Fx%10000000/1000000;
three_1=Fx%10000000%1000000/100000;
two_1=Fx%10000000%1000000%100000/10000;
one_1=Fx%10000000%1000000%100000%10000/1000;
zero_1=Fx%10000000%1000000%100000%10000%1000/100;
point_1=Fx%10000000%1000000%100000%10000%1000%100/10;
point_2=Fx%10000000%1000000%100000%10000%1000%100%10;
write_command(0x01);
delay(10);
write_command(0x80);
write_data('F');
write_data(':');
write_data(table[five_1]);
write_data(table[four_1]);
write_data(table[three_1]);
write_data(table[two_1]);
write_data(table[one_1]);
write_data(table[zero_1]);
write_data(table[10]);
write_data(table[point_1]);
write_data(table[point_2]);
write_data('H');
write_data('z');
five_5=TT/100000;
four_5=TT%100000/10000;
three_5=TT%100000%10000/1000;
two_5=TT%100000%10000%1000/100;
one_5=TT%100000%10000%1000%100/10;
zero_5=TT%100000%10000%1000%100%10;
write_command(0xc0);
write_data('T');
write_data(':');
write_data(table[five_5]);
write_data(table[four_5]);
write_data(table[three_5]);
write_data(table[two_5]);
write_data(table[one_5]);
write_data(table[zero_5]);
write_data('u');
write_data('s');
}
void impulse() //测脉宽
{
fcon=0;
phasecon=1;
spul=0;
cl=1;
clr=1;
delay(10);
clr=0;
while(!end);
measure_bin();
impulse_1=bin;
positive=impulse_1/50; //扩大了1000000
if(positive==0)
{
impulse();
}
frequence2();
negative=TT-positive;
five_2=positive/100000;
four_2=positive%100000/10000;
three_2=positive%100000%10000/1000;
two_2=positive%100000%10000%1000/100;
one_2=positive%100000%10000%1000%100/10;
zero_2=positive%100000%10000%1000%100%10;
write_command(0x01);
delay(10);
write_command(0x80);
write_data('P');
write_data(':');
write_data(table[five_2]);
write_data(table[four_2]);
write_data(table[three_2]);
write_data(table[two_2]);
write_data(table[one_2]);
write_data(table[zero_2]);
write_data('u');
write_data('s');
five_3=negative/100000;
four_3=negative%100000/10000;
three_3=negative%100000%10000/1000;
two_3=negative%100000%10000%1000/100;
one_3=negative%100000%10000%1000%100/10;
zero_3=negative%100000%10000%1000%100%10;
write_command(0xC0);
write_data('N');
write_data(':');
write_data(table[five_3]);
write_data(table[four_3]);
write_data(table[three_3]);
write_data(table[two_3]);
write_data(table[one_3]);
write_data(table[zero_3]);
write_data('u');
write_data('s');
}
void phase_measure() //测相位差
{
fcon=0;
phasecon=1;
spul=0;
cl=1;
clr=1;
delay(10);
clr=0;
while(!end);
measure_bin();
impulse_1=bin;
if(bin<=100)//估计,随频率而变
{
phase_measure();
}
frequence2();
positive=impulse_1/50; //扩大了1000000
phase=(positive*360*100)/TT;
four_4=phase/10000;
three_4=phase%10000/1000;
two_4=phase%10000%1000/100;
one_4=phase%10000%1000%100/10;
zero_4=phase%10000%1000%100%10;
write_command(0x01);
delay(10);
write_command(0x80);
for(ii=0;ii<6;ii++)
{
write_data(str22[ii]);
}
write_data(table[four_4]);
write_data(table[three_4]);
write_data(table[two_4]);
write_data('.');
write_data(table[one_4]);
write_data(table[zero_4]);
write_data(0xdf);
}
void frequence2()
{
phasecon=0;
fcon=1;
spul=1;
clr=1;
delay(20);
clr=0;
cl=1;
delay(1000);
cl=0;
while(start);
measure_bin();
if(bin==0)
{
frequence();
}
measure_tin();
TT=bin/(50*tin);
phasecon=1; //保证波形显示
fcon=0;
}
void display()
{
write_command(0x83);
delay(5);
for(ii=0;ii<8;ii++)
{
write_data(str33[ii]);
}
write_command(0xc0);
for(ii=0;ii<5;ii++)
{
write_data(str44[ii]);
}
write_command(0xc8);
for(ii=0;ii<5;ii++)
{
write_data(str55[ii]);
}
}
void display_2()
{
write_command(0x01);
delay(10);
write_command(0x86);
for(ii=0;ii<3;ii++)
{
write_data(str11[ii]);
}
delay(200);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -