#include<reg52.h>
#include "LCD1602.h"
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
char m=0,n=0;
char u,v;
float t0,t1,f,p;
uint a[]={48,48,48,48,48,46,48,48}; //频率数据结果保存
uint b[]={48,48,48,46,48,48}; //相位数据结果保存
uint i,j;
uint x,y;
uint c,d;
//LCD初始化
void InitLCD()
{
LCDReset();
InputMode(0x06); //增量方式,不移位
DispControl(0x0c); //显示开,光标关,闪烁关
FunctionSet(0x38); //8位,2行,5×7
}
void CT_init() //定时计数器初始化
{ TMOD=0x99; //GATE=1,T1、T0工作在方式1,定时方式
TH0=0; //定时计数器初值清零
TL0=0;
TH1=0;
TL1=0;
TR0=1; //TR0,TR1置位,此时定时计数器的启动有INT0,INT1引脚电平决定
TR1=1;
ET0=1; //开中断
ET1=1;
}
void ITC0() interrupt 0 //外部中断0服务程序
{
u=m; //读定时计数器0溢出次数
m=0; //溢出次数清零
x=TH0*256+TL0; //读定时计数器0当前值
TH0=0; //定时计数器0清零
TL0=0;
}
void TIME0() interrupt 1 //定时计数器0溢出中断
{
m++; //溢出次数加1
}
void ITC1() interrupt 2 //外部中断1服务程序
{
v=n; //读定时计数器1溢出次数
n=0; //溢出次数清零
y=TH1*256+TL1; //读定时计数器1当前值
TH1=0; //定时计数器1清零
TL1=0;
}
void TIME1() interrupt 3 //定时计数器1溢出中断
{
n++; //溢出次数加1
}
void main()
{
InitLCD(); //液晶显示初始化
CT_init(); //定时计数器初始化
EA=1; //开总中断
EX0=1; //允许外部中断
EX1=1;
IT0=1; //设置外部中断方式为下降沿触发
IT1=1;
P3=0xff;
while(1)
{
t0=u*65536+x; //计算脉冲时间宽度
f=1000000/(2*t0); //计算频率
c=f*100; //计算结果逐位保存
a[7]=c%10+48;
a[6]=(c/10)%10+48;
c=f;
a[4]=c%10+48;
a[3]=(c/10)%10+48;
a[2]=(c/100)%10+48;
a[1]=(c/1000)%10+48;
a[0]=(c/10000)%10+48;
DispCharacter(0,1,'F'); //将显示单元数据送液晶屏显示
DispCharacter(0,3,'=');
for(i=0,j=5;i<=7;i++,j++)
{
DispCharacter(0,j,a[i]);
}
DispCharacter(0,14,'H');
DispCharacter(0,15,'Z');
t1=v*65536+y; //计算脉冲宽度
p=(t1/(2*t0))*360; //计算相位差
d=p*100; //将计算结果逐位保存
b[5]=d%10+48;
b[4]=(d/10)%10+48;
d=p;
b[2]=d%10+48;
b[1]=(d/10)%10+48;
b[0]=(d/100)%10+48;
DispCharacter(1,1,'P'); //将显示数据送液晶屏显示
DispCharacter(1,3,'=');
for(i=0,j=5;i<=5;i++,j++)
{
DispCharacter(1,j,b[i]);
}
DispCharacter(1,11,34);
}
}