C51单片机测频出现负值

编程入门 行业动态 更新时间:2024-10-13 20:21:39

C51单片机测频出现<a href=https://www.elefans.com/category/jswz/34/1652448.html style=负值"/>

C51单片机测频出现负值

       继之前做课设帮助同学的频率计进行测试(采用的是STC89C52)无意中测试出个Bug,个人代码问题,仅供参考。现象如下:配置定时器0中断定时20ms一次进入中断,定时器1中断外部计数1000次。当测试50KHz的时候LCD1602上出现了一个负值,别的频率都是正确的。

于是开始如下的尝试:
1) 分析一下首先我的频率变量定义的是unsigned long类型,所以应该是在转换字符出了问题,我使用的是库函数sprintf,发现是输出格式的问题,一开始使用的是%ld,后面改正成了%lu,没有显示负数,但是显示了一个超大的数值。因为没有找到根本原因。
sprintf(F,"%lu",pulse);

2) 因为其他频率都显示正常,因此将问题锁定在中断处理程序上(一开始进入一个死胡同,我一直以为定时器1是定时1000us,后面休息了下才发现,外部计数,哪有什么计时多久的说法。)这样的话一分析,就知道了当测50KHz的时候定时器1和定时器0中断都是定时20ms时进入,至于先进入哪一个就不能确定了。我的思路是定时器1外部计数,每计1000次进入一次中断脉冲数加1000,当定时1S到时将定时器1外部计数的值读取出来与脉冲相加即可得到频率。
void Timer1Interrupt(void) interrupt 3 
{ TH1 = 0x0fc;TL1 = 0x18;//add your code here!pulse+=1000;}void count() interrupt 1 //20ms
{EA = 0;          //TH0 = 0xb1;		//设置定时初值TL0 = 0xe0;		//设置定时初值count_T++;if(count_T == 50){data_h = TH1 ;data_l = TL1 ;pulse += ((unsigned int)(data_h<<8) | data_l) - 64536; //计数小于1000的脉冲TH1 = 0x0fc;TL1 = 0x18;count_T = 0;Mode = 0;}
}

        一开始的时候没有在定时器0中断里加`EA=0;`这条语句,假设测50KHz时,先进入定时器0中断,而此时定时器1还在外部计数,这样的话定时器1的计数器没有重装,于是从0开始计数,此时导致出现巨大数值的语句就是
pulse +=((unsigned int)(data_h<<8)|data_l) - 64536;

        在这样分析之后发现其实可以更改中断优先级来达到目的,不过建议还是在取定时器的计数值的时候还是把中断关了比较好,至少可以保证一定的精度。

更多推荐

C51单片机测频出现负值

本文发布于:2024-02-27 15:14:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1707070.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:负值   单片机   频出

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!