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

📄 test_int0.c

📁 等精度测频率、测相位 用c语言编程 简单方便
💻 C
字号:
#include<reg52.h>
#include <absacc.h>
#define DPTR XBYTE[0X6000]

unsigned char DISPBUF1,DISPBUF2,DISPBUF3,DISPBUF4,TIME1S_count,countn0,TIME0_5S_count;
unsigned char bufth0,buftl0,bufn0,n0,BUFTH1,BUFTL1,BUFn1,n1;
unsigned char keynum;
bit	flag_KHz,flag1s,flag_countT0,flag_over0,flag_over1,flag0_5s,flag_open0;

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

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;
 
////////////////////////////
void int00() interrupt 0 using 0
{
//	P3_7=~P3_7;
	TR1=1;
	bufth0=TH0;buftl0=TL0;bufn0=n0;
	TH0=0;TL0=0;n0=0;
	flag_over0=1; 
}

void int11() interrupt 2 using 2
{	TR1=0;
	BUFTH1=TH1;BUFTL1=TL1;BUFn1=n1;
	TH1=0;TL1=0;n1=0;
	flag_over1=1;
}

void time0() interrupt 1 using 1
{n0++;countn0++;}

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;flag1s=1;}
		display();
	}
	else
	{	TIME0_5S_count++;
		if(TIME0_5S_count==80)
		{TIME0_5S_count=0;flag0_5s=1;}
	}
}
 
main()
{	unsigned long TMPA,P0,P1=0;
	float f,p; 

	TMOD=0X19;//T0设置为门控定时方式1,T1为定时方式1
	ET0=1;	
	EX0=1;
	IT0=1;//外部中断为边沿触发
	TR0=1;//开始定时	
	TH0=0;
	TL0=0;

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

	ET1=1;
	EX1=1;
	IT1=1;//外部中断为边沿触发
	TH1=0;
	TL1=0;

	EA=1;

	flag_KHz=0;
	P3_3=1;
	P3_2=1;
	keynum=1;
	while(1)
	{ 
		while((keynum==1)&&flag_KHz)
		{	readkey(keyscan());
			flag_countT0=1;
			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 {flag_KHz=0;}
				
				TMPA=(unsigned long)(f*10);
				DISPBUF1=TMPA/1000;
				DISPBUF2=TMPA%1000/100;
				DISPBUF3=TMPA%100/10;
				DISPBUF4=TMPA%10;
				
				TIME1S_count=0;
				countn0=0;
				TH0=0;
				TL0=0;
				TR0=1;
				display();
			}
			if(!flag_KHz|(keynum>1))
				{EX0=1;TMOD=0X09;}	 
		} 
		while(!flag_KHz)
		{	readkey(keyscan());
			flag_countT0=0;
			if(flag0_5s==1)
			{	
				/*if(!flag_open0)
				{EX0=1;flag_over0=0;EX1=1;flag_over1=0;flag_open0=1;}
				if(flag_over1)
				{EX0=0;EX1=0;flag_open0=0;}	 */
			/*	if(flag_open0&flag_over1)
					{EX0=0;EX1=0;flag_open0=0;}
				else 
					{EX0=1;EX1=1;flag_open0=1;}	 */
				if(flag_over0)
				{ 	P0=bufth0*256+buftl0+65536*bufn0+5;
					if(keynum==1)
					{	display();
						f=5000000./P0;
						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;
						DISPBUF1=TMPA/1000;
						DISPBUF2=TMPA%1000/100;
						DISPBUF3=TMPA%100/10;
						DISPBUF4=TMPA%10;
					}
					flag_over0=0;
					
				}
				else 
					{TH0=0;TL0=0;n0=0;TR0=1;EX0=1;}
				if(keynum>1)
					if(flag_over1)
					{
						flag_over1=0;
						P1=BUFTH1*256+BUFTL1+BUFn1*65536;
						p=P1*1800/P0;
											
						TMPA=(unsigned long)p;
						DISPBUF1=TMPA/1000;
						DISPBUF2=TMPA%1000/100;
						DISPBUF3=TMPA%100/10;
						DISPBUF4=TMPA%10;
					}
				TIME0_5S_count=0;
				flag0_5s=0;
			}
			display();
			if(keynum==1)	
				if(flag_KHz)
					{flag1s=0;EX0=0;TMOD=0X15;}  
		}
	}	  
}
//////////////////////////////////////
void mDelay(unsigned int Delay)	
{	unsigned int i;
	for(;Delay>0;Delay--)
	{	for(i=0;i<124;i++)
		{;}
	}
}
/////////////////////////////////////
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);
}
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 + -