用89C2051做的数字频率计 点击查看高清晰电路 measure.c51 ==================================== /************************************************************************/ /* */ /* Frequency Meter 5Hz ... 125MHz Test Program */ /* */ /* Author: Peter Dannegger */ /* danni@specs.de */ /* */ /************************************************************************/ #include \"main.h\" #include \"measure.h\" #include \"display.h\" #include <stdio.h>
#define BAUD 9600 void main( void ) { uchar idata s[DISPLAYMEM]; PCON |= SMOD_; // initialization UART SCON = TI_ + REN_ + SM1_; TMOD = T1_M1_ + T0_M0_ + T0_M1_; // T0: splitt timer // T1: baud rate TH1 = (uchar) -(0.5 + XTAL / 12.0 / 16 / BAUD); TL1 = -1;
for(;;){ measure_start(); while( measure_poll() == 0 ); display( measure_read(), s ); puts( s ); } } ============= measure.h ==================================================
void measure_start( void );
bit measure_poll( void ); float measure_read( void ); ========== display.c51 =====================================================
/************************************************************************/ /* */ /* Display 5 digit floating point number */ /* */ /* Author: Peter Dannegger */ /* danni@specs.de */ /* */ /************************************************************************/ #include \"main.h\" void display ( float val, uchar idata *ptr ) { uchar hz, num, i, dp;
for( dp = 1; val >= 10; dp++ ) // normalize (x.xxxx) val *= 0.1; // 3 times faster as \"val /= 10;\" hz = 0; if( dp > 6 ){ // MHz ? dp -= 6; hz = 'M'; } if( dp > 3 ){ // kHz ? dp -= 3; hz = 'k'; } for( i = DIGITS;; ){ // 5 digits *ptr++ = (num = val) + '0'; // get digit if( --dp == 0 ){ // set decimal point *ptr++ = '.'; } if( --i == 0 ) break; val = (val - num) * 10; // next digit } if( hz ) *ptr++ = hz; |