找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的等精度频率计Proteus仿真程序设计

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1.    /*等精度plj*/
  2.    #include<at89x52.h>
  3.    #define uchar unsigned char
  4.    #define uint  unsigned int
  5.    #define ulong  unsigned  long
  6.    #define duan                P0    //段驱动
  7.    #define wei      P2    //位扫描
  8.    #define shuju    P1    //外部取数据
  9.    sbit clear=P3^7;  //清除外部数据
  10.    sbit on=P3^6;  //闸门信号
  11.    uchar  code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0,1,2,3,4,5,6,7,8,9字型码
  12.    uchar  weixuan[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c};
  13.    int    output[8];      //待显示的输出BCD码
  14.    uchar  shuju2;         //外部计数器接收缓存
  15.    ulong  jz;             //基准
  16.    ulong  js;                          //计数
  17.    ulong  huancun;        //缓存
  18.    bit cs;                //允许数据更新标志位
  19.    int i;

  20.    //短延时
  21. void delay(uchar time)
  22.    {
  23.       for(;time!=0;time--);
  24.    }

  25.    //长延时
  26. void  ldelay()
  27.    {
  28.       uint dd=1100;
  29.           while(dd--);
  30.    }



  31.    //八位扫描显示子程序
  32. void  display(ulong p)
  33.    {
  34.                                 output[7]=smgduan[p%100000000/10000000];
  35.                                 output[6]=smgduan[p%10000000/1000000];
  36.                                 output[5]=smgduan[p%1000000/100000];
  37.                                 output[4]=smgduan[p%100000/10000];
  38.                                 output[3]=smgduan[p%10000/1000];
  39.                                 output[2]=smgduan[p%1000/100];
  40.                                 output[1]=smgduan[p%100/10];
  41.                                 output[0]=smgduan[p%10];
  42.                                 for(i=0;i<8;i++)
  43.                                 {
  44.                                    wei=0xff;
  45.                                    wei=weixuan[i];
  46.                                    duan=output[i];
  47.                                    delay(100);
  48.                                    wei=0xff;
  49.                                 }
  50.    }



  51. void  main()
  52.    {
  53.        on=0;                 //闸门关闭
  54.            clear=1;                 //计数器清零
  55.            clear=0;                 //清零关闭

  56.            TMOD=0x55;
  57.           
  58.            EA=1;

  59.            EX1=1;
  60.            IT1=1;

  61.            ET0=1;
  62.            ET1=1;
  63.           
  64.            TR1=1;
  65.            TR0=1;

  66.            on=1;                  //闸门开启

  67.            while(1)  
  68.                  {         
  69.                         display(huancun);

  70.                         if(cs)                    //闸门关闭时处理数据
  71.                         {
  72.                             cs=0;

  73.                                 shuju2=shuju;
  74.                                 huancun=TH0;
  75.                                 huancun<<=8;
  76.                                 huancun+=TL0;
  77.                                 huancun<<=4;
  78.                                 huancun+=(shuju2&0x0f);
  79.                                 js+=huancun;

  80.                                 huancun=TH1;
  81.                                 huancun<<=8;
  82.                                 huancun+=TL1;
  83.                                 huancun<<=4;
  84.                                 huancun+=(shuju2>>4);
  85.                                 jz+=huancun;

  86.                                 huancun=(float)js/(float)jz*24000000;
  87.                 display(huancun);

  88.                                 jz=0;
  89.                                 js=0;
  90.                                 TH0=0;
  91.                                 TL0=0;
  92.                                 TH1=0;
  93.                                 TL1=0;
  94.                                 clear=1;
  95.                                 clear=0;
  96.                                 on=1;
  97.                         }
  98.                         else
  99.                         {
  100.                                ldelay();   //处理数据时间补偿  防止闪烁
  101.                         }
  102.                   }
  103.    }




  104. //定时器0
  105. void   jsq0() interrupt 1 using  2
  106.           {
  107.              js+=0x000001;
  108.                  if(js>=0xc00000)
  109.                  {
  110.                     on=0;     //关闭闸门
  111.                  }
  112.           }


  113. //等精度计数结束,允许处理数据
  114. void   end()   interrupt 2 using 1        //外部中断1
  115.          {
  116.             cs=1;
  117.          }

  118. //定时器1
  119. void         jsq1()  interrupt 3 using  3
  120.           {
  121.              jz+=0x000001;
  122.                  if(jz>=0xc00000)
  123.                  {
  124.                     on=0;     //关闭闸门
  125.                  }
  126.           }
复制代码

所有资料51hei提供下载:
频率计.zip (157.89 KB, 下载次数: 50)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:780349 发表于 2020-6-16 00:57 | 只看该作者
学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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