📄 复件 51测频测相c.c
字号:
#include<reg52.h>
#include<stdio.h>
#include<lcd.h>
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
bit flag_P3_0,flag_P3_1,flag_P3_2;
bit flag1s,flag_KHz,flag_countT0;
unsigned long int period0,period1;
unsigned char TIME1S_count,n0=0,n1=0,countn0;
float f,p;
void time0() interrupt 1 using 0
{n0++;countn0++;}
void time1() interrupt 3 using 2
{n1++;}
void time2() interrupt 5 using 3
{ TF2=0;
TIME1S_count++;
if(TIME1S_count==170)
{TR0=0;TIME1S_count=0;flag1s=1;}
}
void main(void)
{
unsigned char i, buff_f[16],buff_p[16];
float tmp_f=0.;
TMOD=0X11;
TH0=0;TL0=0;//T0的初值,用于1s计数与定时
RCAP2H=0xe8;
RCAP2L=0xe7;//T2的定时初值,用于数码管扫描与1s时间的产生
EA=1;ET0=1;ET1=1;ET2=1;//开使能
TR0=1;TR2=1;//开定时器T0,T2
flag_KHz=1;
LCD_Init();
while(1)
{
while(flag_KHz)//flag_P3_0
{
flag_countT0=1;
TMOD=0X15;
if(flag1s==1)
{ flag1s=0;
f=TH0*256+TL0+65536*countn0;
tmp_f=f;
if(f>=1000)
{f=f/1000;flag_KHz=1;sprintf(buff_f,"f=%7.3fKHz ",f);}
else if(f>0)
{flag_KHz=0;sprintf(buff_f,"f=%7.3f Hz ",f);}
else {flag_KHz=1;sprintf(buff_f,"f= 0.000 Hz ",f);}
TR1=0;TH1=0;TL1=0;n1=0; //首先要清0,一切从零开始
if(P3_4==1)
while(P3_4==1);
else
{while(P3_4==0);while(P3_4==1);}
TR1=1;//检测1路信号下调沿,立即开启T1,检测1路与2路相移时间差
if(P3_3==1)
while(P3_3==1);
else
while(P3_3==0);
while(P3_3==1);
TR1=0;//检测到2路的下调沿时,立即关闭T1
period1=(TH1<<8)+TL1+65536*n1;//计算1路与2路相移时间差
p=360000000./(period1*tmp_f);
if(p>360.) p=p-360.;
sprintf(buff_p,"p=%6.2f^ ",p);
LCD_DisplayOneString(0,0,buff_f);
LCD_DisplayOneString(0,1,buff_p);
TIME1S_count=0;countn0=0;n0=0;TH0=0;TL0=0;TR0=1;
}
}
while(!flag_KHz)
{ TR0=0;//首先要保证T0是关掉的
TMOD=0X11;//T0、T1都为定时模式
TH0=0;TL0=0;n0=0;
TH1=0;TL1=0;n1=0; //首先要清0,一切从零开始
if(P3_4==1)
{while(P3_4==1);TR0=1;}
else
{while(P3_4==0);while(P3_4==1);TR0=1;}
while(P3_4==0);
while(P3_4==1);
TR0=0;
TR1=1;//1路信号检测完,立即开启T1,检测1路与2路相移时间差
if(P3_3==1)
while(P3_3==1);
else
{while(P3_3==0);while(P3_3==1);}
TR1=0;//检测到2路的下调沿时,立即关闭T1
period0=(TH0<<8)+TL0+65536*n0;//计算1路全周期
f=(1000000./(period0));
period1=(TH1<<8)+TL1+65536*n1;//计算1路与2路相移时间差
p=period1*360./period0;
if(f<1000) {flag_KHz=0;sprintf(buff_f,"f=%7.3f Hz ",f);}
else if(f<1500) {f=f/1000;flag_KHz=0;sprintf(buff_f,"f=%7.3fKHz ",f);}
else {f=f/1000;flag_KHz=1;sprintf(buff_f,"f=%7.3fKHz ",f);}
if(p>360.) p=p-360.;
sprintf(buff_p,"p=%6.2f^ ",p);
for(i=80;i>2;i--)
{LCD_DisplayOneString(0,0,buff_f);
LCD_DisplayOneString(0,1,buff_p);
}
if(flag_KHz)
{TR0=1;flag1s=0;}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -