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

📄 angle_measure.c

📁 此程序是基于c8051f020单片机的c语言程序
💻 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 + -