STM32CubeHAL 外设仿真大合集 | Proteus 8.15 (LCD1602+OLED+DHT11+DS18B20+舵机+蜂鸣器)

外设 引脚 说明
LCD1602 PA0~PA7 8 位并口
OLED 0.96' PB8/SCL、PB9/SDA I²C 软件时序
DHT11 PB10 单总线
DS18B20 PA7 单总线
SG90 舵机 PB0 TIM3_CH1 50 Hz PWM
无源蜂鸣器 PC13 2 kHz 方波

2. 工程快速上手

2.1 软件版本

  • STM32CubeMX 6.11

  • Keil MDK 5.38

  • Proteus 8.15 SP4(低于 8.12 无 F1 HAL 模型)

  • 串口助手 115200-8-N-1

2.2 一键下载

表格

复制

资源 地址
完整 CubeMX+Keil 工程(含驱动) 点击下载
Proteus 原理图(8.15) 点击下载
驱动源码(LCD/OLED/DHT/DS18B20) 见文末附录

3. CubeMX 关键配置截图

以下仅列「非默认」配置,其余保持默认即可。

  1. RCC

    HSE = Crystal/Ceramic Resonator

    LSE = Disable

  2. SYS

    Debug = Serial Wire

    Timebase = SysTick

  3. USART1

    Mode = Asynchronous

    Baud = 115200

    NVIC 全局中断 ✅

  4. ADC1

    Scan Conv Mode = ENABLE

    Continuous Mode = DISABLE

    Discontinuous Mode = ENABLE

    Number Of Conversion = 2

    Rank1 = Channel 0 | Rank2 = Channel 4

    Sampling Time = 1.5 cycles(仿真可最快)

  5. TIM3 → PWM Generation CH1

    Prescaler = 72-1(72 MHz/72 = 1 MHz)

    Counter Period = 2000-1(1 MHz/2000 = 500 Hz)

    Pulse = 250(0.5 ms → 0°)

    舵机周期 = 20 ms(40 倍频后 50 Hz)

  6. GPIO 命名

    PC13 → LED_BUZ(蜂鸣器+心跳灯)

    PB10 → DHT11_PIN

    PA7 → DQ_DS18B20

    其余数据口按原理图命名即可,方便自动生成宏。


4. 外设驱动移植要点

4.1 LCD1602 并口

  • 基于 ST 官方 HAL 延时,无需 SysTick 抢占

  • 关键函数:LCD_WriteCmd() / LCD_WriteData()

  • 仿真注意:Proteus 里 LCD 模型为 LM016L,数据口顺序必须与代码一致(D0~D7)

4.2 OLED 软件 I²C

  • 采用 PB8/PB9 开漏 + 上拉电阻(4.7 kΩ)

  • 驱动参考 ssd1306_128x64_i2c.c,移植时仅需改宏:

c

复制

复制代码
#define OLED_I2C_SCL_PIN        GPIO_PIN_8
#define OLED_I2C_SDA_PIN        GPIO_PIN_9
#define OLED_I2C_GPIO_PORT      GPIOB
  • 仿真模型:SSD1306 0.96' OLED,地址 0x78(SA0=0)

4.3 DHT11 / DS18B20 单总线

  • 时序要求 20-40 μs,HAL 库 micros() 不够精准 → 采用 DWT_CYCCNT

  • Proteus 单总线模型需外部上拉 4.7 kΩ,否则读 85℃ 固定值

  • 读取失败时返回 255,代码里做容错显示 Read Error

4.4 SG90 舵机

  • 周期 20 ms,脉宽 0.5~2.5 ms

  • TIM3 计数 2000 对应 2 ms,因此:

    0° → 250

    90° → 750

    180° → 1250

  • 仿真模型:SERVO-MOTOR 引脚接 PB0,电压 5 V(STM32 需外接 5 V 电源轨)

4.5 无源蜂鸣器

  • 使用 TIM3 CH2 的 2 kHz PWM,或简单粗暴 HAL_GPIO_TogglePin + HAL_Delay(250)

  • PC13 低电平响,高电平停(NPN 三极管驱动)


5. 现象展示

表格

复制

功能 照片/动图
上电串口打印 https://your-usart.png
LCD 第二行实时温湿度 https://your-lcd.png
OLED 显示 Logo https://your-oled.png
舵机 0→90→180° 循环 https://your-servo.gif
蜂鸣器 2 kHz 滴声 自己脑补 :)

6. 常见问题汇总

  1. Proteus 报错 No Model for STM32F103C8

    → 升级 8.15+,或把 STM32F103C8.dll 手动放到 MODELS 目录。

  2. OLED 一片白

    → 检查地址(0x78/0x7A)、上拉电阻、复位脚未接导致 I²C 死锁。

  3. DS18B20 一直 85℃

    → 总线无上拉 / 时序过快 / 未等待转换完成(> 750 ms)。

  4. 舵机抖动

    → 仿真步长太大,把 System->Set Animation Options->Time Step 调到 50 μs 以下。


7. 附录:核心代码片段

以下代码已开中断接收,主循环 100 ms 刷新一次。

c

复制

复制代码
/* main.c 节选 */
while (1)
{
    /* DS18B20 */
    temp = DS18B20_ReadTemp();
    printf("DS18B20 = %.1f\r\n", temp);

    /* DHT11 */
    if (DHT11_Read_PB10(&h, &t) == 0)
        sprintf(msg, "T:%2dC H:%2d%%", t, h);
    else
        sprintf(msg, "DHT Error");
    LCD_ShowString(1, 0, msg);

    /* 舵机扫描 */
    for (int pw = 250; pw <= 1250; pw += 50) {
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pw);
        HAL_Delay(50);
    }

    /* 蜂鸣器滴一声 */
    for (int i = 0; i < 100; i++) {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        HAL_Delay(1);
    }

    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 关闭蜂鸣器
    HAL_Delay(900);
}
相关推荐
西城微科方案开发2 小时前
基于西城微科SIC8833芯片的口袋电子秤方案解析
单片机·嵌入式硬件·方案公司推荐
三佛科技-134163842123 小时前
SM7015 输出12V/18V 电流150MA非隔离LED电源驱动IC典型应用电路
单片机·嵌入式硬件·智能家居·pcb工艺
Jazel3 小时前
DDR5 Write leveling详解
嵌入式硬件
Darken033 小时前
基于单片机STM32的---断点调试操作
stm32·单片机·嵌入式硬件·断点调试
d111111111d3 小时前
在STM32F103C8T6中什么是读写寄存器模型,有什么用,可以干什么,详细解释。
笔记·stm32·单片机·嵌入式硬件·学习
Darken033 小时前
EXTI和NVIC的这两个外设时钟为什么不需要开启?不开启外设时钟程序能否执行?
stm32·单片机·exti·nvic
猫猫的小茶馆4 小时前
【ARM】ARM体系结构与开发基础
arm开发·stm32·单片机·嵌入式硬件·mcu·物联网
三佛科技-134163842124 小时前
PL3367C 离线反激式PWM控制芯片兼容DP2525JD 典型应用电路
单片机·嵌入式硬件·智能家居·pcb工艺
研华嵌入式4 小时前
用Edge Impulse开启你的边缘AI之旅
arm开发·图像处理·嵌入式硬件·目标检测·视觉检测·边缘计算