一个简单的51单片机小程序,高手给分析一下什么错误?

来源:百度知道 编辑:UC知道 时间:2024/05/22 14:04:43
我做了一个测脉冲个数的小程序,此段程序放在定时器T0中
3个变量 PF_IN是外部脉冲输入输入引脚
PUL是标志位
count是脉冲个数

if(PF_IN==0) PUL=1; //如果是低电平,标志位置1
if(PUL&PF_IN) //如果上升沿到来,脉冲数加1
{
count++;
PUL=0;
}
我在T0中计了3秒的脉冲数,以上程序计出来的脉冲数在0-5之间跳动,搞不明白了,本人初学,若有高人指点一二不胜感激。
谢谢楼下的解答,我一开始是用外部中断计的数,但数据跳动很大。我怀疑是中断优先级导致计时不准造成的,
请问有没有这种可能

谢谢2楼,脉冲频率大约700HZ,定时器中断为1ms。

把计脉冲数的那一小段也写出来。
ms++; //计时变量
if(ms>=3000) //显示3秒的脉冲数
{
ms=0;
real=count; //将脉冲数送给显示变量
count=0;
}
谢谢3楼的,不知在中断函数中怎么判断处理呢?

你的定时器中断多长时间一次?脉冲频率是多少?

你把判定程序放在定时器中断里面,那么每次定时到了才判定的。如果脉冲频率太快会丢失的。

建议用外部中断。中断一定要用边沿触发,比较准确的。

/*-----------------------------
外部中断0处理程序
--------------------------------*/
void INT0_Pro(void) interrupt 0 using 1
{
count++;
/*count定义为无符号整形变量:unsigned int,这里可以加上延时判断,避免脉冲干扰(也可以不考虑这个问题)。这样,一个下降沿出现在外部0中断引脚的时候就计数一次*/
}

定时器里面计数3秒后,直接取用count的值就行了,用完了清零,进行下一轮计数.
记得先开启中断,还有IT0=1;(外部0设置为边沿触发)

还有,检查一下显示程序,是不是计算译码弄错了。

建议采用中断来接收外部的脉冲数,采用边沿触发中断。有中断时,在中断程序中加1。

当然你这种方法也可以用,但
if(PUL&PF_IN) //如果上升沿到来,脉冲数加1
改为 if(PUL&&PF_IN) 更好些,这只是建议。

你这种计量方式非常不准确,即使成功做出来,误差也很大,建议用外部中断处理,至于出现数据量跳动的问题,可能是由于你的电路板问题造成信号的扰动,可以在外部中断的处理函数中再进行判断处理
一般判断处理是进入中断,延时一个合理的时间,一般几个微秒,然后再判断一下此引脚的电平,如果满足中断,则进入处理程序,如果是干扰则跳出中断