加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

基于51单片机的数字频率计设计

09/26 09:51
398
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

}

 

  • 有需要资料的可了解一下.docx

相关推荐

电子产业图谱