⑴ 求51單片機測量正弦波(20~100hz)的頻率的c程序,最好是已經通過測試過的
首先使用電壓比較器電路將正弦波轉化成方波,以方便單片機接收,參考下圖(該電路可接收峰峰值正負12V的正弦波),如果你的正弦波電路和單片機電路使用了不同的電源,則還需進行隔離處理
#include<AT89X51.H>
//********數碼管位代碼表(P0口)**********//
unsignedcharcodedispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//********數碼管段代碼表(P2口,共陰且高位接a,低位接h筆段)**********//
unsignedcharcodedispcode[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,
0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00};
//********8位數據緩沖器**********//
unsignedchardispbuf[8];
unsignedchartemp[8];
unsignedchardispcount;
unsignedcharT0count;
unsignedchartimecount;
bitflag;
unsignedlongx;
//*********初始化模塊**********//
voidinitial(void){
TMOD=0x15;
TH0=0;
TL0=0;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
TR1=0;
TR0=0;
ET0=1;
ET1=1;
EA=1;
}
//******************************************************//
//*********顯示模塊**********//
voiddataDisplay(){
unsignedchari;
for(i=0;i<8;i++){
temp[i]=0;
}
i=0;
while(x/10){
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<8;i++){
dispbuf[i]=temp[i];
}
P2=dispcode[dispbuf[dispcount]];
P0=dispbit[dispcount];
dispcount++;
if(dispcount==8){
dispcount=0;
}
}
//******************************************************//
//*********信號頻率測量模塊**********//
floatfrequency(floatfreq){
initial();
TR0=1;TR1=1;
if(timecount==250){
TR0=0;
freq=T0count*65536+TH0*256+TL0;
return(freq);
}
}
//******************************************************//
//*********信號周期測量模塊**********//
floatcycle(floatcount){
initial();
if(P3_4==1){
TR0=1;TR1=1;
if(P3_4==0){
TR0=0;
count=1000000/(timecount*4000+TH1*256+TL1-61536);
}
}
return(count);
}
//******************************************************//
//*********定時中斷服務程序1**********//
voidt1(void)interrupt3using0{
//initial();
//TR0=1;
//TR1=1;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
timecount++;
}
//******************************************************//
//*********定時中斷服務程序2**********//
voidt0(void)interrupt1using0{
//initial();
//TR0=1;
//TR1=1;
T0count++;
}
//******************************************************//
//*********主函數**********//
voidmain(void){
while(1){
x=frequency(x);
if(x<100){
x=cycle(x);
}
dataDisplay();
}
}
//******************************************************//