}
if (flag1==0){while (flag2==0);
if (count1>4){flag1=2;flag2=0;count1=0;}/*flag1=2,1khz~10khz*/ }/*如果第一次就测出来,flag1就不为0,然后往下运行*/
while (flag1==0){ t1init(); count1=0; TH1=55536/256; TL1=55536%6; flag2=0; if (P1_0==0){TR1=1;
while(P1_0==0){if(flag2==1){ TH1=35536/256; TL1=35536%6;flag2=3;TR1=1;i+=1;} if(i<=5) continue; flag2=2;i=0;TR1=0;break; } if(flag2==0){ TH1=35536/256; TL1=35536%6;TR1=1;
while(P1_0==1){if(flag2==1){ TH1=35536/256; TL1=35536%6;flag2=3;TR1=1;i+=1;} if(i<=5) continue; flag2=2;i=0;TR1=0;break; } if(flag2==0){flag1=2;flag2=0;TR1=0;} }/**/ if(flag2==3){flag1=3;flag2=0;TR1=0;} if(flag2==2){flag1=4;flag2=0;TR1=0;} } if(flag1==0){TR1=1;
while(P1_0==1){if(flag2==1){ TH1=35536/256; TL1=35536%6;flag2=3;TR1=1;i+=1;} if(i<=5) continue; flag2=2;i=0;TR1=0;break; } if(flag2==0){ TH1=35536/256; TL1=35536%6;TR1=1;
while(P1_0==0){if(flag2==1){ TH1=35536/256; TL1=35536%6;flag2=3;TR1=1;i+=1;} if(i<=5) continue; flag2=2;i=0;TR1=0;break; }
if(flag2==0){flag1=2;flag2=0;TR1=0;} }/**/ if(flag2==3){flag1=3;flag2=0;TR1=0;} if(flag2==2){flag1=4;flag2=0;TR1=0;}
} }/*已经粗测完*/ TR1=0; }
/******************************************************/ /* 高频部分的精测 */ unsigned long jingce() {
unsigned long b,a; unsigned long c=0; t2init(); t2cx();
while(flag2==0); a=RCAP2L; b=RCAP2H;
while(flag2==1);/*等待第二次下降沿的到来*/ while(RCAP2H<200);/*判断待测周期是不是超过10ms,不是就接着等待,这是为了防止单片机最小工作时间1us这个误差而设的*/ TR2=0;
a=RCAP2L-a; b=RCAP2H-b;
c=b*256+a;/*这里还没除去周期个数,转换函数里转换*/ count2=0; count3=0; return (c); }
/******************************************************/ /* 低频部分的精测 */ unsigned long jingche() {unsigned long c; unsigned char i,j; t0init();
if(flag1==3){j=10;} if(flag1==4){j=1;} while(P1_1==1); TR0=1;
for (i=j;i>0;i--){while(P1_0==1);
while(P1_0==0); } while(P1_1==1); P1_7=0; TR0=0;
c=count4*250+(TL0-6);/*计数模式,每250个溢出一次*/ TR0=0; count1=0; count4=0; return (c); }
/******************************************************/ /* 转换函数 */
/******************************************************/ void zhuanhuan(unsigned long b, unsigned long a,unsigned char d) { unsigned long f=0; unsigned long e=0; unsigned char i,j=0; a=a-1;
if(d==1) { e=b/a;
if(flag1==1|flag1==2){if(e<1000) {e=(b*1000)/a;} if(e<10000){e=(b*100)/a;}/*还要考虑到a的大小的会有影响,因为a越大,误差越大,所以放大原来的数进行运算*/ if(e<100000){e=(b*10)/a;}
for(i=0;i<=4;i++){m[i]=e/100000;e=(e0000)*10;}/*测周期的*/ f=1; if(flag1==1) f=100; /*判断是几分频,补回来*/
e=b/a; e=e/f; j=1;
if(e>10)j=2;/*这个是用来判断实际的数值到底多大,来确定该在第几个数值后加小数点*/
if(e>100)j=3; if(e>1000) j=4; if(e>10000) j=5;
for(i=5;i>j;i--){m[i]=m[i-1];}/*小数点前的数据移位,空出一位给小数点*/
m[i]=0x2e; m[6]=0; m[7]=0x75; m[8]=0x73;
}/*小数点,单位是us*/ if(flag1==3|flag1==4){ if(e<100000) e=b*2; if(e>=100000) e=b*2/10; for(i=0;i<=4;i++){m[i]=e/10000;e=(e000)*10;}
f=1; if (flag1==3) f=10; e=b*2/f; j=5; if(e<=1000000) j=4; if(e<=100000) j=3; if(e<10000) j=2;
for(i=5;i>j;i--){m[i]=m[i-1];} m[i]=0x2e; m[6]=0; m[7]=0x6d; m[8]=0x73; }/*测周期的*/ }
if(d==2) { e=b/a;
if( flag1==1|flag1==2) { if(e<100) e=(b*1000)/a; if(e<1000) e=(b*100)/a; if(e<10000) e=(b*10)/a; if(e>100000) {e=b/a;e=e/10;} e=100000000/e;
for(i=0;i<=4;i++){m[i]=e/1000;e=(e00)*10;/*测频率的*/
} f=1;
if(flag1==1)f=100; e=b/a; e=e/f; // if(e<100)j=2;/*超出量程了*/ j=3;
if(e>10)j=2;/*大于100khz,这个是用来判断实际的数值到底多大,来确定该在第几个数值后加小数点*/
if(e>100) j=1;/*大于10khz*/ if(e>1000) j=4; /*小于1khz*/ if(e>10000) j=5; if(j<4){ for(i=5;i>j;i--){ m[i]=m[i-1];}/*小数点前的数据移位,空出一位给小数点*/
m[i]=0x2e;
m[6]=0x4b; m[7]=0x48; m[8]=0x7a; } if(j==4){ for(i=5;i>=j;i--){ m[i]=m[i-1];}/*小数点前的数据移位,空出一位给小数点*/
m[i]=0x2e; m[7]=0x48; m[8]=0x7a;} if(j==5){ j=3; for(i=5;i>=j;i--) { m[i]=m[i-1];}/*小数点前的数据移位,空出一位给小数点*/
m[i]=0x2e; m[7]=0x48; m[8]=0x7a;}
} if( flag1==3|flag1==4) { j=0; if(e<10000) {e=b*200;j=2;} else if(e<100000) {e=b*20;j=1;} else {e=b*2;} for(i=0;i<=4;i++){m[i]=1000000/e;e=(1000000%e)*10;} if(flag1==3) j=j+1;
for(i=5;i>j;i--) m[i]=m[i-1];/*小数点前的数据移位,空出一位给小数点*/ if(j==0) { for(i=6;i>0;i--) m[i]=m[i-1];m[0]=0;m[1]=0x2e; m[7]=0x48; m[8]=0x7a; }
else { m[j]=0x2e; m[6]=0x48; m[7]=0x7a; }
} }/*小数点*/ }
/******************************************************/ /*数组转换为液晶显示里的数值*/
/******************************************************/ unsigned char xianshi (unsigned char a) {unsigned char b; switch (m[a]) { case 0:{b=0x30;}break;
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库简易数字频率计程序(2)在线全文阅读。
相关推荐: