OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3219|回复: 0

频率计不稳定问题

[复制链接]

4

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-5-16
在线时间
7 小时
发表于 2016-6-2 14:25:41 | 显示全部楼层 |阅读模式
下面为我用中断写的一个频率计,实物测试时显示不稳定。因此想采用平均处理,每测试100次取平均值后显示一次,该怎么改
#include<STC12.h>   
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
uchar m=0;
uchar u;
uint i;
uint x;
uint c;               
float t0,f;
uint a[]={70,61,48,48,48,48,72,90};

sbit RW=P2^6;
sbit RS=P2^5;
sbit EN=P2^7;
/////////////////LCD1602的设置//////////////////////////////////
void delay(uint s)//延时1MS
{
  uint r,g;
   for(r=s;r>0;r--)
     for(g=200;g>0;g--);
}
void write_com(uchar com) // 写指令
{  
delay(1);
RS=0;
RW=0;
EN=0;
P0=com;
delay(1);
EN=1;
delay(1);
EN=0;      
}
void write_data(uchar date) // 写数据
{  
  delay(1);;
RS=1;
RW=0;
EN=0;
P0=date;
delay(1);
EN=1;
delay(1);
EN=0;      
}
void display(unsigned char *p)//显示//
{
  while(*p!='\0')
{
   write_data(*p);
   p++;
   delay(1);
}
}

void initlcd()//初始化
{
  delay(15);
write_com(0x38);
delay(5);
write_com(0x08);delay(5);
write_com(0x01);delay(5);
write_com(0x06);delay(5);
write_com(0x0c);delay(5);
}

////////////LCD1602设置///////////////
///////////定时器的设置//////////////
void CT_init()     //定时计数器初始化
{        TMOD=0x99; //GATE=1,T0工作在方式1,定时方式
          TH0=0;    //定时计数器初值清零
          TL0=0;
          TR0=1;    //TR0置位,此时定时计数器的启动有INT0引脚电平决定
          ET0=1;    //开中断
}
void ITC0() interrupt 0   //外部中断0服务程序
{
        u=m;//读定时计数器0溢出次数
        m=0;//溢出次数清零
        x=TH0*256+TL0; //读定时计数器0当前值
        TH0=0;  //定时计数器0清零
        TL0=0;
}
void TIME0() interrupt 1  //定时计数器0溢出中断
{
        m++;  //溢出次数加1
}

void main()
{
   delay(1000);
   initlcd();  //液晶显示初始化
         CT_init();//定时计数器初始化
     EA=1;//开总中断
     EX0=1;//允许外部中断
     IT0=1;//设置外部中断方式为下降沿触发
     P3=0xff;     
while(1)
{        
        t0=u*65536+x;//计算脉冲时间宽度
        f=22100000/(t0*12*2); //计算频率
                c=f;
                a[5]=c%10+48;
                a[4]=(c/10)%10+48;
                a[3]=(c/100)%10+48;
                a[2]=(c/1000)%10+48;       
        write_com(0xc0);
for(i=0;i<=7;i++)
{
        write_data(a[i]);
        delay(10);
}
}
}                        


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 15:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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