本演示基于 STM32F103C8T6 实现 PB0 数字量读取与 OLED 显示。 介绍 8 种常见数字量传感器的原理与功能,并对示例工程的关键代码与运行流程进行分析。
大多数数字量传感器采用「传感器探头 + 底板(转接板)」设计,底板上的 LM393 电压比较器是核心——将模拟信号转换为干净的 0/1 数字电平。
底板上的 LM393 是一颗内含两个独立比较器的芯片。它将传感器探头输出的模拟信号与电位器设定的参考电压 (Vref) 进行比较:
• 传感器信号 > Vref → 比较器输出一种电平
• 传感器信号 < Vref → 比较器输出另一种电平
输出为开漏 (OC) 结构,经上拉电阻后得到干净的 0/1 数字信号。
电位器 — 调节比较阈值,即灵敏度旋钮
LED 指示灯 — 电源指示 + 输出状态指示
上拉电阻 — 确保 OC 输出有确定高电平
3-pin 接口 — VCC / GND / OUT,即插即用
无论探头是热释电 (PIR)、霍尔 (Hall)、红外 (IR)、光敏还是电容式,底板都能统一输出 0/1 数字信号。 MCU 只需读取一个 GPIO 引脚即可获取检测结果,极大简化了硬件设计与软件开发。
本演示工程仅启用 PB0 一个 GPIO 输入与 0.96 寸 OLED(软件 I²C)显示;8 种数字量传感器作为原理讲解,并不同时接入。PB0 的电平由外接传感器的 OUT/SIGNAL 引脚提供,0/1 经 OLED 实时显示。
每张卡片包含实物图、工作原理、输出逻辑、典型应用。8 种传感器均采用上述底板+LM393 架构,输出统一的 0/1 数字信号。
演示工程的电路原理图设计与 PCB 封装展示。
核心代码位于 main.c 与 OLED.c,使用 STM32CubeMX 生成工程骨架,Keil MDK-ARM 编译。
int main(void) { HAL_Init(); // 1. 初始化、配置 SysTick 1ms SystemClock_Config(); // 2. HSE 8MHz ×9 PLL → 72MHz MX_GPIO_Init(); // 3. 配置 PB0 为浮空输入 OLED_Init(); // 4. 软件 I²C 初始化 + SSD1306 while (1) // 5. 主循环 { if (HAL_GetTick() - Time_Now >= 50) // 每 50ms 刷新 { OLED_Clear(); // 清显存 OLED_CenterPrintf(24, "输入:%d", HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)); // 读 PB0 OLED_Update(); // I²C 推送显存 Time_Now = HAL_GetTick(); // 记录时间戳 } } }
GPIO_NOPULL,
表示不启用内部上/下拉,由外部传感器驱动电平:OUT 推挽 → 直接读;OC/OD 输出 → 必须外接上拉电阻。
实际很多模块(霍尔、循迹、避障等)板载已上拉。GPIO_PIN_SET=1 / GPIO_PIN_RESET=0,
通过 %d 格式化为 0 或 1 显示在 OLED 上。从系统启动到主循环的完整数据流。初始化阶段(1~5)播放一次后,while(1) 循环(6→7→8)会持续播放,体现程序的无限循环逻辑。点击「重新播放」可从头开始。
本演示以最简方式展示了 8 种传感器的"是/否"信号如何被 STM32 采集并显示。要扩展成实际项目,可以从下面几个方向入手。