Featured image of post JSN SR04T超声波测距

JSN SR04T超声波测距

JSN-SR04T超声波测距

JSN-SR04T-V3.3 Datasheet - Original.pdf

数据手册(模式0)

  • 参数

image-20260328010000613

  • 功能

image-20260328010118704

  • 模式

image-20260328020412880

jsn-sr04t.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "jsn-sr04t.h"


// ==============================================
// 函数功能:超声波初始化
// ==============================================
void JSN_SR04T_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    // 使能 GPIO 和定时器时钟
    RCC_APB2PeriphClockCmd(TRIG_RCC | ECHO_RCC, ENABLE);
    RCC_APB1PeriphClockCmd(TIM_RCC, ENABLE);

    // TRIG 引脚:推挽输出
    GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(TRIG_PORT, &GPIO_InitStructure);
    GPIO_ResetBits(TRIG_PORT, TRIG_PIN);

    // ECHO 引脚:浮空输入
    GPIO_InitStructure.GPIO_Pin = ECHO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(ECHO_PORT, &GPIO_InitStructure);

    // TIM2 配置:1us 计数一次
    TIM_TimeBaseStructure.TIM_Period = 65535;
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
}

// ==============================================
// 函数功能:获取距离
// 计算公式:cm = 时间(us) / 57.5
// 返回值:距离(单位:cm)
// ==============================================
float JSN_SR04T_GetDistance(void)
{
    uint32_t time = 0;
    uint32_t timeout = 0;  // 超时计数器
    float distance = 0;

    // 发送 12us 触发信号
    GPIO_SetBits(TRIG_PORT, TRIG_PIN);
    Delay_us(12);
    GPIO_ResetBits(TRIG_PORT, TRIG_PIN);
		
	//等待ECH0为高电平,如果从发送高电平后,40ms后就出错退出
	  timeout = 0;
    while(GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == 0)
    {
        timeout++;
        Delay_us(1);
        if(timeout > 40000)  // 40ms 超时
        return -1;
    }

		//开始计时
		TIM_SetCounter(TIM2, 0);
    TIM_Cmd(TIM2, ENABLE);

		//等待ECHO低电平,超时40ms
		timeout = 0;
    while(GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == 1)
    {
        timeout++;
        Delay_us(1);
        if(timeout > 40000)  // 40ms 超时
        return -1;
    }


    time = TIM_GetCounter(TIM2);
    TIM_Cmd(TIM2, DISABLE);

    // 距离换算:cm = 时间(us) / 57.5
    distance = (float)time / 57.5;

    // 有效范围判断
    if(distance > 400)
    return -1;

    return distance;
}

// ==============================================
// 函数功能:获取实际水深
// 计算公式:水深 = 安装总高度 - 测得距离
// 返回值:距离(单位:cm)
// ==============================================
float Get_Water_Depth(float date)
{
	return FIXED_DISTANCE - date;
}

jsn-sr04t.h

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef __JSN-SR04T_H
#define __JSN-SR04T_H

#include "stm32f10x.h"
#include "delay.h"

// 宏定义固定距离
#define FIXED_DISTANCE    200.0f

// 引脚配置
#define TRIG_PIN    GPIO_Pin_3
#define TRIG_PORT   GPIOA
#define ECHO_PIN    GPIO_Pin_2
#define ECHO_PORT   GPIOA

// 时钟使能
#define TRIG_RCC    RCC_APB2Periph_GPIOA
#define ECHO_RCC    RCC_APB2Periph_GPIOA
#define TIM_RCC     RCC_APB1Periph_TIM2

// 函数声明
void JSN_SR04T_Init(void);
float JSN_SR04T_GetDistance(void);
float Get_Water_Depth(float date);

#endif
最后更新于 2026-03-28 13:56
...