基于STC89C52的超声波雷达系统 - 详细设计文档
写在前面:如果有实物制作交流诉求,欢迎私聊
文章目录
- 基于STC89C52的超声波雷达系统 - 详细设计文档
- 前言
- 0.实物展示与运行演示
- 0.1 系统整体实物
- 0.2 传感云台与 OLED 显示特写
- 0.3 单片机核心板与独立按键
- 0.4 供电电源
- 0.5 上位机运行界面
- 0.6 运行演示视频
- 1. 系统架构总览
- 1.1 系统框图
- 1.2 系统功能模块划分
- 2. 硬件模块详细设计
- 2.1 电源模块
- 2.2 单片机最小系统
- 引脚分配(与当前代码一致)
- 定时器分配(三定时器无冲突)
- 中断向量分配
- 2.3 超声波模块 (HC-SR04)
- 2.4 超声波滤波算法
- 2.5 舵机云台(单轴水平)
- MG996R(水平舵机,当前唯一在用舵机)
- DXW90(俯仰舵机)—— 已弃用
- 2.6 独立按键模块(已实现)
- 3. 软件模块详细设计
- 3.1 主程序流程
- 3.2 工作模式说明(当前为两种模式)
- 3.3 OLED 显示设计
- 3.4 串口通信协议
- 上行数据(单片机 → PC)
- 下行命令(PC → 单片机)
- 3.5 PC 端上位机(radar.html)
- 3.6 核心函数说明
- 超声波模块(hcsr04.c)
- 舵机模块(servo.c)
- 串口模块(uart.c)
- 按键模块(key.c)
- 4. 模块实现进度
- 已完成(已硬件验证)
- 待开发 / 优化
- 5. 硬件连接清单
- 5.1 设备清单
- 5.2 接线表(当前在用)
- 6. 测试验证计划
- 6.1 模块测试用例
- 6.2 系统集成测试
- 7. 代码文件结构
- 7.1 文件功能说明
- 8. 关键代码片段
- 8.1 超声波中值平均滤波
- 8.2 舵机 Timer2 相位法 PWM
- 8.3 串口整合上报
- 8.4 独立按键模式切换
- 9. 参考资料
前言
本文档详细阐述了一个基于 STC89C52 单片机的超声波雷达系统的设计与实现。该系统旨在通过超声波测距与舵机云台扫描,构建一个能够实时探测并可视化周围障碍物分布的嵌入式平台。项目源于本科毕业设计,其核心目标是将理论知识与工程实践相结合,完成一个功能完整、软硬件协同工作的实物系统。
0.实物展示与运行演示
本节为系统实物搭建与运行实拍,所有素材位于工程根目录的展示图片视频/文件夹中。
0.1 系统整体实物
整机俯视全貌:左侧为装在 MG996R 水平舵机上的 HC-SR04 超声波模块构成的扫描云台;
中部为 STC89C52 最小系统板(40 脚 DIP 单片机、USB、电源开关、TX/RX 标识);
下方蓝色屏体为 0.96 寸 OLED;右下角为 12V→5V/3.3V 电源模块。各模块通过面包板与杜邦线连接。
接入 12V 锂电池组供电后的整机运行状态:右侧为蓝色电池组,通过桶形插座为系统供电;
此时 OLED 显示Mode: SCAN / Angle: 127 / Dist: 329 cm,表明系统处于自动扫描模式并正常测距。
0.2 传感云台与 OLED 显示特写
HC-SR04 + MG996R 扫描云台与 OLED 屏的特写。OLED 顶部显示标题ULTRASONIC RADAR,
模式行Mode: SCAN,距离行Dist: 51 cm,验证了 OLED 实时状态显示功能。
另一时刻的显示:Mode: SCAN / Angle: 64 / Dist: 98 cm,右下角电源模块绿色指示灯常亮表示供电正常。
随舵机扫描角度变化,Angle 与 Dist 实时刷新。
0.3 单片机核心板与独立按键
<
STC89C52 最小系统板特写。板上可见 11.0592MHz 晶振、TX/RX 收发指示灯(P3.0/P3.1),
以及底部一排独立按键标注INT0 / INT1 / USER1 / USER2:其中 INT0(P3^2) 切换自动扫描模式、
INT1(P3^3) 切换串口角度模式(USER1/USER2 为后续扩展预留)。
0.4 供电电源
系统电源采用 QISUO 12V / 9000mAh 锂电池组,经 12V→5V/3.3V 模块降压后为单片机、
舵机、超声波模块及 OLED 供电,使系统可脱离 PC 独立运行。
0.5 上位机运行界面
PC 端radar.html雷达上位机实拍:右上角显示串口已连接 @ 9600;右侧信息栏实时显示
当前角度ANGLE 111°、距离DISTANCE 926cm、累计数据帧FRAMES 2580及原始数据A:111 D:926cm;
中央为绿色雷达扫描盘(0°~180° 半圆、25/50/75/100cm 距离环),障碍物以亮点标出,
扫描线在障碍处截断并保留已扫描轨迹。
0.6 运行演示视频
系统自动扫描与上位机联动的完整运行演示见视频文件:
超声波雷达运行视频
1. 系统架构总览
1.1 系统框图
┌─────────────────────────────────────────────────────────────────┐ │ 雷达系统整体架构 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ STC89C52 │◄───│ 电源模块 │───►│ 12V电池模组 │ │ │ │ 单片机 │ │ 12V→5V/3.3V │ │ │ │ │ └──────┬───────┘ └──────────────┘ └──────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 外设模块连接 │ │ │ ├──────────────┬──────────────┬──────────────┬───────────┤ │ │ │ HC-SR04 │ OLED │ 水平舵机 │ 独立按键 │ │ │ │ 超声波模块 │ 0.96" IIC │ MG996R │ INT0/INT1 │ │ │ ├──────────────┼──────────────┼──────────────┼───────────┤ │ │ │ TRIG: P1^0 │ SDA: P2^0 │ 信号:P1^2 │ INT0:P3^2 │ │ │ │ ECHO: P1^1 │ SCL: P2^1 │ (Timer2 PWM)│ INT1:P3^3 │ │ │ │ Timer0测量 │ 软件IIC │ │ 下降沿 │ │ │ └──────────────┴──────────────┴──────────────┴───────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ ┌──────────────┴──────────────┐ │ │ │ UART串口 │───►│ PC端 HTML雷达上位机 │ │ │ │ 9600bps │◄───│ (Web Serial, 2D扫描盘) │ │ │ └──────────────┘ └─────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘说明:当前实物与代码采用单轴(水平)舵机方案,仅做水平 0°~180° 扫描;
原计划的 DXW90 俯仰舵机已弃用,双轴摇杆暂未接入,模式切换改由独立按键完成。
1.2 系统功能模块划分
| 模块名称 | 功能描述 | 状态 |
|---|---|---|
| 电源模块 | 12V转5V/3.3V为系统供电 | 待验证 |
| 单片机核心 | STC89C52最小系统,三个定时器分工,串口/中断控制 | 已验证 |
| 超声波模块 | HC-SR04距离测量,Timer0测脉宽,中值平均滤波 | 已验证 |
| 水平舵机 | MG996R,Timer2相位法生成50Hz PWM | 已验证 |
| OLED显示 | 0.96寸IIC屏幕,实时显示模式/角度/距离 | 已验证 |
| 独立按键 | INT0/INT1外部中断,切换扫描/串口两种模式 | 已验证 |
| 串口通信 | 与PC端双向交互,9600波特率 | 已验证 |
| PC端上位机 | radar.html,Web Serial实时绘制2D雷达扫描盘 | 已验证 |
| 俯仰舵机(DXW90) | 原俯仰轴方案 | 已弃用 |
| 双轴摇杆 | 原手动控制方案 | 暂未接入 |
2. 硬件模块详细设计
2.1 电源模块
| 组件 | 参数 | 说明 |
|---|---|---|
| 输入 | 12V DC | 电池模组供电 |
| 输出1 | 5V / 2A | 单片机、舵机、超声波模块 |
| 输出2 | 3.3V / 1A | OLED屏幕 |
| 保护 | 短路保护、过流保护 | 自恢复保险丝 |
接线方式:
- VCC(12V+) → 电源模块IN+
- GND → 电源模块IN-
- 5V_OUT → 单片机VCC、舵机电源、HC-SR04 VCC
- 3.3V_OUT → OLED VCC
2.2 单片机最小系统
晶振:11.0592MHz,标准 12T 模式(1 机器周期 ≈ 1.0851us)。
引脚分配(与当前代码一致)
| 引脚 | 功能 | 连接设备 | 定义位置 |
|---|---|---|---|
| P1^0 | GPIO输出 | HC-SR04 TRIG | hcsr04.h |
| P1^1 | GPIO输入 | HC-SR04 ECHO | hcsr04.h |
| P1^2 | GPIO输出(PWM) | MG996R 水平舵机信号 | servo.h |
| P2^0 | IIC SDA | OLED 数据 | oled.h |
| P2^1 | IIC SCL | OLED 时钟 | oled.h |
| P3^0 | UART RXD | PC串口TX | — |
| P3^1 | UART TXD | PC串口RX | — |
| P3^2 | INT0 (外部中断0) | 独立按键:切自动扫描模式 | key.c |
| P3^3 | INT1 (外部中断1) | 独立按键:切串口角度模式 | key.c |
备注:P1^3(原 DXW90 俯仰舵机)、P14~P16(原双轴摇杆)在当前代码中未使用,作为后续扩展预留。
定时器分配(三定时器无冲突)
| 定时器 | 用途 | 模式 | 说明 |
|---|---|---|---|
| Timer0 | 超声波 ECHO 脉宽测量 | 模式1(16位) | 轮询读取,不占用中断 |
| Timer1 | 串口波特率发生器 | 模式2(8位自动重装) | TH1=TL1=0xFD → 9600bps |
| Timer2 | 舵机 PWM 生成 | 16位自动重装 | 相位法,每帧2次中断 |
中断向量分配
| 中断源 | 向量号 | 用途 |
|---|---|---|
| INT0 | interrupt 0 | 按键切换到自动扫描模式 |
| INT1 | interrupt 2 | 按键切换到串口角度模式 |
| 串口 | interrupt 4 | 接收 PC 下发的角度数据 |
| Timer2 | interrupt 5 | 维持舵机 50Hz PWM 相位 |
2.3 超声波模块 (HC-SR04)
| 参数 | 规格 |
|---|---|
| 量程 | 2cm - 400cm |
| 精度 | ±3mm |
| 触发信号 | 10us TTL脉冲 |
| 工作电压 | 5V |
| 工作电流 | 15mA |
工作原理:
- 单片机发送约10us高电平触发信号(TRIG)
- 模块自动发送8个40kHz超声波脉冲
- 检测反射信号,通过ECHO引脚返回高电平
- ECHO高电平持续时间 = 声波往返时间
- 距离 = 时间 × 声速(340m/s) / 2 = 时间(us) × 0.017cm
脉宽测量方案:
- 使用 Timer0(16位模式1)测量 ECHO 高电平时间
- ECHO 拉高后启动 Timer0,拉低后停止并读取计数
- 当前实现以轮询方式等待 ECHO 边沿(while 死等),不占用中断资源
2.4 超声波滤波算法
滤波方案:中值平均滤波(SAMPLE_COUNT = 5)
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 采样5次 | 每次触发+测量,采样间隔 delay_ms(10) |
| 2 | 排序 | 冒泡排序(从小到大) |
| 3 | 去最值 | 去掉最小值和最大值 |
| 4 | 取平均 | 计算中间3个值的平均值 |
算法流程:
触发→测脉宽×5 → 排序 → 去最值(min/max) → 中间3值取平均 → 输出滤波效果示例:
| 原始数据 | 排序后 | 去掉最值 | 平均值 |
|---|---|---|---|
| 10, 11, 10, 100, 10 | 10, 10, 10, 11, 100 | 10, 10, 11 | 10.33 → 10cm |
性能说明:单次测量需 5 次采样,每次采样包含一次 ECHO 等待(空旷/超量程时模块超时脉冲最长约 38ms)与 10ms 采样间隔,故单次完整测量耗时较长。后续可通过减少采样次数、缩短采样间隔、为 ECHO 等待添加超时等方式优化。
2.5 舵机云台(单轴水平)
MG996R(水平舵机,当前唯一在用舵机)
| 参数 | 规格 |
|---|---|
| 角度范围 | 0° - 180° |
| 扭矩 | 13kg·cm (6V) |
| 工作电压 | 4.8V - 7.2V |
| PWM频率 | 50Hz (20ms周期) |
| 控制信号 | 0.5ms(0°) - 2.5ms(180°) |
| 信号引脚 | P1^2 |
PWM 生成方式(Timer2 相位法):
- 一帧 20ms 拆成「高电平脉宽」+「低电平剩余」两段
- Timer2 每段溢出触发一次中断,在 ISR 中翻转电平并装载下一段重装值
- 每帧仅 2 次中断,开销小;多字节重装值更新时关总中断保护,避免半新半旧
- 角度→脉宽映射:
servo_us = 500 + angle × 2000 / 180(单位 us)
DXW90(俯仰舵机)—— 已弃用
原计划用于俯仰轴构成二维云台,现方案简化为单轴水平扫描,代码中不再驱动。
扫描范围(当前方案):
- 水平扫描:0° - 180° 往返
- 步进角度:1°/步
- 步进间隔:由 main.c 宏
SCAN_STEP_MS控制(当前为 1ms,可调)
2.6 独立按键模块(已实现)
| 按键名称 | 引脚 | 功能 | 触发方式 |
|---|---|---|---|
| INT0 | P3^2 | 切换到自动扫描模式 | 外部中断0(下降沿触发) |
| INT1 | P3^3 | 切换到串口角度输入模式 | 外部中断1(下降沿触发) |
按键功能说明:
- INT0 按键:将全局模式
g_sysMode置为MODE_SCAN,进入 0°→180°→0° 自动往返扫描 - INT1 按键:将全局模式
g_sysMode置为MODE_UART,进入串口角度输入模式 - 上电默认进入
MODE_UART(串口角度输入) - ISR 仅做模式标志位赋值,具体动作在主循环按模式分支执行,保证中断快进快出
3. 软件模块详细设计
3.1 主程序流程
┌────────────────────────────────────────────────────────────┐ │ 主程序流程 │ ├────────────────────────────────────────────────────────────┤ │ 上电初始化: OLED / UART / HCSR04 / Servo / Key │ │ 绘制OLED静态界面, 舵机回默认角度(90°) │ │ │ │ │ ▼ │ │ ┌──────── while(1) 主循环 ────────┐ │ │ │ 判断 g_sysMode (按键切换) │ │ │ └───────┬───────────────┬─────────┘ │ │ │MODE_SCAN │MODE_UART │ │ ▼ ▼ │ │ ┌────────────────────┐ ┌────────────────────────┐ │ │ │ 1.舵机转到scan_angle│ │ 1.UART_RxProcess解析角度│ │ │ │ 2.超声波测距 │ │ 2.超声波测距 │ │ │ │ 3.串口发送角度+距离 │ │ 3.串口发送角度+距离 │ │ │ │ 4.刷新OLED │ │ 4.刷新OLED │ │ │ │ 5.角度±1往返 │ │ 5.delay 100ms │ │ │ │ 6.delay SCAN_STEP_MS│ └────────────────────────┘ │ │ └────────────────────┘ │ └────────────────────────────────────────────────────────────┘3.2 工作模式说明(当前为两种模式)
| 模式 | 宏 | 进入方式 | 功能描述 |
|---|---|---|---|
| 自动扫描 | MODE_SCAN | 按下 INT0 按键 | 舵机 0°→180°→0° 往返,每步1°,逐点测距并上报 |
| 串口角度输入 | MODE_UART | 按下 INT1 按键(上电默认) | 接收 PC 下发角度并定位舵机,原地测距并上报 |
3.3 OLED 显示设计
静态界面(上电绘制一次):
ULTRASONIC RADAR Mode: Angle: Dist: cm动态刷新(Display_UpdateStatus,仅在数值变化时重绘,减少闪烁与IIC开销):
Mode:→SCAN/UARTAngle:→ 当前舵机角度(3位定长,空格补齐)Dist:→ 当前距离(3位定长,单位 cm)
3.4 串口通信协议
上行数据(单片机 → PC)
A:XXX D:XXXcm\r\n| 字段 | 说明 | 格式 | 示例 |
|---|---|---|---|
| A:XXX | 舵机角度 | 3位十进制 | A:090 |
| (空格) | 分隔符 | 固定 | ’ ’ |
| D:XXXcm | 距离值 | 3位十进制 + 单位 | D:045cm |
由UART_SendData(angle, distance)组装成完整字符串后一次性发送。
下行命令(PC → 单片机)
- 协议宽松:
UART_RxProcess()遍历接收缓冲区,提取其中所有数字字符拼成角度值 - 角度限幅到
[SERVO_MIN_ANGLE, SERVO_MAX_ANGLE]=[0, 180] - 解析成功后立即
Servo_SetHorizontal()定位,并更新UART_TargetAngle - 以
\r或\n作为一帧结束(接收中断中判定)
示例:PC 发送 “120\n” → 舵机转到 120°;发送 “A:045\n” → 同样解析为 45°。
3.5 PC 端上位机(radar.html)
| 项目 | 说明 |
|---|---|
| 技术 | 原生 HTML + JavaScript + Canvas |
| 串口 | Web Serial API(仅 Chrome / Edge 支持) |
| 波特率 | 9600 |
| 解析正则 | A:(\d{1,3})\D+D:(\d{1,3})\s*cm |
| 显示风格 | 雷达扫描盘(半圆 0°~180°) |
显示逻辑:
- 用长度 181 的数组保存每个角度的最新距离:
-1=未扫描,0=已扫描无障碍,>0=障碍距离(cm) - 扫描线在障碍物处截断并加亮,扫描过的位置保留扫描线
- 实时读数面板显示当前角度、当前距离、帧计数
- 网格:多个距离环 + cm 刻度 + 每30°角度射线与标签
- 提供「连接串口」「清除」按钮,默认量程 100cm
3.6 核心函数说明
超声波模块(hcsr04.c)
| 函数名 | 功能 | 返回值 |
|---|---|---|
HCSR04_Init() | 初始化引脚与 Timer0(模式1) | 无 |
HCSR04_Trig() | 发送约10us触发脉冲 | 无 |
HCSR04_GetDistance() | 5次采样+中值平均滤波 | 距离(cm) |
HCSR04_Measure() | 对外测量接口(调用上者) | 距离(cm) |
舵机模块(servo.c)
| 函数名 | 功能 | 参数 |
|---|---|---|
Servo_Init() | 初始化 Timer2,输出默认90°PWM | 无 |
Servo_SetHorizontal() | 按角度设置脉宽并重算重装值 | angle(0~180) |
Timer2_Servo_ISR() | 相位法维持PWM(interrupt 5) | 无 |
串口模块(uart.c)
| 函数名 | 功能 | 参数 |
|---|---|---|
UART_Init() | 初始化 Timer1 波特率与串口中断 | 无 |
UART_SendData() | 组装并发送「角度+距离」一行 | angle, distance |
UART_SendString()/UART_SendByte() | 发送字符串 / 字节 | str / dat |
UART_RxProcess() | 解析下行角度并定位舵机 | 无 |
UART_ISR() | 接收中断,按行缓存(interrupt 4) | 无 |
按键模块(key.c)
| 函数名 | 功能 |
|---|---|
Key_Init() | 配置 INT0/INT1 下降沿触发并使能 |
INT0_ISR() | interrupt 0,置g_sysMode = MODE_SCAN |
INT1_ISR() | interrupt 2,置g_sysMode = MODE_UART |
4. 模块实现进度
已完成(已硬件验证)
| 序号 | 模块 | 任务描述 | 验证方式 | 状态 |
|---|---|---|---|---|
| 1 | OLED显示 | 实时显示模式/角度/距离 | 观察屏幕 | ✅ |
| 2 | 串口通信 | 双向收发,整合一行上报 | PC收到 A:XXX D:XXXcm | ✅ |
| 3 | 超声波模块 | 距离测量 + 中值平均滤波 | 测量已知距离物体 | ✅ |
| 4 | 水平舵机 | Timer2 相位法 PWM 控制 | 观察舵机定位/扫描 | ✅ |
| 5 | 独立按键 | INT0/INT1 切换两种模式 | 按键切换并观察OLED | ✅ |
| 6 | PC上位机 | HTML雷达扫描盘实时绘制 | 浏览器显示障碍物 | ✅ |
待开发 / 优化
| 序号 | 项目 | 说明 | 状态 |
|---|---|---|---|
| 7 | 超声波测量提速 | 减少采样/间隔、ECHO等待加超时 | ⏳ |
| 8 | 摇杆控制(可选) | 重新接入双轴摇杆做手动控制 | ⏳ |
| 9 | 上位机增强 | 数据存储、量程切换、3D展示等 | ⏳ |
| 10 | 论文撰写 | 整理设计与测试数据 | ⏳ |
5. 硬件连接清单
5.1 设备清单
| 序号 | 设备名称 | 数量 | 备注 |
|---|---|---|---|
| 1 | STC89C52单片机 | 1 | 核心控制器 |
| 2 | HC-SR04超声波模块 | 1 | 距离测量 |
| 3 | 0.96寸OLED屏幕 | 1 | IIC接口 |
| 4 | MG996R舵机 | 1 | 水平转动(在用) |
| 5 | DXW90舵机 | 1 | 俯仰(已弃用) |
| 6 | 独立按键 | 2 | INT0/INT1 模式切换 |
| 7 | 双轴按键摇杆 | 1 | 暂未接入 |
| 8 | 12V电池模组 | 1 | 电源输入 |
| 9 | 12V转5V/3.3V模块 | 1 | 电源转换 |
| 10 | 杜邦线 / PCB板 | 若干 | 连接与搭建 |
5.2 接线表(当前在用)
| 单片机引脚 | 连接设备 | 设备引脚 |
|---|---|---|
| P1^0 | HC-SR04 | TRIG |
| P1^1 | HC-SR04 | ECHO |
| P1^2 | MG996R | SIGNAL |
| P2^0 | OLED | SDA |
| P2^1 | OLED | SCL |
| P3^0 | 串口模块 | TX |
| P3^1 | 串口模块 | RX |
| P3^2 | 独立按键1 | 一端接地,另一端接P3^2 |
| P3^3 | 独立按键2 | 一端接地,另一端接P3^3 |
| VCC(5V) | 所有5V设备 | VCC |
| GND | 所有设备 | GND |
6. 测试验证计划
6.1 模块测试用例
| 模块 | 测试项 | 预期结果 |
|---|---|---|
| OLED | 静态/动态显示 | 正确显示模式、角度、距离 |
| 串口 | 上行数据 | PC端收到 “A:XXX D:XXXcm” 格式 |
| 串口 | 下行命令 | 发送数字后舵机定位到对应角度 |
| 超声波 | 近距离测量(5cm) | 误差<1cm |
| 超声波 | 中距离测量(50cm) | 误差<2cm |
| 超声波 | 远距离测量(200cm) | 误差<5cm |
| 超声波 | 滤波效果 | 异常值被有效过滤 |
| 舵机 | 角度控制 | 0°/90°/180°定位准确 |
| 舵机 | 自动扫描 | 0°→180°→0° 平滑往返 |
| 按键 | INT0/INT1切换 | OLED的Mode在SCAN/UART间切换 |
6.2 系统集成测试
- 自动扫描测试:按 INT0 进入扫描,舵机往返,上位机显示完整半圆扫描与障碍物
- 串口控制测试:按 INT1 进入串口模式,PC 下发角度,舵机定位并回传距离
- 模式切换测试:INT0/INT1 反复切换,OLED 模式显示与行为一致
- 上位机联调:浏览器连接串口,验证障碍物位置、扫描线截断与保留是否正确
7. 代码文件结构
RadarScanningSystem/ ├── SRC/ # 单片机源码目录 │ ├── hcsr04.h / hcsr04.c # 超声波模块(Timer0测脉宽 + 中值平均滤波) │ ├── servo.h / servo.c # 水平舵机(Timer2 相位法 PWM) │ ├── uart.h / uart.c # 串口通信(双向收发,9600) │ ├── key.h / key.c # 独立按键(INT0/INT1 模式切换) │ ├── oled.h / oled.c # OLED显示(软件IIC) │ ├── oledfont.h # OLED字库 │ ├── bmp.h # BMP图像定义 │ └── main.c # 主程序入口(双模式主循环 + OLED刷新) ├── radar.html # PC端HTML雷达上位机(Web Serial) ├── SYSTEM_DESIGN.md # 系统设计文档(本文件) ├── RadarScanningSystem.uvproj # Keil5工程文件 ├── RadarScanningSystem.uvopt # Keil5配置文件 └── STARTUP.A51 # 启动代码7.1 文件功能说明
| 文件 | 功能描述 |
|---|---|
hcsr04.c/.h | 超声波测量,Timer0测脉宽,中值平均滤波 |
servo.c/.h | 单轴水平舵机,Timer2相位法生成50Hz PWM |
uart.c/.h | 串口收发,上行"角度+距离",下行解析角度 |
key.c/.h | INT0/INT1外部中断,切换扫描/串口模式 |
oled.c/.h | OLED驱动(软件IIC)与显示函数 |
main.c | 初始化各模块,双模式主循环,OLED按需刷新 |
radar.html | 上位机,Web Serial接收数据绘制2D雷达 |
8. 关键代码片段
8.1 超声波中值平均滤波
unsignedintHCSR04_GetDistance(void){unsignedintsamples[SAMPLE_COUNT];// SAMPLE_COUNT = 5unsignedchari,j;unsignedinttemp,sum=0;for(i=0;i<SAMPLE_COUNT;i++)// 多次采样{HCSR04_Trig();samples[i]=HCSR04_GetRawDistance();delay_ms(10);// 采样间隔}for(i=0;i<SAMPLE_COUNT-1;i++)// 冒泡排序for(j=0;j<SAMPLE_COUNT-1-i;j++)if(samples[j]>samples[j+1]){temp=samples[j];samples[j]=samples[j+1];samples[j+1]=temp;}sum=samples[1]+samples[2]+samples[3];// 去最值取中间3个平均returnsum/3;}8.2 舵机 Timer2 相位法 PWM
// 每帧拆为「高电平脉宽」+「低电平剩余」两段,各占一次Timer2溢出中断voidTimer2_Servo_ISR(void)interrupt5{TF2=0;// Timer2溢出标志软件清零if(servo_phase==0)// 脉冲结束→拉低,装载低电平段{SERVO_HORIZ_PIN=0;TH2=rl_low_th;TL2=rl_low_tl;servo_phase=1;}else// 新帧开始→拉高,装载脉宽段{SERVO_HORIZ_PIN=1;TH2=rl_high_th;TL2=rl_high_tl;servo_phase=0;}}8.3 串口整合上报
// 组装 "A:XXX D:XXXcm\r\n" 一次性发送voidUART_SendData(unsignedcharangle,unsignedintdistance){unsignedcharbuf[20];unsignedchari=0;buf[i++]='A';buf[i++]=':';buf[i++]=(angle/100)+'0';buf[i++]=(angle/10%10)+'0';buf[i++]=(angle%10)+'0';buf[i++]=' ';buf[i++]='D';buf[i++]=':';buf[i++]=(distance/100)+'0';buf[i++]=(distance/10%10)+'0';buf[i++]=(distance%10)+'0';buf[i++]='c';buf[i++]='m';buf[i++]='\r';buf[i++]='\n';buf[i]='\0';UART_SendString(buf);}8.4 独立按键模式切换
unsignedcharg_sysMode=MODE_UART;// 上电默认串口模式voidKey_Init(void){IT0=1;IT1=1;EX0=1;EX1=1;EA=1;}// INT0/INT1 下降沿触发voidINT0_ISR(void)interrupt0{g_sysMode=MODE_SCAN;}// 切自动扫描voidINT1_ISR(void)interrupt2{g_sysMode=MODE_UART;}// 切串口角度9. 参考资料
- STC89C52RC 单片机数据手册
- HC-SR04 超声波模块说明书
- MG996R 舵机技术规格书
- 0.96寸OLED SSD1306驱动芯片手册
- Web Serial API 规范(W3C / Chrome)
版本: V3.0
日期: 2026年6月
作者: 本科毕业设计
状态: 单轴水平扫描方案,单片机端与HTML上位机均已硬件/浏览器验证,持续优化中