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

📄 jianpjianx.c

📁 等精度测频率、测相位 用c语言编程 简单方便
💻 C
字号:
#include<reg52.h>
#include <absacc.h>
#include <INTRINS.H>

#define DPTR XBYTE[0X6000]
unsigned char DISPBUF1,DISPBUF2,DISPBUF3,DISPBUF4,keynum,BUFTH0,BUFTL0=100,BUFTH1,BUFTL1=100;
unsigned int TIME1S_count;

unsigned long  TMPA;

void mDelay(unsigned int Delay);
void display(void);
unsigned char keyscan(void);
void readkey(unsigned char date);
void BCD_CHANGE(void);
void display1(void);

#include<stdio.h>

sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_7=P3^7;
bit flag1s,flag_countT0;
bit flag_KHz,flag_cexiang,flag_cezhou,flag_openT0,flag_openT1,flag_display1;
unsigned long int period0,period1;
unsigned char n0=0,n1=0,countn0;

void int0() interrupt 0 using 0
{if(!flag_cezhou)//如果flag_cezhou标志被清零了,代表数据已被取走,要重新开TR0
	{if(!flag_openT0)
		{TH0=0;TL0=0;n0=0;TR0=1;flag_openT0=1;P3_7=~P3_7;}//如果第一次中断则开TR0
	else//如果第二次中断
		{flag_openT0=0;
		TR0=0;//则关TR0,
		BUFTH0=TH0;BUFTL0=TL0;//并存储TH0,TL0,
		if(!flag_cexiang)
		{TH1=0;TL1=0;n1=0;TR1=1;EX1=1;flag_openT1=1;}//并同时开TR1,
		flag_cezhou=1; //最后设立flag_cezhou标志
		}
	}
}
void time0() interrupt 1 using 1
{n0++;countn0++;}

void int1() interrupt 2 using 2
{if(flag_openT1)//如果已经开了TR1
	{TR1=0;BUFTH1=TH1;BUFTL1=TL1;flag_cexiang=1;
	flag_openT1=0;
	}
}
void time1() interrupt 3 using 3 
{n1++;}
void time2() interrupt 5 using 3
{
	TF2=0;
	if(flag_countT0)
	{	TIME1S_count++;
		if(TIME1S_count==170)
			{TR0=0;TIME1S_count=0;P3_1=~P3_1;flag1s=1;}
	}	
	display();
}
	 
