【FRDM-MCXA153 成果帖】HC-SR04 超声波测距 + 1602 字符屏实时显示(裸机 · 已完成)
方向标签:嵌入式入门 · GPIO/时序 · 传感器驱动 · 字符型 LCD
平台:NXP FRDM-MCXA153(MCXA153,Cortex-M33,复位默认 FRO 12 MHz)
工具链:MCUXpresso IDE 25.6 + arm-none-eabi-gcc + LinkServer(MCU-LINK CMSIS-DAP)
状态:✅ 已上板验证通过,串口与 LCD 双通道输出正常
一、项目概述
本项目的目标是做一个"看得见"的超声波测距终端:把 HC-SR04 类超声波模块(型号 3942)接在开发板 Arduino 排针上,每 500 ms 测量一次距离,结果实时刷新到 NHD-0116AZ(16×1,HD44780 兼容,ST7066U 驱动 IC)字符液晶上,同时通过 LPUART0 以 115200 波特率上传到 PC 串口助手。
选择这个题目的原因:传感器和屏幕都是 5 V 器件、都是时序敏感型,正好能把 GPIO 配置、精确延时、外设复位释放、4 位总线驱动这些基本功一次性踩透。全部用户代码放在 source 目录下,共 6 个文件,主循环代码量不到 500 行。
source/
├── NXP.c # main:初始化 → 主循环(测距 / 刷新 / 上传)
├── app_delay.h # 基于 DWT->CYCCNT 的 µs/ms 延时与计时
├── ultrasonic.c/h # 超声波驱动
└── lcd1602.c/h # LCD 4 位总线驱动
二、系统框图

数据流:main 每 500 ms 调用一次 ULTRASONIC_GetDistanceCm(),得到 cm 单位的浮点距离;该值同时送 LCD_ShowDistance() 和 PRINTF()。无回波/超时统一返回 -1.0f,两个通道都显示 ----。
三、电路原理图(接线等效图)
3.1 超声波模块
FRDM-MCXA153 (Arduino 排针) HC-SR04 / 3942
+5V ───────────────────────────── VCC (1)
GND ───────────────────────────── GND (4)
P2_4 (D2) ──────────────────────── Trig (2) 推挽输出
P2_5 (D4) ◄─────────────────────── Echo (3) 输入(上拉+IBE)
3.2 字符液晶(4 位总线 · 只写模式)

3.3 引脚汇总表

⚠️ 硬件加固建议:E 与 RS 各加一只 10 kΩ 下拉到 GND(DB4~DB7 也建议加)。MCU 复位时 PCR 会复位、内部上下拉失效,只有外部电阻能消除"复位瞬间总线悬空被噪声当成写指令"的问题。
四、主要参数情况
4.1 测距参数

4.2 LCD 时序参数(规格值 vs 本驱动取值)

五、软件设计与项目代码
5.1 延时/计时层(app_delay.h)
刻意不用 SysTick:MCXA153 的 SysTick 时钟源复位默认是 1 MHz 的 clkroot_1m,切换后还可能停止计数,导致延时死循环。改用内核自带的 DWT 周期计数器,直接按处理器时钟计数,无需任何中断;
5.2 超声波驱动核心(ultrasonic.c)

5.3 主循环(NXP.c)

六、实现步骤
1.环境搭建:安装 MCUXpresso IDE 25.6 与 FRDM-MCXA153 SDK,用 Config Tools 生成 board、device、drivers 等基础框架(本工程 BOARD_InitBootClocks() 为空,系统跑复位默认 FRO12M)。
2.硬件接线:按第三节接线图把超声波接 D2/D4,LCD 接 D7~D12,R/W 与 DB0~DB3 接地,V0 接 10 kΩ 电位器调对比度。
3.打通延时基准:实现 app_delay.h,在 main() 开头调用 APP_InitDelay(),并在调试器里确认 SystemCoreClock == 12000000。
4.超声波单点验证:先只做 Trig 翻转 + Echo 读电平的裸测试,确认 Echo 脚接 3.3 V 时 GPIO_PinRead 能读到 1(这一步能排除绝大多数"读不到信号"的假故障),再加脉宽测量与距离换算。
5.LCD 自检:用 LCD_DIAG_PATTERN=1 开关显示 0123456789ABCDEF,逐位确认 16 个字符位置都有扫描信号,再关掉开关进入正常显示。
6.联调与标定:把 ultrasonic 与 lcd1602 合入主循环,用卷尺在 5/20/50/100 cm 四点比对读数。
7.收尾:调整刷新周期与显示格式,把 LCD_BusIdle() 提到 main() 第一句。
七、如何开启运行
① 硬件准备:FRDM-MCXA153 一块、HC-SR04 一块、NHD-0116AZ 一块、10 kΩ 电位器一只、杜邦线若干。用 USB 线连接板载 MCU-LINK 调试口到 PC。
② 导入工程:MCUXpresso IDE → File > Open Projects from File System… → 选择工程根目录 NXP(.project / .cproject / NXP.mex 已就位)。
③ 编译:IDE 内:右键工程 → Build Project;命令行:进入 Debug 目录后执行 make all,产物为 NXP.axf。
④ 下载运行:调试配置选 NXP LinkServer Debug.launch(LinkServer + MCU-LINK CMSIS-DAP,非 J-Link),点击 Debug/Resume。程序会自动停在 main,再点一次运行即可。
⑤ 观察结果:
LCD 上电后先清屏,随即显示 Dist: xx.x cm,手掌前后移动读数实时跟随;
打开串口助手,参数 115200 / 8 / N / 1,选择 MCU-LINK 虚拟串口,可见 banner 与每 500 ms 一行的 Distance: xx.xx cm。
⑥ 复位:按 SW1 可热复位。若屏幕出现残留字符,属已知的总线悬空问题,按第三节加下拉电阻即可根治。
八、调试记录(关键问题与解决)

九、成果与不足
成果:实现了"测距 → 显示 → 上传"完整闭环。LCD 显示稳定无闪烁,5~150 cm 范围内读数跟随流畅;无回波时 LCD 与串口同步给出 ---- 提示,不会出现乱码或卡死。固件体积仅 17.3 KB Flash / 284 B RAM(不含堆栈),资源占用极低。


不足与后续计划:
1. Echo 脉宽用轮询 + DWT 实现,CPU 在测量期间被独占,后续可改为输入捕获(CTimer)或加上多次采样取中值滤波;
2. 目前只做单向测距,后续可扩展到 3 路超声波做避障小车,或用 FreeRTOS 把测距、显示、上传拆成独立任务。
我要赚赏金
