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

外设引脚说明
LCD1602PA0~PA78 位并口
OLED 0.96'PB8/SCL、PB9/SDAI²C 软件时序
DHT11PB10单总线
DS18B20PA7单总线
SG90 舵机PB0TIM3_CH1 50 Hz PWM
无源蜂鸣器PC132 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 显示 Logohttps://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);
}
posted @ 2026-01-10 10:35  clnchanpin  阅读(20)  评论(0)    收藏  举报