Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4
580 字
3 分钟
超声波相关功能解析
  • 板子设置

    使用超声波模块时,要将J2的1-3和2-4口用跳线帽连接起来

  • 原理

    3985b3e5ed390079bcb82b42a14d68b.webp

  • 底层代码

    #include <ultrasound.h>
    #include "intrins.h"
    sbit Tx = P1 ^ 0;
    sbit Rx = P1 ^ 1;
    void Delay12us() //@12.000MHz
    {
    unsigned char i;_nop_();
    _nop_();
    i = 38; //这里软件生成的数值要改成38
    while (--i)
    ;
    }
    void Ut_Wave_Init() // 超声波初始化函数 产生8个40Mhz的方波信号
    {
    unsigned char i;
    EA=0;//关闭总中断
    for (i = 0; i < 8; i++)
    {
    Tx = 1; //发送信号
    Delay12us();//由isp软件自动生成
    Tx = 0;
    Delay12us();
    }
    EA=1;//开启总中断
    }
    unsigned char Ut_Wave_Data() // 超声波距离读取函数
    {
    unsigned int time; // 时间储存变量
    CMOD = 0x00; //使用PCA定时器,设置为16位不重载
    CH = CL = 0; // 复位计数值 等待超声波信号发出
    Ut_Wave_Init(); // 发送超声波信号
    CR = 1; // 开始计时
    while ((Rx == 1) && (CF == 0)); // 等待返回信号消失或者定时器溢出
    CR = 0; // 停止计时
    if (CF == 0) // 定时器没有溢出 //因为计数溢出后CF自动置1
    {
    time = CH << 8 | CL; // 读取当前时间
    return (time * 0.017 + 3); // 返回距离值,注意+3是减小测量误差
    //如果设置介质中的速度是可以改变的
    //那么就,return ((unsigned long)(time/2)*(speed * 100)) / 1000000 +3;
    //这个公式就是照着上面的原理写成的(单位m->cm,单位s->us)
    //注意这个(unsigned long)强制转换为长类型变量,
    //这是因为/1000000已经超出unsigned int的最大长度,要用更大的变量类型才行
    //也可以直接把100和1000000先结合,return (time/2)*speed)/10000+3;
    //还要注意,如果speed的速度超出一定值,return的值就超出256的界限
    //这是函数返回类型就应该从unsigned char 改为 unsigned int
    }
    else
    {
    CF = 0; // 清除溢出标志位
    return 0;
    }
    }
  • 函数调用

    提前定义变量:unsigned char Dis_value; 在数据读取模块。Dis_value = Ut_Wave_Data(); 这样Dis_value 就显示这测得的距离值

  • 注意事项

    蓝桥杯单片机超声波测距的最大距离大概是130cm左右,并且在测距过程中,板子附近尽量不要遮挡物体,否则会导致测量出问题。

超声波相关功能解析
https://mizuki.mysqil.com/posts/蓝桥杯单片机/超声波相关功能解析/
作者
风过无痕
发布于
2025-11-08
许可协议
CC BY 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00