本帖最后由 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; } } } |