电工吧
◎ 电工吧 >> 设为首页 >> 加入收藏>> 联系方式 >> 投稿 >>留言 
网站首页 · 电工新闻 · 电工基础 · 电力技术 · 电子技术 · 电工图片 · 电工法规 · 电工图书 · 电工搜索 · 论坛交流
 
      最新电子论文
 · 谈谈C51的编程规范 
 · 单片机初学者不好掌握的概 
 · MC14541B制作可编程序定时 
 · AT89C系列单片机加解密原理 
 · 功能强大的时钟中断 
 · PIC系单片机与MCS-51系列单 
 · 有些51系统容易复位的解决 
 · 温度传感器ds1820的汇编程 
      推荐电子论文

 · 功能强大的时钟中断
 · DSP编程的几个关键问题
 · 寻址方式与指令系统
 · 数码管的显示一例
 · PIC单片机软件开发技巧 

  ■ 所在位置:首页>>电子技术>>单片机技术>>正文
 

用89C2051做的数字频率计

 

用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;

本新闻共2页,当前在第1页  [1]  [2]  

 
         相关文章

 
 
  关于本站 | 友情站点 | 联系方式 | 版权声明 | 电工技术服务与支持中心
Copyright© 2005-2006 Dg8.Com.CN ,All Rights Reserved
电工网 电工吧 电子吧