标题: HC-SR04的询问和求解 [打印本页]

作者: HanZG    时间: 2024-12-4 12:27
标题: HC-SR04的询问和求解
    我用的是51单片机开发板,我想把HC-SR04超距检测的结果在LCD1602上显示,但数据检测很不好,总在01234这几个之徘徊。
大佬们看看我写的HC-SR04模块哪里有错误,要改进哪里:

#include <REGX51.H>
#include "Delay.h"
sbit Trig=P1^7;
sbit Echo=P1^6;



void Timer_Init()
{
        TMOD |= 0x01;
        TH0 = 0;
        TL0 = 0;
        TR0=0;
}

/*
初始化
*/

void HC_Init()
{
                Trig=0;      
                Echo=0;
                Timer_Init();
}

unsigned int HC_Getdistance()
{
        unsigned char time,distance;
        Trig=1;
        Delay10us();
        Trig=0;
      
        while(Echo==0);
        TR0=1;
        while(Echo==1);
        TR0=0;
        time=(256*TH0+TL0)*1.085;
        TH0 = 0;
        TL0 = 0;
        distance=time*17/100;
        Delay_ms(80);
      
        return distance;
}

作者: 飞云居士    时间: 2024-12-11 21:38
在 HC_Getdistance 函数内定义 unsigned char time,distance;,使用 unsigned char 类型对于时间和距离变量可能范围不够。尤其是时间变量,如果定时器计数较多,unsigned char 类型会很快溢出,导致计算出来的时间和距离都是错误的。
将 time 和 distance 变量改为 unsigned int 类型,以扩大其能够表示的数据范围,确保可以正确存储计算过程中的数值,避免出现数据溢出
作者: glinfei    时间: 2024-12-12 08:38
你这几句计算的是超声脉冲的宽度:
        while(Echo==0);
        TR0=1;
        while(Echo==1);
        TR0=0;
作者: jjy1039    时间: 2024-12-12 08:58
time=(256*TH0+TL0)*1.085; 这一行,time是无符号字符型,无符号字符最大255,th0取任意值,结果均大于255,数据溢出,同时1.085是浮点型,运算会舍弃小数部分,
distance=time*17/100;这一行,distance最大值是255,如果time大于15就会造成溢出,同时除100后是浮点型,数据类型不一致




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1