找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6046|回复: 4
打印 上一主题 下一主题
收起左侧

单片机数字频率计仿真设计0~9000hz 数码管显示 带源码

[复制链接]
跳转到指定楼层
楼主
今天给51黑电子论坛的朋友们分享一个51单片机做的数字频率计,用数码管显示,有详细的程序代码.
仿真原理图如下:



部分单片机源码预览:
freCountMain.c文件:
  1. /*************************************************************************
  2. *实例名称:频率计
  3. *实例说明:实现0~9000hz频率计的统计
  4. *作者:yd
  5. *时间:09.06.20
  6. *************************************************************************/
  7. #include "target.h"
  8. #include "led.h"
  9. uchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个
  10. const uchar displayMode=0x00;           //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示
  11. void main()
  12. {
  13.   uint get_fre;
  14.   target_init();
  15.   init_led();
  16.   sei();
  17.   while(1)
  18.   {
  19.     get_fre=get_fre_number();
  20.         if(get_fre/1000<0x0A)
  21.         {
  22.           displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  23.         }
  24.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  25.     displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  26.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  27.     ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  28.   }

  29. }
复制代码

led.c文件:
  1. #define LED_GLOBAL 1
  2. #include "led.h"
  3. /*******************************************************************************************
  4. *函数名称:delay_us(uint us)
  5. *函数功能:实现微秒级的延时
  6. *函数入口:us,延时函数循环后期数
  7. *函数出口:无
  8. *******************************************************************************************/
  9. void delay_us(uint us)
  10. {
  11.   uint i;
  12.   while(us--)
  13.   {
  14.     for(i=0;i<100;i++);
  15.   }
  16. }
  17. /*******************************************************************************************
  18. *函数名称:led_init(void)
  19. *函数功能:四位七段数码管显示初始化
  20. *函数入口:无
  21. *函数出口:无
  22. *******************************************************************************************/
  23. void init_led(void)
  24. {
  25.    LED=segLedCode[0];
  26.    LED_CS1=0;
  27.    LED_CS2=0;
  28.    LED_CS3=0;
  29.    LED_CS4=0;
  30. }
  31. /*******************************************************************************************
  32. *函数名称:ledWrite(uchar c,uchar n,uchar mod)
  33. *函数功能:对一组数码管的某一位进行短暂显示
  34. *函数入口:c,要显示的数据;n,显示一组数码管中的第n位;mod,c的数据形式
  35. *函数出口:无
  36. *说明:当mod==DIGITAL时,c为数字0~9的ANCII码形式,此时在n位数码管上显示想用数字
  37.        当mod==CHARACTER,直接将c输出数据口
  38. *******************************************************************************************/
  39. void ledWrite(uchar c,uchar n,uchar mod)
  40. {
  41.    if(CHARACTER==mod)
  42.    {
  43.           LED=c;  
  44.    }
  45.    else if(DIGITAL==mod)
  46.            {
  47.               if((c-'0')<0x0a)
  48.                   {
  49.                     LED=segLedCode[c-'0'];
  50.                   }
  51.                   else
  52.                   {  
  53.                         LED=segLedCode[0];
  54.                   }
  55.            }
  56.    switch(n)
  57.    {
  58.                 case 0x01:
  59.                 {
  60.                   LED_CS1=0;
  61.                   delay_us(10);
  62.                   LED_CS1=1;
  63.                   break;
  64.                 }
  65.                 case 0x02:
  66.                 {
  67.                   LED_CS2=0;
  68.                   delay_us(10);
  69.                   LED_CS2=1;
  70.                   break;
  71.                 }
  72.                 case 0x03:
  73.                 {
  74.                   LED_CS3=0;
  75.                   delay_us(10);
  76.                   LED_CS3=1;
  77.                   break;
  78.                 }
  79.             case 0x04:
  80.                 {
  81.                   LED_CS4=0;
  82.                   delay_us(10);
  83.                   LED_CS4=1;
  84.                   break;
  85.                 }
  86.                 default:
  87.                   break;

  88.    }

  89. }
  90. /*******************************************************************************************
  91. *函数名称:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
  92. *函数功能:循环在数码管上显示缓冲区中的数据
  93. *函数入口:segCode,指向显示缓冲区中的指针;segCodeMod,0~7位为1或0标示1~8位数码管显示的数据的类型(DIGITAL或者CHARACTER);segNumber,代表要显示数码管的位数
  94. *函数出口:无
  95. *说明:本函数主要实现将显示缓冲区中的数据在数码管上显示出来
  96. *******************************************************************************************/                     
  97. void ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
  98. {
  99.            uchar segCount;
  100.         for(segCount=0;segCount<segNumber;segCount++)
  101.         {
  102.            if(segCodeMod&0x01)           /*1代表此处显示任意字符 */
  103.            {
  104.              ledWrite(segCode[segCount],segCount+1,CHARACTER);
  105.            }
  106.            else
  107.            {
  108.              ledWrite(segCode[segCount],segCount+1,DIGITAL);
  109.            }
  110.            segCodeMod=segCodeMod>>1;
  111.         }
  112. }
复制代码



全部资料下载(含仿真工程文件和完整代码而且经过51hei.com测试通过):
数字频率计.rar (20.4 KB, 下载次数: 98)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:487698 发表于 2020-5-29 17:28 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

板凳
ID:764636 发表于 2020-5-29 21:37 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

地板
ID:764492 发表于 2020-5-29 21:42 | 只看该作者
看晕了 ,天书一样
回复

使用道具 举报

5#
ID:868397 发表于 2020-12-29 21:47 | 只看该作者
优秀,我的设计跟这个也有关
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表