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

📄 plj.c

📁 等精度频率计
💻 C
字号:
/*************************************************************/
// Name:Freqency Meter   Range:1-10Mhz 
// Target : AT89C52
// Crystal: 24.0000Mhz
// Completed:2008-8-24 
// By:Adrian
// All Rights Reserved
/**************************************************************/

#include<reg52.h>
#include <intrins.h> 
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
sbit LOAD=P2^0;

ulong Data=0,Data3=0;
uchar n=0,n1=0;
uchar table1[]="f Range: 1-10MHZ";
uchar table2[3][3]={" ms"," Hz","KHz"};
uchar table3[5]="f/T: ";

void delay_ms(uint ms) //延时毫秒级子程序
{
   uint i,j;
   for(i=0;i<ms;i++)
   for(j=0;j<250;j++);
}

void write_com(uchar com)//写指令
{
 RS=0;
 RW=0;
 P1=com;
 E=1;
 delay_ms(1);
 E=0; 
}

void write_dat(uchar dat)//写数据
{
 RS=1;
 RW=0;
 P1=dat;
 E=1;
 delay_ms(1);
 E=0; 
}

void timer0() interrupt 1	//计数器0
{
 TH0=0;
 TL0=0;
 n1++;
}
					   			                         
void Timer1() interrupt 3	/*定时器1中断响应,定时20ms*/
{
   TH1=0x63;
   TL1=0xd8;
   n++;
   if(n==50)//定时一秒到
   {
    TR0=0;//计数器0停止工作
	TR1=0; //定时器1停止工作
	n=0;
	Data=((TH0*256+TL0+((n1<<8)<<8))<<8)+P0;
	n1=0;
	TH0=0;
	TL0=0;
	LOAD=0;
	_nop_();
	_nop_();
	_nop_();
	LOAD=1;
	TR0=1;
	TR1=1;
   }
}				


void Fun_init()		//工作方式设置
{
 TMOD=0x15;//定时/计数器0工作方式为16位计数;定时/计数器1工作方式为1定时
 EA=1;//打开全局中断
 TF0=0;	//清零溢出标志
 ET0=1;//计数器0使能
 ET1=1;//打开定时器1
 TH0=0;
 TL0=0;
 TH1=0x68;
 TL1=0xd8;
 TR0=1;//开始计数
 TR1=1;//定时器开始
}

//分频设定
/*void Fre_set()
{
 if(PA0)//已分频
 {Data=Data*256;}

   else if(Data>204800&&(~PA0))
      { PA0=1; }	//启用分频
    else if(Data<204800&&(PA0))
      { PA0=0; }	 //关闭分频
} */

void disp_int()
{
 write_com(0x38);//显示模式设置
 delay_ms(2);
 write_com(0x01);//清屏,很重要!
 delay_ms(2);
 //write_com(0x0f);//显示光标并闪烁
 write_com(0x0c);//不显示光标
 delay_ms(2);
 write_com(0x06);//显示光标移动设置
 delay_ms(2);

}

void main()		//主函数
{
 uchar i=0,j=0,qian=0,bai=0,shi=0,ge=0,xiao1=0,xiao2=0,k=0;
 static uchar  flage=0;
 float Data1=0.0;
 uchar Data2=0;
 Fun_init();
 disp_int();
 while(1)
 {
   if(Data<1000)
   {
    flage=0;
	Data1=Data;
	Data1=1000/Data1;
   	Data=Data1;		  //整数毫秒
	Data2=(Data1-Data)*100;//小数毫秒;
	qian=Data/1000;
	if(qian==0)
	{qian=-0x10;}
	bai=Data%1000/100;
	if((qian==(-0x10))&&bai==0)
	{bai=-0x10;}
	shi=Data%100/10;
	if((bai==(-0x10))&&shi==0)
	{shi=-0x10;}
	ge=Data%10;
   	xiao1=Data2/10;
	xiao2=Data2%10;
   }
   else if(Data>=1000&&Data<=9999)
   {
    flage=1;
    qian=Data/1000;
    bai=Data%1000/100;
    shi=Data%100/10;
    ge=Data%10;
    xiao1=0;
	xiao2=0;
   }
   else if(Data>=10000&&Data<=9999000)
   {
    flage=2;
    Data1=Data;
    Data1=Data1/1000; //保存为浮点
	Data=Data1;		 //整数
	Data2=(Data1-Data)*100;//取小数点后两位
	qian=Data/1000;
	if(qian==0)
	{qian=-0x10;}
	bai=Data%1000/100;
	if(qian==-0x10&&bai==0)
	{bai=-0x10;}
	shi=Data%100/10;
	if(((bai==-0x10))&&shi==0)
	{shi=-0x10;}
	ge=Data%10;
    xiao1=Data2/10;
	xiao2=Data2%10;
   }
	k=10;
	 while(k--)
	 {
     write_com(0x80+0x0);//第一行显示
     delay_ms(1);
     for(i=0;i<16;i++)//第一行显示
      {
        write_dat(table1[i]);
        delay_ms(2);
      }
     write_com(0x80+0x40);//第二行显示
     for(i=0;i<5;i++)//第一行显示
      {
        write_dat(table3[i]);
        delay_ms(2);
      }
     write_dat(0x30+qian);
     delay_ms(2);
     write_dat(0x30+bai);
     delay_ms(2);
     write_dat(0x30+shi);
     delay_ms(2);
     write_dat(0x30+ge);
     delay_ms(2);
     write_dat('.');
     delay_ms(2);
	 write_dat(0x30+xiao1);
     delay_ms(2);
	 write_dat(0x30+xiao2);
     delay_ms(2);	
	   
     write_com(0x80+0x4d);//第二行显示
     delay_ms(2);
     for(i=0;i<3;i++)		  //单位显示
      {
       write_dat(table2[flage][i]);
       delay_ms(2);
      }
   }
 }
}


⌨️ 快捷键说明

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