原理图我贴在这里,希望大佬们帮我看一下
目前我的接上电源,屏幕只能显示:f 0.000000Hz,接入信号没有办法做到测频
代码如下:
#include"STC12C5A60S2.H"
#include "stdio.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DB P0 //数据信号
/************端口定义***************/
sbit lcdrs = P1^0;
sbit lcdrw = P1^1;
sbit lcden = P1^2;
sbit GATE = P1^5; //门控信号
/************变量声明***************/
uint t0,t1;
double feq; //测得频率值
uint x=1000;//初始化闸门时间
/************1ms延时***************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1400;y>0;y--);
}
/**********液晶写指令*************/
void write_com(uchar com)
{
LCD_DB=com;
lcdrs=0;
lcdrw=0;
lcden=0;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
/**********液晶写数据*************/
void write_date(uchar date)
{
LCD_DB=date;
lcdrs=1;
lcdrw=0;
lcden=0;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
/**********液晶初始化*************/
void init()
{
uchar num;
uchar code table[]="f: ---Ready---- ";//初始化显示
lcden=0;
GATE=0; //开始先关闸门保证第一次测量准确
write_com(0x38); //设置8位格式,2行,5x7
write_com(0x0c); //整体显示,关光标,不闪烁
write_com(0x06); //设定输入方式,增量不移位
write_com(0x01); //清除屏幕显示
write_com(0x80);
for(num=0;num<15;num++)
write_date(table[num]);
TMOD=0xD9; //设置计数器,计数器0和计数器1为工作方式1,T0内计数,T1外计数
AUXR=(AUXR|0x80);
AUXR=(AUXR|0x40);
AUXR=(AUXR|0x04);
TR0=1; //计数器0开始计数
TR1=1; //计数器1开始计数
ET0=1; //打开计数器0中断
ET1=1; //打开计数器1中断
EA=1; //开总中断,EA最后保证一起计数
}
/**********拆分显示*************/
void write(double f)
{
uchar i;
uchar ch[12];
sprintf(ch, "%.6f", f); //把数转换为字符串
for(i=0;ch[ i]!='\0';i++)
{
write_date(ch[ i]);
}
}
/*********频率计算*************/
void calcu_Fx()
{
uchar i;
float N,M;
double feq_cl;
M=(t0*65536)+(TH0*256)+TL0; //内计数值
N=(t1*65536)+(TH1*256)+TL1; //外计数值
feq=(N/M)*12000000;
feq_cl=feq;
write_com(0x80+0x03); //第一行刷屏
for(i=0;i<16;i++)
write_date(' ');
if(feq>0.05&feq<=1000) //频率显示HZ
{
write_com(0x80+0x03);
write(feq_cl);
write_date('H');
write_date('z');
}
else //无输入频率显示0HZ
{
write_com(0x80+0x03);
write(0);
write_date('H');
write_date('z');
}
}
/********自动闸门选择*************/
void chane_time()
{
if(feq>0.05&feq<=0.5) //频率小于0.5HZ 闸门时间20秒
x=20000;
if(feq>0.5&feq<=10)//频率小于10HZ大于0.5HZ,闸门时间6秒
x=8000;
if(feq>10&feq<=100)//频率小于100HZ大于10HZ,闸门时间4秒
x=6000;
if(feq>100&feq<=10000)//频率小于2000HZ大于100HZ,闸门时间2秒
x=4000;
if(feq>10000) //频率大于10K闸门时间1S
x=2000;
}
/**********主程序*************/
void main()
{
init(); //测频初始化
while(1)
{
GATE=1; //开闸门
delay(x); //延时关门时间(第一次1秒)
GATE=0; //闸门时间到gate为0;关门然后计算
calcu_Fx(); //计算频率
TH1=TL1=TH0=TL0=t1=t0=0; //所以计数清零为下次做准备
chane_time(); //根据频率选择闸门时间
}
}
/*******定时器0对内计数*********/
void timer0() interrupt 1
{
t0++; //内部计数
}
/*******定时器1对外计数*********/
void timer1() interrupt 3
{
t1++;//外部计数
}
|