基于stm32芯片仿真的倒车测距提示系统 包含演示视频 报告 proteus仿真 keil代码 以stm32为最小系统电路进行连接,按钮控制系统开关,使用SRF04采集倒车,LM016L液晶显示屏显示汽车距离障碍物的实时距离。 当距离障碍物大于100cm时,小车自由倒退,蜂鸣器、LED提示灯关闭,车辆正常倒退;当距离障碍物大于50cm小于100cm时,蜂鸣器报警,LED灯关闭,车辆正常倒退;当距离障碍物大于30cm小于50cm时,蜂鸣器报警,LED灯闪烁提示,车辆正常倒退;当距离障碍物小于30cm时,蜂鸣器报警,LED灯关闭,小车停止。

前言

最近搞了个基于 STM32 芯片仿真的倒车测距提示系统,感觉还挺有意思的,今天就来跟大家分享一下。这个系统能实现倒车时测量车辆与障碍物的距离,并且根据不同距离给出相应提示,下面就详细说说整个系统的搭建过程。

系统概述

整个系统是以 STM32 为最小系统电路进行连接的。主要用到了按钮来控制系统开关,SRF04 超声波传感器采集倒车时与障碍物的距离,LM016L 液晶显示屏实时显示汽车与障碍物的距离。另外,还搭配了蜂鸣器和 LED 提示灯,根据不同的距离情况给出不同的提示。具体规则如下:

  • 当距离障碍物大于 100cm 时,小车自由倒退,蜂鸣器、LED 提示灯关闭,车辆正常倒退;
  • 当距离障碍物大于 50cm 小于 100cm 时,蜂鸣器报警,LED 灯关闭,车辆正常倒退;
  • 当距离障碍物大于 30cm 小于 50cm 时,蜂鸣器报警,LED 灯闪烁提示,车辆正常倒退;
  • 当距离障碍物小于 30cm 时,蜂鸣器报警,LED 灯关闭,小车停止。

Proteus 仿真

先说说 Proteus 仿真这部分。在 Proteus 里搭建好整个系统的电路,把 STM32 最小系统、按钮、SRF04 传感器、LM016L 显示屏、蜂鸣器和 LED 灯都连接好。下面是部分 Proteus 仿真图:

[此处可插入 Proteus 仿真图]

基于stm32芯片仿真的倒车测距提示系统 包含演示视频 报告 proteus仿真 keil代码 以stm32为最小系统电路进行连接,按钮控制系统开关,使用SRF04采集倒车,LM016L液晶显示屏显示汽车距离障碍物的实时距离。 当距离障碍物大于100cm时,小车自由倒退,蜂鸣器、LED提示灯关闭,车辆正常倒退;当距离障碍物大于50cm小于100cm时,蜂鸣器报警,LED灯关闭,车辆正常倒退;当距离障碍物大于30cm小于50cm时,蜂鸣器报警,LED灯闪烁提示,车辆正常倒退;当距离障碍物小于30cm时,蜂鸣器报警,LED灯关闭,小车停止。

连接的时候要注意各个引脚的对应关系,比如 SRF04 的触发引脚和回声引脚要连接到 STM32 合适的 GPIO 口,这样才能正常采集距离数据。

Keil 代码实现

接下来就是 Keil 代码部分了。下面是部分关键代码和简单分析。

初始化 GPIO 口

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);

    // 配置按钮引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置 SRF04 触发引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置 SRF04 回声引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置蜂鸣器引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置 LED 引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置 LM016L 相关引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

这段代码主要是初始化各个外设用到的 GPIO 口。不同的引脚根据其功能配置成输入或者输出模式,比如按钮是输入模式,SRF04 的触发引脚和蜂鸣器、LED 引脚是输出模式。

SRF04 测距函数

float GetDistance(void)
{
    uint32_t time = 0;
    float distance = 0;

    // 触发 SRF04
    GPIO_SetBits(GPIOA, GPIO_Pin_1);
    Delay_us(20);
    GPIO_ResetBits(GPIOA, GPIO_Pin_1);

    // 等待回声信号
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 0);

    // 开始计时
    TIM_SetCounter(TIM2, 0);
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 1);
    time = TIM_GetCounter(TIM2);

    // 计算距离
    distance = (float)time * 0.017;

    return distance;
}

这个函数用来获取 SRF04 测量的距离。先给 SRF04 一个 20us 的触发信号,然后等待回声信号。当回声信号到来时开始计时,回声信号结束时停止计时,根据计时时间和声音在空气中的传播速度计算出距离。

主函数

int main(void)
{
    float distance = 0;

    GPIO_Configuration();
    TIM_Configuration();
    LCD_Init();

    while (1)
    {
        // 读取按钮状态
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
        {
            // 系统开启
            distance = GetDistance();

            // 在 LCD 上显示距离
            LCD_DisplayDistance(distance);

            // 根据距离控制蜂鸣器和 LED
            if (distance > 100)
            {
                GPIO_ResetBits(GPIOA, GPIO_Pin_3);
                GPIO_ResetBits(GPIOA, GPIO_Pin_4);
            }
            else if (distance > 50 && distance <= 100)
            {
                GPIO_SetBits(GPIOA, GPIO_Pin_3);
                GPIO_ResetBits(GPIOA, GPIO_Pin_4);
            }
            else if (distance > 30 && distance <= 50)
            {
                GPIO_SetBits(GPIOA, GPIO_Pin_3);
                LED_Flash();
            }
            else
            {
                GPIO_SetBits(GPIOA, GPIO_Pin_3);
                GPIO_ResetBits(GPIOA, GPIO_Pin_4);
                // 小车停止代码(这里省略具体实现)
            }
        }
    }
}

主函数里先初始化 GPIO、定时器和 LCD。然后在循环里不断读取按钮状态,当按钮按下时系统开启。获取 SRF04 测量的距离,在 LCD 上显示出来,并且根据距离情况控制蜂鸣器和 LED。

演示视频

为了让大家更直观地看到系统的运行效果,我录制了一个演示视频。视频里可以看到系统在不同距离下的反应,蜂鸣器和 LED 按照规则给出相应提示。

[此处可插入演示视频链接]

报告

关于这个系统的详细报告我也整理好了,里面包含了系统的设计思路、电路连接图、代码分析、实验结果等内容。报告可以帮助大家更深入地了解整个系统的实现过程。

总结

通过这个基于 STM32 芯片仿真的倒车测距提示系统,我对 STM32 的开发有了更深入的理解,也掌握了超声波传感器、液晶显示屏等外设的使用。希望我的分享能对大家有所帮助,如果有什么问题欢迎一起交流。

以上就是整个倒车测距提示系统的介绍啦,感兴趣的小伙伴可以自己动手试试。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