基于STM32的倒车雷达系统设计

本文介绍了一款基于STM32F103C8T6单片机的超声波倒车雷达系统设计,系统包括超声波模块、OLED显示、键盘输入和声光报警模块。设计实现了实时测距、显示及安全距离调整功能,当距离小于预设值时,会触发声光报警。系统通过硬件和软件调试,确保了功能的正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、绪论

1.1 设计背景

1.2 设计内容

二、系统硬件设计

2.1 硬件系统框图

2.2 主控制电路

2.3 超声波电路

2.4 OLED显示电路

2.5 键盘输入电路

2.6 声光报警模块电路

三、系统软件设计

3.1 系统主程序设计

3.2 OLED显示程序设计

3.3 键盘设定程序设计

四、系统调试

4.1 硬件调试

4.2 软件调试

4.3 系统调试

五、实物测试

总结


前言

       本设计为博主利用每日闲余时间设计的小作品,有不足之处还请各位在评论区批评指正,部分内容参考来源网络资料,如有侵权请联系博主删除。

一、绪论

1.1 设计背景

        超声波测距是一种传统并且实用的测距方法,利用超声波可以非接触式测量,比起卷尺、激光或者无线电测这些更加方便,并且不存在其他因素等干扰的问题,不管在什么环境中都能正常使用,超声波具有自适应能力,并且超声波收发器成本低廉、结构简单,使用开发非常方便。超声波在各个行业领域使用的非常多,例如在工业控制方面、建筑测量方面、身高测量、声呐定位等都是利用超声波来做探测。

        由于超声波传播速度相对适中,其传播的时间也方便计算出来,通过定时发射,方向性准确,强度好控制,因此人们采用这种方式超声波测距[1]。

        超声波是一种人类听觉范围以外的一种声波,一种真实存在的波,它的传播速度非常慢,光速的万分一都不到,由于其速度传播慢,在传播过程中容易被检测捕获,超声波碰到障碍物介质时能够反射回来。超声波的传播具有方向性和可控制性,故而超声波用于很多方面,例如超声治结石、超声声呐等等,而本设计采用超声波的反射特性来用于测距设备,通过声波发出到反射接受的时间推理计算得到前方实际距离的方法实现测距。超声波技术在工业、计算机领域取得了很好的成就,并且在人们生活中普遍存在,把超声波应用到科技产品当中是开发者义不容辞的责任。

1.2 设计内容

        本设计研究出一款基于超声波的倒车雷达系统。系统采用STM32F103C8T6单片机作为主控制器, 利用超声测距的原理, 设计了一种超声波测距装置,该装置可以对前方的障碍物进行距离探测并把障碍物距离信息通过OLED显示出来。并且根据实际情况在单片机内部设置一个临界值,当通过超声波探测的距离小于临界值时,声光报警,提醒前方距离变小。可以根据声光报警提示报警,通过提示得知距离是否在正常范围,从而达到报警的目的。即本次设计的倒车雷达系统主要具有以下功能:
         1、具有实时测量距离的功能,在一定范围内实现测距,距离小于一定时,发出声光报警提示。
          2、具有实时显示功能,单位精确到厘米。
          3、安全距离可以调,可通过按键修改并保存。

二、系统硬件设计

2.1 硬件系统框图

       本设计硬件设计部分主要由以下几个模块组成:单片机最小系统、超声波模块、报警模块、OLED显示模块、键盘模块。通过这几种模块组成倒车雷达系统,单片机最小系统由复位电路和时钟电路组成。具体硬件系统框图如下图所示:

2.2 主控制电路

       设计中主控芯片采用STM32F103C8T6单片机作为主控制。该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节的闪存程序存储器,也即代码量可以写到128k字节,足够本次设计。所用STM32F103C8T6最小系统板如下图所示:

