基于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);//循环显示数码管缓冲区中数据

  }

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值