找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机周频法测频率计

[复制链接]
跳转到指定楼层
楼主
ID:372353 发表于 2018-7-16 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "reg52.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define ulong unsigned long
  5. sfr AUXR=0x8E;
  6. sfr T2H=0xD6;   
  7. sfr T2L=0xD7;
  8. sfr IE2=0xAF;
  9. bit flag=0,new=0,old=1;
  10. uchar code DM[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
  11. uchar code WM[]={0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80};
  12. uchar buf[8],num,num0=0;
  13. ulong g_time,time;
  14. ulong nhz,all,nhz0;
  15. ulong buf0[4]={0};
  16. double nhz1;
  17. void SEL_INIT()
  18. {
  19.   P2=(P2&0x1f)|0x80;
  20.   P0=0xff;
  21.   P2=(P2&0x1f)|0xa0;
  22.   P0=0x00;
  23.   P2 &=0x1f;
  24. }
  25. void T0_ISR() interrupt 1
  26. {
  27.    static uchar i=0;  
  28.    if(flag==0)
  29.    {
  30.      TH0=0xff;
  31.      TL0=0xff;
  32.          if(i==5)
  33.     {
  34.      TH1=0;
  35.             TL1=0;
  36.             TR1=1;
  37.          ET1=1;
  38.          num0=0;
  39.     }
  40.      if(i==6)
  41.     {
  42.             time=num0*65536+256*TH1+TL1;
  43.          nhz1=1000000000/time;
  44.          nhz1 =nhz1*1.01908;         
  45.          nhz=nhz0=(ulong)nhz1;
  46.          nhz /=1000;                    
  47.          TR1=0;
  48.          ET1=0;
  49.          TH1=0;
  50.             TL1=0;
  51.          num0=0;
  52.     }
  53.      if(++i>9) i=0;
  54.    }
  55.    else  num++;
  56. }
  57. void T1_ISR()interrupt 3
  58. {
  59.     num0++;
  60. }
  61. void T2_ISR() interrupt 12
  62. {
  63.     static uchar k,i=0;
  64.     char j=7,l;
  65.     P2=(P2&0x1f)|0xc0;
  66.     P0=0x00;   
  67.     P2=(P2&0x1f)|0xe0;
  68.     if(flag==0&&i==4)
  69.         P0=DM[buf[i]]&0x7f;
  70.         else
  71.         P0=DM[buf[i]];
  72.     P2=(P2&0x1f)|0xc0;
  73.     P0=WM[i];
  74.     if(++i>7) i=0;
  75.         if(++g_time>499)
  76.    {
  77.       if(flag)
  78.           {
  79.             nhz=num*65536+256*TH0+TL0;
  80.             nhz *=1.00176;
  81.             TR0=0;         
  82.             TH0=0;
  83.             TL0=0;
  84.             num=0;         
  85.         nhz0=nhz;
  86.           }
  87.           buf0[k]=nhz0;
  88.           if(++k>2) k=0;
  89.           all=0;
  90.           for(l=0;l<3;l++)        all +=buf0[l];
  91.           nhz0=all/3;
  92.           while(nhz0)
  93.           {
  94.            buf[j--]=nhz0%10;
  95.            nhz0 /=10;
  96.           }         
  97.           for(;j>-1;j--) buf[j]=0;
  98.           g_time=0;
  99.             if(flag) TR0=1;
  100.    }
  101. }   
  102. void T_INIT()
  103. {
  104.   TMOD=0x15;
  105.   TH0=0xff;
  106.   TL0=0xff;
  107.   TL1=0x00;               
  108.   TH1=0x00;
  109.   ET0=1;
  110.   TR0=1;
  111.   AUXR &= 0xFB;                //定时器时钟12T模式
  112.   T2L = 0x30;                //设置定时初值
  113.   T2H = 0xF8;                //设置定时初值
  114.   AUXR |= 0x10;                //定时器2开始计时
  115.   IE2 |=0x04;
  116.   EA=1;
  117. }
  118. void main()
  119. {
  120.   SEL_INIT();
  121.   T_INIT();
  122.   while(1)
  123.   {
  124.      if(nhz<2000) flag=0;
  125.          else flag=1;
  126.          new=flag;
  127.          if(new!=old)
  128.            {
  129.            old=new;
  130.            if(flag)                 //1测频
  131.            {
  132.                     TH0=0;
  133.          TL0=0;           
  134.            }
  135.            else                  //0测周
  136.            {
  137.          TH0=0xff;
  138.                    TL0=0xfe;
  139.                   TL1=0x00;               
  140.                   TH1=0x00;
  141.                  num0=0;           
  142.            }

  143.          }
  144.   }
  145. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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