矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2659|回复: 4

看我的测频率程序,数值乱跳是哪出错

[复制链接]
     
发表于 2018-5-27 21:29:27 | 显示全部楼层 |阅读模式
/****************************
用周期法测频率
stc89c52RC
时钟:12M
现象:仿真下,通电第1秒显示频率值正常,但显示值1秒1次不停地跳,不知原因。
******************************/
//主函数里
int main()
{
        //其它省略
        unsigned int freq = 0;
        while(1)                                               
        {
                if(t0_ms == 2)                                        //主函数里,1秒读1次频率值
                {       
                        freq = getfrequency();                       
                }       
                LED_Display(freq);                                //数码管显示频率值
        }
}

/***************读取频率函数,返回频率**********************/
unsigned int getfrequency()
{       
        unsigned int f = 0;
        long TPluse = 0;                                        //暂存n个脉冲周期的时间
       
        if(pluseOver)                                        //取8个脉冲结束后读时间
        {
                pluseOver = 0;                               
                TPluse = TH1;
                TPluse = (TPluse<<8) + TL1;
                TPluse += nCycle*65536;                //nCycle 是T1定时器溢出的次数
                TPluse >>= 3;                                //取8次脉冲平均

                if(TPluse != 0)
                {
                        f = 1000000/TPluse;               
                }
                EX0 = 1;                                          //处理完后才允许输入中断,进行下一次测量
          }

        return f;        
}

void EX0INT() interrupt 0
{                       
        static char a = 0;

        if(a == 0)
        {
                TH1 = 0;
                TL1 = 0;
                nCycle = 0;                //定时器溢出的次数
                TR1 = 1;
        }  
        a++;
        if(a == 9)                                //取8次再平均
        {       
                a=0;          
                TR1 = 0;
                EX0 = 0;
                pluseOver = 1;
        }
}
     
发表于 2018-5-28 10:53:30 | 显示全部楼层
nCycle = 0;                //定时器溢出的次数

何时增加?
回复 支持 反对

使用道具 举报

     
发表于 2018-5-28 11:03:26 | 显示全部楼层
  freq = getfrequency();   每一秒被呼唤一次

其中 if(pluseOver)...  的做法 是期望不断被呼唤





请改為试试

void getfrequency()...

                if(TPluse != 0)
                {
                        freq = 1000000/TPluse;     // 有效才更新           
                }


//主函数里
int main()
{
        //其它省略
        unsigned int freq = 0;
        while(1)                                                
        {
                getfrequency();  
                LED_Display(freq);                                //数码管显示频率值
        }
}
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-5-28 19:26:47 | 显示全部楼层
raysin 发表于 2018-5-28 11:03
freq = getfrequency();   每一秒被呼唤一次

其中 if(pluseOver)...  的做法 是期望不断被呼唤

谢谢回复 ,这样修改 ,试了不行
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-5-28 19:41:30 | 显示全部楼层
忘了说了, 如果把下面语句放在外部中断0里 , 一切都正常的 ;只是都说中断程序要简短,才试图放在外面,结果有问题。
TPluse = TH1;
  TPluse = (TPluse<<8) + TL1;
  TPluse += nCycle*65536;  //脉冲间隔的时间,us
  TPluse >>= 3;    //取8次总时间平均
  if(TPluse != 0)
  {
   f = 1000000/TPluse;  
  }
  EX0 = 1;         
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 00:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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