今天由于看了gzh007的“关于电感表的自制”
启发我去继续学习单片机技术
然后我学会了T0、T1计数器的计数使用方式
正好。。用在频率计上面
电路图如下,改进了,简单了,
驱动4个数码管的电路不变,
只是计数功能改编了
左边的3个灯是显示频率的单位的(Hz、kHz、MHz)
用的晶振频率22.1184MHz
信号频率(方波)
效果图:
仿真(Proteus)
理论上的精度是很高的(限于频率不低于10Hz时,不高于晶振频率一半(即11.0582MHz)时)
对于有人不相信10M可以测出来的。。
就是这时候电脑爆卡(没办法,频率太高了)
程序还是公开:
#include<AT89X52.h>
#define CLK P2_0
#define DISP P2_1
#define Hz P1_0
#define kHz P1_1
#define MHz P1_2
#define uchar unsigned char
long pn=0;
long freq;
uchar t=0;
uchar th,tl;
int put(uchar p){
CLK=0;DISP=p;CLK=1;
}
void show(uchar a,uchar pos){
put(pos);
if((a==2)||(a==3)||(a==4)||(a==5)||(a==6)||(a==8)||(a==9))put(1);else put(0);
if((a==4)||(a==5)||(a==6)||(a==8)||(a==9)||(a==0))put(1);else put(0);
if((a==2)||(a==6)||(a==8)||(a==0))put(1);else put(0);
if((a==2)||(a==3)||(a==5)||(a==6)||(a==8)||(a==9)||(a==0))put(1);else put(0);
if((a==1)||(a==3)||(a==4)||(a==5)||(a==6)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);
if((a==1)||(a==2)||(a==3)||(a==4)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);
if((a==2)||(a==3)||(a==5)||(a==6)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);
} //倒序,低位在前
void display(long f){
if(f<10){show(0,0);show(0,0);show(0,0);show(f,1);Hz=1;kHz=0;MHz=0;}
else if(f<100){show(0,0);show(0,0);show(f%10,1);show(f/10,0);Hz=1;kHz=0;MHz=0;}
else if(f<1000){show(0,0);show(f%10,1);show(f%100/10,0);show(f/100,0);Hz=1;kHz=0;MHz=0;}
else if(f<10000){show(f%10,0);show(f%100/10,0);show(f%1000/100,0);show(f/1000,1);Hz=0;kHz=1;MHz=0;}
else if(f<100000){show(f%100/10,0);show(f%1000/100,0);show(f%10000/1000,1);show(f/10000,0);Hz=0;kHz=1;MHz=0;}
else if(f<1000000){show(f%1000/100,0);show(f%10000/1000,1);show(f%100000/10000,0);show(f/100000,0);Hz=0;kHz=1;MHz=0;}
else if(f<10000000){show(f%10000/1000,0);show(f%100000/10000,0);show(f%1000000/100000,0);show(f/1000000,1);Hz=0;kHz=0;MHz=1;}
}
void main(){
TMOD=0x05;
TR0=1;
ET0=1;
TR2=1;
RCAP2H=0x10;RCAP2L=0x00;
ET2=1;
EA=1;
while(1){
}
}
timer0() interrupt 1{
pn+=65536;
}
timer2() interrupt 5{
TF2=0;
t++;
if(t==30){
th=TH0;tl=TL0;
TH0=0;TL0=0;
pn+=th*256;
pn+=tl;
freq=pn;
display(freq);
pn=0;
t=0;
}
}
比以前那个短多了。。功能也还不错的
200字以内,仅用于支线交流,主线讨论请采用回复功能。