2.3 超声波电路

       超声波模块工作电压为5V,Trig为触发控制信号输入连接单片机的PC13引脚,PC13通过该引脚输出高电平信号保持10微秒以上,此时超声波模块才被使能。自动发出方波信号,经过返回,Echo为回响信号输出接口端,直接相连单片机的PA0定时器输入脚,单片机判断该I/O高电平持续的时间来得出实际的距离。本设计中超声波模块电路设计图如下图所示:

2.4 OLED显示电路

        本次采用低功耗的0.96寸OLED显示屏作为本次可穿戴设备的显示器,该OLED具有多种驱动方式,常用的方式主要有SPI和IIC驱动,本次采用IIC接口的方式,IIC只需要两根数据线即可驱动显示,使用原理简单。该模块内部不带任何字符,在显示字符、数字、汉字时都需要制作字库,因此可以显示各图案。该模块具有4个引脚,VCC接电源3.3V供电,GND接地线,SCL接STM32F103C8T6的IIC SCL脚PB6,SDA接STM32F103C8T6的IIC SDA脚PB7,如下图所示为本设计OLED电路设计图。

2.5 键盘输入电路

       本次设计采用三个独立式按键实现对安全距离值进行调整,三个按键分为设置/退出键、设置加键、设置减键。设置键按下一次后,进入安全距离值设定界面,然后才可通过设置加和设置减键进行调整。如下图、为键盘电路设计图,图中三个按键一端接公共端GND,另一端分别接单片机的I/O。三个按键接口分别接单片机的PB12、PB13、PB14引脚,当单片机的相应引脚检测到低电平时,说明该引脚被触发,从而实现相应的动作。

2.6 声光报警模块电路

        本次设计的报警系统设计采用有源蜂鸣器以及发光二极管LED实现声光报警电路,当检测到的距离小于设置好的距离时,单片机控制声光报警模块实现报警。如下图为声光报警电路设计图,由于蜂鸣器是非信号类器件,单片机的I/O不可直接进行驱动,故而利用三极管的开关作用控制蜂鸣器的开关。如图中所示,BUZZER1为蜂鸣器元件,Q1为S8550三极管,通过基极的电平状态从而控制三极管的开关,当单片机BEEP输出高电平时,三极管集电极导通,蜂鸣器通电,从而蜂鸣器发出声响,同时LED灭;当BEEP输出低电平时,三极管集电极处于截止状态,蜂鸣器没有电压从而不发声,LED亮。

三、系统软件设计

3.1 系统主程序设计

       本系统是以STM32F103C8T6单片机为核心,设计的一款基于超声波测距原理的倒车雷达系统。STM32F103C8T6是整个系统的核心部分,利用HC_SR04超声波模块作为测距模块,模块是利用声波测距进行判断前方是否达到一定距离,达到报警的效果。在单片机内部设置一个阀值,当测得的距离小于阀值时,系统进行声光报警提示,用来提示使用者前方距离小于阈值,如果前方距离保持小于该阀值时,报警块循环报警提示,直到使用者前方距离大于阈值,才退出声光提示。整体软件设计的流程图,如下图所示:

3.2 OLED显示程序设计

        本次设计采用OLED屏作为显示器,本次选用的是IIC接口,四针的OLED,通过IIC实现驱动OLED,使用方式非常简单。由上一章节可知,OLED的SDA、SCL分别接STM32的PB6、PB7,通过软件模拟IIC驱动。IIC接口包括IIC起始信号、IIC停止信号、IIC读数据、IIC写数据、IIC响应信号和非响应信号。以下为OLED读取显示数据流程图,首先进行初始化配置,初始化IIC,然后配置指令。接下来进入显示数据工作中,首先确定显示显示为坐标,然后显示字体大小等信息,然后写入显示数据。其流程图如下图所示:

3.3 键盘设定程序设计

       按键在本系统中主要起到修改安全阈值的作用,主要有设置键、设置加键、设置减键等三个。工作如下:首先在正常工作状态下,按下设置键,进入设置菜单界面,OLED显示距离下限值。此时通过按键加、按键减可对距离下限值进行修改,步进值为1cm。设置完成后再次按下设置键将会保存,再自动回到主界面实时显示距离,具体流程图如下图所示:

