Weizhangli 2023-11-01 22:28 采纳率: 0%
浏览 7

51单片机使用超声波模块


#include <REGX52.H>

//配置超声波模块串口
sbit Trig=P1^0;
sbit Echo=P1^1;

//本程序使用超声波模块实现灯的亮灭

void Delay15us()        //@11.0592MHz,延时15us函数
{
    unsigned char i;

    i = 4;
    while (--i);
}

void Timer0Init(void)        //@11.0592MHz
{
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
    TL0 = 0;        //设置定时初值
    TH0 = 0;        //设置定时初值
}









void main()
{
    
    double time;
    double juli;
    Timer0Init();
    while(1)
    {
        Trig=0;
        Trig=1;
        Delay15us();
        Trig=0;//开始发送数据
        while(Echo==0)
            {
            //当Echo为0时说明没有接收到信号,在程序中等待
            }
            //当Echo=1时说明开始发送信号,打开计时器开启
        TR0=1;//开启计时器
        while(Echo==1)
            {
            //同理当Echo持续为高电平时,没有接收到返回的数据
            }
    //Echo=0时接收到数据
        TR0=0;
        time=((TH0*256)+TL0)*1.085;
        juli=time*0.017;
        if(juli < 10)
                {
                    P2_0=0;//led小灯
                    P2_1=1;
                }
        else
                {
                    P2_0=1;
                    P2_1=0;
                }
        TL0 = 0;        //设置定时初值
        TH0 = 0;        //设置定时初值
    }
    
    
    
}

接线没问题,为什么超声波模块只有在每次重新给电的一瞬间起作用

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-02 08:56
    关注

    【以下回答由 GPT 生成】

    根据您提供的代码,我注意到您的程序缺少了一个延时等待的部分。这可能导致超声波模块在每次重新给电的瞬间以外的时间都无法正常工作。在接收到Echo信号之前,您应该等待一段时间,以确保能够接收到正确的超声波信号。在您的代码中,可以在发送数据之后添加一个延时来等待Echo信号的到来。

    请尝试使用以下修改的代码:

    void main()
    {
        double time;
        double juli;
        Timer0Init();
        while(1)
        {
            Trig = 0;
            Trig = 1;
            Delay15us();
            Trig = 0;   // 开始发送数据
    
            // 在发送数据后加入延时等待Echo信号的时间
            Delay15us(); // 等待一段时间,确保能接收到Echo信号
    
            while(Echo == 0)
            {
                // 当Echo为0时说明没有接收到信号,在程序中等待
            }
            // 当Echo = 1时说明开始发送信号,打开计时器开启
            TR0 = 1;    // 开启计时器
            while(Echo == 1)
            {
                // 同理当Echo持续为高电平时,没有接收到返回的数据
            }
            // Echo = 0时接收到数据
            TR0 = 0;
            time = ((TH0 * 256) + TL0) * 1.085;
            juli = time * 0.017;
            if(juli < 10)
            {
                P2_0 = 0;   // led小灯
                P2_1 = 1;
            }
            else
            {
                P2_0 = 1;
                P2_1 = 0;
            }
            TL0 = 0;    // 设置定时初值
            TH0 = 0;    // 设置定时初值
        }
    }
    

    通过在发送数据后等待一段时间,您应该能够正常接收超声波模块的返回信号,并正确处理距离值。请尝试使用修改后的代码并测试您的超声波模块。

    如果问题仍然存在,您可能需要检查硬件连接、检查超声波模块的其他配置或与超声波模块厂商联系以获取进一步的支持。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月1日

悬赏问题

  • ¥20 ESP32使用MicroPyhon开发,怎么获取485温湿度的值,温湿度计使用的鞋子是Modbus RTU
  • ¥50 苹果MGIE项目部署缺少emb权重
  • ¥15 采用ansys进行机翼在特定路径下的打孔过程中的受力分析
  • ¥15 单片机adb主机连接手机,usb调试密钥无法保存
  • ¥15 已知X和Y有以下关系,求X和Y的关系式
  • ¥15 net core 同时编辑怎么防止数据多保存了
  • ¥15 matlab做ba模型让其在ba和er规则下生长
  • ¥15 请问Quartus的Verilog代码怎么写?
  • ¥100 Mac 版foxmail 收邮件问题
  • ¥15 QWebEngineView