該程序能實現測量10至3MHZ的TTL信號頻率,液晶顯示4為有效數字,同時能夠測量脈沖占空比,精度在0.5%左右...
需要硬件支持:C8051F360單片機,鍵盤,液晶顯示器
下面這個是主程序
還有下面這幾個文件限于篇幅不能一一貼上來大家可以去下載:
1.液晶初始及鍵盤等
2.初始化及中斷
3.ASCII液晶輸出函數
這個幾個文件請從這里下載
http://m.raoushi.com/ziliao/file/pinglvji1.rar
main()
{
int xdata flag1=0;
float sum1=0,sum2=0;
float xdata sum3[10];
int i;
Init_device();
LCD_REST();
LCD_INIT();
f=0;
f1=0;
while(1)
{
if(flag)
{
if(f>=10&&f<=99) 額,不得不說,取11個數求平均值確實不好,讀數不能穩定的說....
{
sum2=(jishu[0]+jishu[1]+jishu[2]+jishu[3]+jishu[4]+jishu[5]+jishu[6]+jishu[7]+jishu[8]+jishu[9]+jishu[10])/11;
get_flow(sum2);
LCD_HZ(0x80,TAB_WORD);
LCD_HZ(0x90,F_DISPLOW);
flag=0;
}
else if(f>=100&&f<= 999)
{
get_flowhigh();
LCD_HZ(0x80,TAB_WORD);
LCD_HZ(0x90,F_DISPLOWHIGH);
flag=0;
}
else if (f>=1000&&f<=9999)
{
get_high();
LCD_HZ(0x80,TAB_WORD);
LCD_HZ(0x90,F_DISPHIGH);
flag=0;
}
else if(f>=10000&&f<=99999)
{
get_highone();
LCD_HZ(0x80,TAB_WORD);
LCD_HZ(0x90,F_DISPHIGHONE);
flag=0;
}
else if(f>=100000&&f<=999999)
{
get_highone();
LCD_HZ(0x80,TAB_WORD);
LCD_HZ(0x90,F_DISPHIGHONE); 內部數據存儲器只有128位,為節約空間與上個數組存在同一空間
(內部數據存儲器空間用完的說...)
flag=0;
}
else
{
get_highthree();
LCD_HZ(0x80,TAB_WORD);
LCD_HZ(0x90,F_DISPHIGHTHREE);
flag=0;
}
}
if((key_num&0xf0)==0)
{
TR0=0;
ET1=1;
TMOD=0x10;
TCON=0x40;
for(i=0;i< 10;i++)
{
while(CHUFA==0);
TH1=0;
TL1=0;
f1=0;
TR0=0;
while(CHUFA==1);
while(CHUFA==0);
TR1=1;
while(CHUFA==1);
TR1=0;
m=f1*65536+256*TH1+TL1;
while(CHUFA==0);
TH1=0;
TL1=0;
f1=0;
TR1=0;
while(CHUFA==1);
TR1=1;
while(CHUFA==0);
TR1=0;
f=f1*65536+256*TH1+TL1;
key_num=0xf0;
sum1=m;
sum2=m+f;
sum1=sum1/sum2;
sum3[i]=sum1;
}
sum2=0;
for(i=0;i< 10;i++)
{
sum2=sum2+sum3[i];
}
sum2=sum2/10;
if(sum2>=0.1&&sum2<=0.40)
{
sum2=sum2-0.07;
}
else if(sum2>0.40&&sum2<=0.44)
{
sum2=sum2-0.04;
} 占空比程序設計,本想用個中斷來著,試驗不成功簡單的算了
由于每次運行指令要耗費時間,精度不高,故加個實測校準程序
O(∩_∩)O哈哈~測評時能達到0.5%的精度,踩狗屎運了...
else if(sum2>0.44&&sum2<=0.55)
{
sum2=sum2-0.02;
}
else if(sum2>0.55&&sum2<=0.63)
{
sum2=sum2+0.03;
}
else sum2=sum2+0.07;
get_f(sum2);
LCD_HZ(0x88,TAB_WORD1);
LCD_HZ(0x98,F_DISP);
flag1=1;
}
if(flag1==1) 讓程序能范圍繼續測量頻率
{
TMOD=0x51;
CKCON=0;
TCON=0x50;
flag1=0;
}
}
}
