我是靠谱客的博主 无奈哈密瓜,最近开发中收集的这篇文章主要介绍基于51单片机的数字频率计设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#define LED_GLOBAL 1

#include "led.h"

/*******************************************************************************************

*函数名称:delay_us(uint us)

*函数功能:实现微秒级的延时

*函数入口:us,延时函数循环后期数

*函数出口:无

*******************************************************************************************/

void delay_us(uint us)

{

  uint i;

  while(us--)

  {

    for(i=0;i<100;i++);

  }

}

/*******************************************************************************************

*函数名称:led_init(void)

*函数功能:四位七段数码管显示初始化

*函数入口:无

*函数出口:无

*******************************************************************************************/

void init_led(void)

{

   LED=segLedCode[0];

   LED_CS1=0;

   LED_CS2=0;

   LED_CS3=0;

   LED_CS4=0;

}

/*******************************************************************************************

*函数名称:ledWrite(uchar c,uchar n,uchar mod)

*函数功能:对一组数码管的某一位进行短暂显示

*函数入口:c,要显示的数据;n,显示一组数码管中的第n位;mod,c的数据形式

*函数出口:无

*说明:当mod==DIGITAL时,c为数字0~9的ANCII码形式,此时在n位数码管上显示想用数字

       当mod==CHARACTER,直接将c输出数据口

*******************************************************************************************/

void ledWrite(uchar c,uchar n,uchar mod)

{

   if(CHARACTER==mod)

   {

           LED=c; 

   }

   else if(DIGITAL==mod)

            {

               if((c-'0')<0x0a)

                    {

                      LED=segLedCode[c-'0'];

                    }

                    else

                    { 

                          LED=segLedCode[0];

                    }

/*******************************************************************************************

*函数名称:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)

*函数功能:循环在数码管上显示缓冲区中的数据

*函数入口:segCode,指向显示缓冲区中的指针;segCodeMod,0~7位为1或0标示1~8位数码管显示的数据的类型(DIGITAL或者CHARACTER);segNumber,代表要显示数码管的位数

*函数出口:无

*说明:本函数主要实现将显示缓冲区中的数据在数码管上显示出来

*******************************************************************************************/                

void ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)

{

     uchar segCount;

         for(segCount=0;segCount<segNumber;segCount++)

         {

            if(segCodeMod&0x01)        /*1代表此处显示任意字符 */

            {

              ledWrite(segCode[segCount],segCount+1,CHARACTER);

            }

            else

            {

              ledWrite(segCode[segCount],segCount+1,DIGITAL);

            }

            segCodeMod=segCodeMod>>1;

         }

}

#define TARGET_GLOBAL 1

#include "target.h"

uint  timer0Count;       //timer0溢出计数

uint  pulseCount;        //脉冲计数

uint  pulseCountTemp;    //脉冲计数寄存

/*************************************************

*函数名称:timer0_init(void)

*函数功能:timer0初始化

*函数入口:无

*函数出口:无

*说明:本系统用12Mhz晶振,定时1ms

*************************************************/

void timer0_init(void)

{

  TMOD|=0x01;   //timer0工作在MODEL1,timer

  TH0=0xFC;

  TL0=0x18;

  ET0=1;        //timer0中断使能

  IP=0x02;      //timer0优先级最高

  TR0=1;                  //timer0启动

}

/*************************************************

*函数名称:int0_init(void)

*函数功能:外部中断0初始化

*函数入口:无

*函数出口:无

*************************************************/

   

    pulseCountTemp=pulseCount-pulseCount/(uint)36;    //频率计数校准

         pulseCount=0;

    timer0Count=0;

  }

  sei();

}

void int0(void) interrupt 0      //int0中断入口函数,实时计数检测频率

{

  pulseCount++;

}

/*********************************************

*函数名称:uint get_fre_number(void)

*函数功能:计算频率,1~1000HZ

*********************************************/

uint get_fre_number(void)

{

  return pulseCountTemp;

}

/*************************************************************************

*实例名称:频率计

*实例说明:实现0~9000hz频率计的统计

*************************************************************************/

#include "target.h"

#include "led.h"

uchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个

const uchar displayMode=0x00;           //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示

void main()

{

  uint get_fre;

  target_init();

  init_led();

  sei();

  while(1)

  {

    get_fre=get_fre_number();

         if(get_fre/1000<0x0A)

         {

           displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位

         }

         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位

    displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位

         displayBuff[3]=get_fre%10+'0';                       //计算频率个位,放在缓冲区第3位

    ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据

  }

最后

以上就是无奈哈密瓜为你收集整理的基于51单片机的数字频率计设计的全部内容,希望文章能够帮你解决基于51单片机的数字频率计设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部