四、系统调试

4.1 硬件调试

        本次设计采用立创EDA设计出了PCB电路板线路图,该软件是一款高性能、开发方便的EDA软件,该软件能够完成原理图绘制和PCB设计。本次采用该软件绘制出来整个系统的电路图,以及PCB图,在设计过程中要注意以下几点:

      (1)线宽规则:地线铺铜,电源线宽大于信号线宽。

      (2)走线不能直角,尽量45度转角。

      (3)电源电路和信号电路尽量隔远。

      (4)电源线从滤波电容布线输出。

如下图为PCB板设计布线调试图。

4.2 软件调试

       软件调试主要在KEIL5 MDK平台上进行软件bug调试,通过对软件中编译的问题进行修改和调试。本次设计主控是基于STM32F103C8T6的,开发环境是基于KEIL5,通过新建工程、创建主程序、创建子程序、编译、下载调试等步骤,先写出一个小模块,然后点击编译按钮,然后增加完善到最后的理想结果。

4.3 系统调试

      最后一步就是硬件整体测试了,主要运用万用表、直流电源和示波器对焊接好的板子进行整体调试,主要检查每一个器件是不是都正常工作了,主要分为两个环节动态调试和静态调试。其中静态调试主要分为以下三种:

     1.肉眼观察。主要观看焊接点是否饱满,以及相连器件之间是否相连或者器件管脚没有焊接好,出现短路现象。

     2.使用万用表调试。首先查看电源是否短路,然后测量管脚是否连接正确,有没有接线错误。

     3.上电检查。在完成第一步和第二步都没有问题,接下来就可以上电了,上电以后观看每个器件是否正常工作,然后在逐一测试功能。

      动态调试。动态调试主要是静态调试没有任何问题,做最后一步检查,就是每个器件能否正常工作,能否满足我系统开发的功能,防止器件内部损坏,影响系统性能。

五、实物测试

     通过对本次设计的硬件电路设计,最终做出电路板,将电路各个模块进行焊接。在焊接时应该注意先后顺序,先焊接电路模块,将电路接口和电源开关焊接好后,接通电源。接下来利用万用表测试各个电源点是否正常,测试正常后进入下一步的焊接。焊接顺序按照先焊接电源和主控制单片机部分,先焊接小元件再焊接大元件的方式,最终焊接完成图样如下图所示。

    在系统板在开机后,正常运行时,OLED第一行会显示测试距离,第二行显示当前报警阈值,然后自动刷新测试距离,当所测距离小于报警阈值时,蜂鸣器会“滴滴”报警,LED指示灯会持续闪烁,直到所测距离大于报警阈值时,蜂鸣器关闭,LED指示灯停止闪烁。如下图所示为系统数据显示主界面图。在主界面下实时显示该系统所测距离的数据。如下图所示当前距离测量值为37cm,报警阈值10cm。

       在主界面上实时显示,可通过按键实现其他功能,按下切换键时,OLED将切换到阈值设置界面,如下图所示为阈值设置界面图。

      在阈值设置界面下,按下设置减键和设置加加键可以调整报警阈值,如下图所示。

总结

本次设计顺利完成预期设计功能,设计源码、PCB原理图、仿真以及实物视频等见下百度网盘链接:https://pan.baidu.com/s/1A9A7y2Or7LD7ayeCEPBTBQ?pwd=2mxa 
提取码: 2mxa 
下一期将制作基于51单片机的脉搏测量仪,创作不易,还请各位多多支持!

       

