我用STC12单片机控制霍尔传感器测速度,我这C程序哪里有问题了?一部分。
voidtime1(){if(D1)//判断是否高电平{TR0=1;//启动定时器计时num++;//计算脉冲个数while(D1);//等待,计算一个脉冲的时间TR0=...
void time1()
{
if(D1) //判断是否高电平
{
TR0 = 1; //启动定时器计时
num++; //计算脉冲个数
while(D1); //等待,计算一个脉冲的时间
TR0 =0;
th1 = TH0; //读高位值
th2 = TL0; //读低位值
time = (th1+th2)/1000000; //读取时间
v = 2/time; //算出速度
gewei = table[v%10];
shiwei = table[v%100/10];
baiwei = table[v/100];
qianwei = table[v/1000]; //关闭定时器0
}
在1602液晶显示屏上的速度显示一直是255,这是怎么回事?求助,谢谢! 展开
{
if(D1) //判断是否高电平
{
TR0 = 1; //启动定时器计时
num++; //计算脉冲个数
while(D1); //等待,计算一个脉冲的时间
TR0 =0;
th1 = TH0; //读高位值
th2 = TL0; //读低位值
time = (th1+th2)/1000000; //读取时间
v = 2/time; //算出速度
gewei = table[v%10];
shiwei = table[v%100/10];
baiwei = table[v/100];
qianwei = table[v/1000]; //关闭定时器0
}
在1602液晶显示屏上的速度显示一直是255,这是怎么回事?求助,谢谢! 展开
展开全部
溢出了,time是什么类型?如果是整形变量的话,肯定time=0, 因(th1+th2)不超过511
除1000000结果是0,0不能当除数
正确的是 (th1*256+th2),即使如此,time也不超过65535
所以绝对不能除1000000
如果算速度的话,可以v = 2000000/time; V要是长整型(long int)
当然,time和 v可以取FLOAT 型,但送数码管显示不方便
还有计数器用之前要清0,不知你主程序里清了吗.
除1000000结果是0,0不能当除数
正确的是 (th1*256+th2),即使如此,time也不超过65535
所以绝对不能除1000000
如果算速度的话,可以v = 2000000/time; V要是长整型(long int)
当然,time和 v可以取FLOAT 型,但送数码管显示不方便
还有计数器用之前要清0,不知你主程序里清了吗.
更多追问追答
追答
脉冲频率高的话测单位时间内脉冲个数,
脉冲频率低的话直接测单个脉冲持续时间
假设用第二种方法:
计数器只用一个,假设用计数器0
测量程序如下:
void time1()
{
while(D1==1);//等待眼前高电平过去,因你遇到高电平时,可能高电平已持续一段时间了
while(D1==0););//等待低电平过去
TR0 = 1; //高电平已来到,启动定时器计时
while(D1); //等待高电平结束,计算一个脉冲的时间
TR0 =0;; //关闭定时器0
time = (TH0*256+TL0) //读取时间
v = 2*1000000/time; //算出速度
gewei = table[v%10];
shiwei = table[v%100/10];
baiwei = table[v/100];
qianwei = table[v/1000];
TH0=0;//清 0,为下一次计数作准备
TL0=0;
}
主程序:
初始化;//定时器不需中断
while(1)
{
time1();
display();
}
不知你的脉冲占空比是否是50%,要不是的话,算转速时乘2是不对的
那就要算一个完整周期的时间了
还有测量范围,保证计数器不会溢出,还有4位数码管足够完全显示
(液晶屏可显示多位 但你只用了4位)
即速度高的话,数码管/液晶屏显示会溢出,速度低的话,定时器/计数器会溢出
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询