⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 51测频测相c.c

📁 等精度测频率、测相位 用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 + -