📄 plj.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 + -