<think>好的,我现在要解决用户的问题,关于C语言编译错误#70:“incomplete type is not allowed&rdquo;。首先,我需要理解这个错误的含义以及常见原因。根据用户提供的引用资料,特别是引用[1]和[4],这个错误通常与不完整类型有关,比如数组未指定大小或者结构体未完全定义。 接下来,我应该分步骤分析可能的原因。首先,用户可能在声明数组时没有指定大小,导致编译器无法确定数组的大小,这在引用[4]中提到过。例如,如果在另一个文件中定义了数组,但在当前文件声明时没有指定大小,使用sizeof就会出错。这时候需要检查数组的声明是否正确,确保在声明时指定了大小。 然后,结构体或联合体的不完整定义也是一个常见原因。例如,如果结构体在头文件中只是前向声明而没有完整定义,在尝试访问其成员时会引发此错误。需要检查结构体的定义是否完整,特别是在多个文件中的使用情况。 另外,用户可能在函数参数中使用了不完整类型。例如,如果函数参数是一个数组但没有指定大小,或者是指向未定义结构体的指针,这也会导致错误。需要确保所有函数参数的类型都是完整的。 此外,使用未初始化的指针或动态内存分配错误也可能导致这个问题。虽然引用中没有直接提到,但作为常见错误,可能需要考虑。例如,使用malloc分配内存但没有正确指定类型大小,或者指针未正确初始化。 根据引用[3]中的例子,使用memset时如果数组类型不完整,sizeof操作符无法确定大小,导致错误。这时候需要确保数组在声明时已经指定了大小,或者在外部声明时正确引入大小信息。 总结可能的解决方案步骤:检查所有数组声明是否指定大小;确保结构体和联合体的完整定义;验证函数参数的类型是否完整;检查外部变量的声明是否正确引入大小。同时,参考用户提供的案例,特别是引用[4]中的情况,强调在跨文件使用时声明数组大小的重要性。 最后,生成相关问题,帮助用户进一步排查可能的相关问题,例如结构体定义错误、跨文件变量声明等。确保用户能够全面理解错误原因,并采取正确的解决步骤。</think>### C语言 error #70: incomplete type is not allowed 解决方案 **错误说明** 编译错误 `#70: incomplete type is not allowed` 表示代码中使用了**不完整类型**(incomplete type)。不完整类型指编译器无法确定该类型的具体大小或结构,常见于以下场景: --- ### 常见原因及解决方法 #### 1. **数组未指定大小** **问题示例**: ```c extern int arr[]; // 未声明数组大小 int len = sizeof(arr) / sizeof(arr[0]); // 编译器无法计算大小[^4] ``` **解决方案**: 在声明数组时明确指定大小: ```c extern int arr[10]; // 其他文件中定义的数组大小需与此一致 ``` **典型场景**:跨文件使用全局数组时,需在声明处指定大小[^4][^3]。 --- #### 2. **结构体/联合体未完全定义** **问题示例**: ```c struct MyStruct; // 前向声明(不完整类型) void func(struct MyStruct s) { // 错误:无法确定结构体大小[^2] s.member = 10; } ``` **解决方案**: 在使用前完整定义结构体: ```c struct MyStruct { int member; }; ``` **注意**:若结构体定义在头文件中,需确保所有使用该结构体的文件包含此头文件。 --- #### 3. **函数参数中使用不完整类型** **问题示例**: ```c void func(int arr[]) { // 等同于 int* arr,但若需使用sizeof会出错 int size = sizeof(arr); // 错误:返回指针大小而非数组大小 } ``` **解决方案**: 显式传递数组大小参数: ```c void func(int arr[], int size) { // 通过size参数操作数组 } ``` --- #### 4. **动态内存分配错误** **问题示例**: ```c struct Data* ptr = malloc(sizeof(struct Data)); // Data未定义时出错[^1] ``` **解决方案**: 先定义结构体再分配内存: ```c struct Data { int value; }; struct Data* ptr = malloc(sizeof(struct Data)); ``` --- ### 排查步骤 1. **检查数组声明**:确保所有数组在声明时指定大小(包括`extern`声明)。 2. **验证结构体定义**:检查是否在使用前完整定义了结构体/联合体。 3. **检查函数参数类型**:避免传递不完整类型的参数。 4. **查看动态内存分配**:确保类型已完整定义后再使用`sizeof`。 ---
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄情书生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值