找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 776|回复: 3
打印 上一主题 下一主题
收起左侧

HC-SR04的询问和求解

[复制链接]
跳转到指定楼层
楼主
ID:1138258 发表于 2024-12-4 12:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    我用的是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;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404160 发表于 2024-12-11 21:38 | 只看该作者
在 HC_Getdistance 函数内定义 unsigned char time,distance;,使用 unsigned char 类型对于时间和距离变量可能范围不够。尤其是时间变量,如果定时器计数较多,unsigned char 类型会很快溢出,导致计算出来的时间和距离都是错误的。
将 time 和 distance 变量改为 unsigned int 类型,以扩大其能够表示的数据范围,确保可以正确存储计算过程中的数值,避免出现数据溢出
回复

使用道具 举报

板凳
ID:844772 发表于 2024-12-12 08:38 | 只看该作者
你这几句计算的是超声脉冲的宽度:
        while(Echo==0);
        TR0=1;
        while(Echo==1);
        TR0=0;
回复

使用道具 举报

地板
ID:92781 发表于 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后是浮点型,数据类型不一致
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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