之前由于同學的一個小實驗,需要用到頻率計,所以自己想搞一個出來,于是網上找了很多資料,簡單的有用8052單片機的定時器和計數器的結合來測其信號的頻率,還有的是c8051f的捕捉功能,想來想去,還是想用用自己熟悉的8052的計數器功能,畢竟平時都用的是定時器功能,很少用到計數器功能,以便更加深入的運用8052,以后再學習C8051F。
搞了好幾天,時鐘沒有結果,計數功能倒是有了,但是不能在1s的時間里計數,很是頭痛,忽然有一天,我的同學找到了一段代碼,說是可以運行的,于是我拿過來,把LED改了一改,燒錄之后,還真的成功了!甚是大喜?。∵@里附上源代碼;
/*******http://hi.baidu.com/zhangjiayue123/home************************************
函數功能:51單片機制作的頻率計(當然這個頻率計的頻率范圍是有限制的理論值為2Hz-1MHz)
編譯環(huán)境:keil4
設計思想:測頻率,其實就是一個定時計數的過程,在一定時間內,檢測脈沖的個數,最后用脈沖個數除以時間便可以得到頻率
修改:LiMingWangQiDong
板子:CCDZ-Cboard
CPU:STC89C52RC
晶振:12MHz
修改部分:LED顯示部分4位顯示2Hz-9999Hz
版本:0.1.0
********http://hi.baidu.com/zhangjiayue123/home****************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;
sbitwela=P2^7;
//ucharseg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管的段選
ucharseg_du[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數碼管的段選
uchardbuf[4]={0,0,0,0};//用來裝顯示數據的空數組
uintcount;
uintcou,cou1;
voiddelay(void)//延時函數用于數碼管動態(tài)掃描
{
uchari;
for(i=0;i<110;i++)
;
}
voiddisplay()//數碼管顯示函數
{
dula=1;
P0=seg_du[dbuf[3]];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay();
//
dula=1;
P0=seg_du[dbuf[2]];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay();
//
dula=1;
P0=seg_du[dbuf[1]];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay();
//
dula=1;
P0=seg_du[dbuf[0]];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay();
}
voidtimer0(void)interrupt1//定時器中斷,用與定時計數
{
count++;
if(count==4000)//定時1s,
{
count=0;//將定時標志清零
TR1=0;//關閉計數器
cou1=TL1-6;//將小于250次脈沖的計數加上
dbuf[3]=(cou*250+cou1)/1000;
dbuf[2]=((cou*250+cou1)%1000)/100;
dbuf[1]=((cou*250+cou1)%100)/10;
dbuf[0]=(cou*250+cou1)%10;//顯示處理函數
cou=0;//計數器清零
TL1=6;//打開計數器中斷
TR1=1;//開啟計數器,使之工作
}
}
voidtime1(void)interrupt3//計數器中斷,用于計數
{
cou++;
}
voidtime0_init()//定時器0初始化
{
TMOD=0x62;//設置定時器0,和計數器1的模式
TH0=6;
TL0=6;//定時器的初值,用于中斷一次計時250us
ET0=1;//開定時器0中斷
TR0=1;//開定時器0
}
voidtime1_init()//計數器1初始化
{
TH1=6;
TL1=6;//裝載計數器的初值
ET1=1;//開計數器1中斷
TR1=1;//開計數器1
EA=1;//開總中斷
}
voidmain()
{
count=0;
time0_init();
time1_init();
while(1)
{
display();
}
}
也感謝網上的網友提供,
結果還是可以的,只不過和自由四位顯示,附上幾張照片:
信號發(fā)生器的頻率為5.677kHZ,LED上顯示還可以吧。。。