各位亲们,小弟用外部中断写了一个频率计
时间:10-02
整理:3721RD
点击:
大大们:小弟用外部中断写了一个频率计,现在精度不是很高,怎么提高精度?还是程序写的不够完善,请指教
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit dula=P2^6;
sbit wela=P2^7;
uint num1,num2,temp;
uchar sw,wan,qian,bai,shi,ge;
void delayms(uint xms)
{ uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display()
{ dula=1;
P0=table[sw];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delayms(1);
dula=1;
P0=table[wan];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
delayms(1);
dula=1;
P0=table[qian];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
delayms(1);
dula=1;
P0=table[bai];
// delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x77;
wela=0;
delayms(1);
dula=1;
P0=table[shi];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delayms(1);
dula=1;
P0=table[ge];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x5f;
wela=0;
delayms(1);
}
void main()
{ num1=0;
num2=0;
TMOD=0x02;
TH0=6;
TL0=6;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
while(1)
{ if(num1==3686)
{EX0=0;
num1=0;
temp=num2;
sw=temp/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
display();
//delayms(1000);
num2=0;
EX0=1;
}
}
}
void T0_time() interrupt 1
{ num1++;
}
void INTO_time() interrupt 0
{num2++;}
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit dula=P2^6;
sbit wela=P2^7;
uint num1,num2,temp;
uchar sw,wan,qian,bai,shi,ge;
void delayms(uint xms)
{ uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display()
{ dula=1;
P0=table[sw];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delayms(1);
dula=1;
P0=table[wan];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
delayms(1);
dula=1;
P0=table[qian];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
delayms(1);
dula=1;
P0=table[bai];
// delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x77;
wela=0;
delayms(1);
dula=1;
P0=table[shi];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delayms(1);
dula=1;
P0=table[ge];
//delayms(100)
dula=0;
P0=0xff;
wela=1;
P0=0x5f;
wela=0;
delayms(1);
}
void main()
{ num1=0;
num2=0;
TMOD=0x02;
TH0=6;
TL0=6;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
while(1)
{ if(num1==3686)
{EX0=0;
num1=0;
temp=num2;
sw=temp/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
display();
//delayms(1000);
num2=0;
EX0=1;
}
}
}
void T0_time() interrupt 1
{ num1++;
}
void INTO_time() interrupt 0
{num2++;}
多次取值求平均试试, 什么中值滤波算法之类的,你也试一下..... 外部中断输入是方波么? 中断触发选择是边缘么(对不起,不了解51), 还有外部电路加个上拉或者下拉电路之类的减少干扰。看你的算法是,在一定时间之类求获取采集到的次数, 那你试试单个采集所需要的时间 这种算法... 还有就是检查下晶振的误差大么
谢谢