main()
{  
 	float f=0,p=0;
//	unsigned char tmp0=0;
	TMOD=0X11; 
	TH0=0;
	TL0=0;
	TH1=0;
	TL1=0;

	RCAP2H=0xe8;
	RCAP2L=0xef;//T2的定时初值,用于数码管扫描与1s时间的产生

	EA=1;
	ET0=1;
	ET1=1;
	ET2=1;
	TR2=1;

	IT1=1;
	IT0=1;
	EX0=1;
	EX1=1;

	P3_3=1;
	P3_2=1;
	keynum=1;
	//flag_KHz=1;
 	while(1)
	{	
		while(keynum==1)//((keynum==1)&&flag_KHz)
		{	EX0=0;
			EX1=0;
			TMOD=0X15;
			flag_countT0=1; 
			readkey(keyscan());
			if(flag1s==1)
			{
				flag1s=0;
				f=TH0*256+TL0+65536*countn0;
				if(f>100000)
					{f=f/1000;flag_KHz=1;} 
				else if(f>10000)
					{f=f/100;flag_KHz=1;} 
				else if(f>1000)
					{f=f/10;flag_KHz=1;} 	 
				else {P3_0=1;flag_KHz=0;}
				TMPA=(int)(f*10);
				BCD_CHANGE();
				
				TIME1S_count=0;
				countn0=0;
				n0=0;
				TH0=0;
				TL0=0;
				TR0=1;
				display();
			}
		}
		while((keynum==2)|(keynum==3))
		{	EX0=1;
			EX1=1;
			readkey(keyscan());
			flag_countT0=0;
			TMOD=0X11;

			if(flag_cezhou)
				{period0=(BUFTH0<<8)+BUFTL0+65536*n0;//计算半周期
				//tmp0++;
			//	if(tmp0==5)
					//{
					flag_cezhou=0;
					//tmp0=0;BUFTH0=0;BUFTL0=0;n0=0;
				//	}
				}	  //并清标志
			if(flag_cexiang)
				{period1=(BUFTH1<<8)+BUFTL1+65536*n1;
				flag_cexiang=0;}

			if(keynum==2)
			{	//TMPA=0;
			//	period0=500;
				//if(period0!=0)
				f=(10000000./(period0));//计算频率与实际仿真测试做的校准修正 
				if(f<10000)
					{flag_KHz=0;}
				else if(f<15000)				  
					{f=f/10;flag_KHz=0;}
				else if(f<100000)
					{f=f/10;flag_KHz=1;}
				else if(f<1000000)
					{f=f/100;flag_KHz=1;}
				else
					{f=f/1000;flag_KHz=1;} 
											
				TMPA=(unsigned long)f;
				BCD_CHANGE();
				display();
			}
		/*	else if(keynum==3)
			{	if(period0!=0)
				{
					p=period1*1800./period0;
					//p=2663;
				//	TMPA=(unsigned long)p;
				//	BCD_CHANGE();
					display();
				}
			}
			display();*/
		}
	}	
}
void mDelay(unsigned int Delay)	
{	unsigned int i;
	for(;Delay>0;Delay--)
	{	for(i=0;i<124;i++)
		{;}
	}
}
void BCD_CHANGE(void)
{
	DISPBUF1=TMPA/1000;
	DISPBUF2=TMPA%1000/100;
	DISPBUF3=TMPA%100/10;
	DISPBUF4=TMPA%10;
}
///////////////////////////////////
//数码管显示程序
void display(void)
{
  DPTR=(DISPBUF1|0X70);
  mDelay(1);
  DPTR=(DISPBUF2|0Xb0);
  mDelay(1);
  DPTR=(DISPBUF3|0Xd0);
  mDelay(1);
  DPTR=(DISPBUF4|0Xe0);
  mDelay(1);
  DPTR=0Xf0;
  mDelay(1);
}
void display1(void)
{
  DPTR=(DISPBUF1|0X70);
  DPTR=(DISPBUF2|0Xb0);
  DPTR=(DISPBUF3|0Xd0);
  DPTR=(DISPBUF4|0Xe0);
  DPTR=0Xf0;
}
unsigned char keyscan(void)
{ unsigned char test,tmp;
  P1=0xf0;
  if((P1&0xf0)!=0xf0)
  {	mDelay(1);
    if((P1&0xf0)!=0xf0)
	{ test=0xfe;
	  while((test&0x10)!=0)
	  {	P1=test;
	    if((P1&0xf0)!=0xf0)
		{ tmp=(P1&0xf0)|0x0f;
		  return(~(test)+~(tmp));
		}
	else test=(test<<1)|0x01;
	  }
	}
  }
  return(0);
}
void readkey(unsigned char date)
 { switch(date)
  {	case 0X11: keynum=1;break;
    case 0X21: keynum=2;break;
	case 0X41: keynum=3;break;
	case 0X81: keynum=4;break;
	case 0X12: keynum=5;break;
	case 0X22: keynum=6;break;
	case 0X42: keynum=7;break;
	case 0x82: keynum=8;break;
	case 0x14: keynum=9;break;
	case 0x24: keynum=10;break;
	case 0x44: keynum=11;break;
	case 0x84: keynum=12;break;
	case 0x18: keynum=13;break;
	case 0x28: keynum=14;break;
	case 0x48: keynum=15;break;
	case 0x88: keynum=16;break;
//	case 0x00: keynum=0;break;
  }
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -