本帖最后由 daming 于 2014-12-30 15:47 編輯
該程序能實現測量10至3MHZ的TTL信號頻率,液晶顯示4為有效數字,同時能夠測量脈沖占空比,精度在0.5%左右...
需要硬件支持:C8051F360單片機,鍵盤,液晶顯示器 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; } } } |