微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 各位亲们,小弟用外部中断写了一个频率计

各位亲们,小弟用外部中断写了一个频率计

时间:10-02 整理:3721RD 点击:
大大们:小弟用外部中断写了一个频率计,现在精度不是很高,怎么提高精度?还是程序写的不够完善,请指教
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit dula=P2^6;
sbit wela=P2^7;
uint num1,num2,temp;
uchar sw,wan,qian,bai,shi,ge;
void delayms(uint xms)
{ uchar i,j;
        for(i=xms;i>0;i--)
           for(j=110;j>0;j--);
}

void display()
{ dula=1;
  P0=table[sw];
  //delayms(100)
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x7e;
  wela=0;
  delayms(1);
  dula=1;
  P0=table[wan];
  //delayms(100)
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x7d;
  wela=0;
  delayms(1);
  
  dula=1;
  P0=table[qian];
  //delayms(100)
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x7b;
  wela=0;
  delayms(1);
  dula=1;
  P0=table[bai];
// delayms(100)
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x77;
  wela=0;
  delayms(1);
  dula=1;
  P0=table[shi];
  //delayms(100)
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x6f;
  wela=0;
  delayms(1);
  dula=1;
  P0=table[ge];
  //delayms(100)
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x5f;
  wela=0;
  delayms(1);
                
}
void main()
{  num1=0;
   num2=0;
   TMOD=0x02;
        TH0=6;
        TL0=6;
        EA=1;
        ET0=1;
        TR0=1;
        EX0=1;
        IT0=1;
       
  while(1)
{ if(num1==3686)
        {EX0=0;
     num1=0;
         temp=num2;
     sw=temp/100000;
     wan=temp%100000/10000;
     qian=temp%10000/1000;
     bai=temp%1000/100;
     shi=temp%100/10;
     ge=temp%10;
     display();
    //delayms(1000);
         num2=0;
         EX0=1;
         }
}
}

void T0_time() interrupt 1
{ num1++;
}

void INTO_time() interrupt 0
{num2++;}

多次取值求平均试试, 什么中值滤波算法之类的,你也试一下..... 外部中断输入是方波么? 中断触发选择是边缘么(对不起,不了解51), 还有外部电路加个上拉或者下拉电路之类的减少干扰。看你的算法是,在一定时间之类求获取采集到的次数, 那你试试单个采集所需要的时间 这种算法... 还有就是检查下晶振的误差大么

谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top