📄 Ƶ
字号:
#include"AT898252.H"
#include"intrins.h"
#include "absacc.h"
sbit LCM_RS=P2^0;
sbit LCM_RW=P2^1;
sbit LCM_EN=P2^2;
#define BUSY 0x80 //常量定义
#define DATAPORT P1 //P1口为输出端
#define uchar unsigned char
#define uint unsigned int
void lcd_wait(void);
uchar code str0[]={"the frequency is"}; //字符串
uchar code str1[]={"HZ"};
uchar temp1,time,d,lorh,p,t;/*p为T0中断标志,lorh为选择测量方法*/
unsigned long f, f1,f2; unsigned int temp2;
delay(uint m) /*延时*/
{uchar i,j;
for(i=0;i<m;i++)
for(j=0;j<120;j++);
}
/**********写指令到ICM子函数************/
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)lcd_wait();
DATAPORT=WCLCM;
LCM_RS=0; // 选中指令寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/**********写数据到LCM子函数************/
void WriteDataLCM(uchar WDLCM)
{
lcd_wait( ); //检测忙信号
DATAPORT=WDLCM;
LCM_RS=1; // 选中数据寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/***********lcm内部等待函数*************/
void lcd_wait(void)
{
DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
_nop_();
_nop_();
while(DATAPORT&BUSY)
{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}
/**********LCM初始化子函数***********/
void initLCM( )
{
DATAPORT=0;
delay(15);
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommandLCM(0x08,1); //关闭显示,检测忙信号
WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
}
/****显示指定坐标的一个字符子函数****/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40
X|=0x80; //指令码为地址码+0X80
WriteCommandLCM(X,1);
WriteDataLCM(DData);
}
/*******显示指定坐标的一串字符子函数*****/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while(DData[ListLength]!='\0')
{ DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;}
}
/********显示函数*************/
Display_imp(unsigned long f)
{
uchar c=0;
c=(uint)(f%10);
DisplayOneChar(11,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(10,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(9,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(8,1,0x2e);
DisplayOneChar(7,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(6,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(5,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(4,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(3,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(2,1,c+0x30);
f=f/10;
c=(uint)(f%10);
DisplayOneChar(1,1,c+0x30);
}
cl1()
{
f1=1000000000/(65536.0*time+256.0*TH2+TL2);
Display_imp(f1);delay(300);
}
cl2()
{
f2=(65536*temp2+256*TH1+TL1)*1000;
Display_imp(f2);
}
frelow() /*低频测周期*/
{
T2CON=0;T2MOD=0;
TH2=0;
TL2=0;
RCAP2H=0;
RCAP2L=0;
TMOD=0x60;
TH1=0xFF;
TL1=0xFF;
EA=1;
ET1=1;
ET2=1;
TR1=1;
d=2;
t=0;
}
frehigh() /*高频测频率*/
{time=0;
T2CON=0;T2MOD=0;
TH2=0x3C;TL2=0xB0; //定时50ms
RCAP2H=0x3C;
RCAP2L=0xB0;
TMOD=0x50;
TH1=0;
TL1=0;
EA=1;
ET1=1;
ET2=1;
TR2=1;
TR1=1;
t=1;
}
choose() /*选择计数方式*/
{
TMOD=0x51;
TH0=0xD8;
TL0=0xF0; /*定时10ms*/
TH1=0;
TL1=0;
EA=1;
ET0=1;
}
main() /*主函数*/
{
while(1)
{
time=0;
temp2=0;
initLCM( );
DisplayListChar(0,0,str0);
DisplayListChar(14,1,str1);
choose();
TR1=1;
TR0=1;
p=1;
while(p);
if(TL1>0x0A||TH1>0) //判断使用哪种测量方法
lorh=1; //高频使用直接测频
else
lorh=0; //低频使用间接测周
if(lorh==0)
{
frelow();
while(d>0);
TR1=0;
cl1();
}
else
{
frehigh();
while(time<20); //T2中断20次,即1s
TR2=0;
TR1=0;
cl2();
}
}
}
void time0(void) interrupt 1 //T0中断
{TR1=0;TR0=0;p=0;}
void time1(void) interrupt 3 //T1中断
{if(t==0){d--;TR2=d;}else temp2++;}
void time2(void) interrupt 5 //T2中断
{TF2=0;time++;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -