找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2366|回复: 0
收起左侧

51单片机实线0~5000hz的频率计Proteus仿真程序

[复制链接]
ID:422662 发表于 2019-11-13 14:15 | 显示全部楼层 |阅读模式
这个是本桂电学长的一个项目,分享给大家
项目地址https://github.com/lstwwa/universit

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

这个是图

这个是图

51hei.png
单片机源程序如下:
  1. /*************************************************************************
  2. *名称:频率计
  3. *说明:实现0~5000hz频率计的统计
  4. *主程序
  5. *************************************************************************/
  6. #include "target.h"
  7. #include "led.h"
  8. //#define delay_time 25000
  9. sbit bee=P2^1;
  10. sbit ledunwork=P2^3;
  11. sbit ledwork=P2^2;
  12. void INIT(void)
  13. {

  14. }
  15. uchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个
  16. const uchar displayMode=0x00;           //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示
  17. void main()
  18. {
  19.   uint get_fre;
  20.   target_init();
  21.   init_led();
  22.   sei();
  23.   while(1)
  24.   {
  25.     get_fre=get_fre_number();
  26.                
  27.         if(get_fre/1000<0x01)                                                                                    //0-1000
  28.         {
  29.         get_fre=get_fre;
  30.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  31.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  32.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  33.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  34.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  35.         ledunwork=1;
  36.         ledwork=0;
  37.         bee=1;
  38.   }
  39.         
  40.         if(get_fre/1000>=0x01&&get_fre/1000<0x02)                                                                                 //1000-2000
  41.         {
  42.                 get_fre=get_fre-85;
  43.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  44.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  45.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  46.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  47.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  48.         ledunwork=1;
  49.         ledwork=0;
  50.         bee=1;
  51.   }

  52.         if(get_fre/1000>=0x02&&get_fre/1000<0x03)                                                               // 2000-3000
  53.         {
  54.                 get_fre=get_fre-170;
  55.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  56.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  57.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  58.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  59.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  60.         ledwork=0;
  61.         ledunwork=1;
  62.         bee=0;
  63.         }
  64.         
  65.         if(get_fre/1000>=0x03&&get_fre/1000<0x04)                                                               // 3000-4000
  66.         {
  67.                 get_fre=get_fre-255;
  68.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  69.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  70.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  71.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  72.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  73.         ledwork=0;
  74.         ledunwork=1;
  75.         bee=0;
  76.         }
  77.         
  78.                 if(get_fre/1000>=0x04&&get_fre/1000<0x05)                                                               // 4000-5000
  79.         {
  80.                 get_fre=get_fre-340;
  81.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  82.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  83.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  84.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  85.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  86.         ledwork=0;
  87.         ledunwork=1;
  88.         bee=0;
  89.         }
  90.         
  91.                 if(get_fre/1000>=0x05&&get_fre/1000<0x06)                                                               // 5000-6000
  92.         {
  93.                 get_fre=get_fre-425;
  94.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  95.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  96.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  97.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  98.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  99.         ledwork=1;
  100.         ledunwork=0;
  101.         bee=0;
  102.         }
  103.         
  104.                 if(get_fre/1000>=0x06&&get_fre/1000<0x07)                                                               // 6000-7000
  105.         {
  106.                 get_fre=get_fre-510;
  107.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  108.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  109.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  110.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  111.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  112.         ledwork=1;
  113.         ledunwork=0;
  114.         bee=0;
  115.         }
  116.         
  117.                 if(get_fre/1000>=0x07&&get_fre/1000<0x08)                                                               // 7000-8000
  118.         {
  119.                 get_fre=get_fre-595;
  120.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  121.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  122.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  123.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  124.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  125.         ledwork=1;
  126.         ledunwork=0;
  127.         bee=0;
  128.         }
  129.         
  130.                 if(get_fre/1000>=0x08&&get_fre/1000<0x09)                                                               // 8000-9000
  131.         {
  132.                 get_fre=get_fre-680;
  133.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  134.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  135.   displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
  136.         displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
  137.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  138.         ledwork=1;
  139.         ledunwork=0;
  140.         bee=0;
  141.         }
  142.         
  143.         
  144.         
  145.         if(get_fre/1000>=0x09)                                                                                  //>9000
  146.         {
  147.         get_fre=get_fre-765;
  148.         displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
  149.         displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
  150.   displayBuff[2]=(get_fre%100)/10+'0';         //计算频率十位,放在缓冲区第2位
  151.         displayBuff[3]=get_fre%10+'0';                  //计算频率个位,放在缓冲区第3位
  152.   ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
  153.         ledunwork=1;
  154.         ledwork=0;
  155.         bee=0;
  156.         }
  157.         


  158.         }        

  159. }
复制代码
51hei.png
51hei.png
仿真工程有2个错误:
基于89c51的频率计.zip (301.96 KB, 下载次数: 31)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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