| 外设 | 引脚 | 说明 |
|---|---|---|
| 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 关键配置截图
以下仅列「非默认」配置,其余保持默认即可。
-
RCC
HSE = Crystal/Ceramic Resonator
LSE = Disable
-
SYS
Debug = Serial Wire
Timebase = SysTick
-
USART1
Mode = Asynchronous
Baud = 115200
NVIC 全局中断 ✅
-
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(仿真可最快)
-
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)
-
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
- 仿真模型:
SSD13060.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. 常见问题汇总
-
Proteus 报错 No Model for STM32F103C8
→ 升级 8.15+,或把
STM32F103C8.dll手动放到MODELS目录。 -
OLED 一片白
→ 检查地址(0x78/0x7A)、上拉电阻、复位脚未接导致 I²C 死锁。
-
DS18B20 一直 85℃
→ 总线无上拉 / 时序过快 / 未等待转换完成(> 750 ms)。
-
舵机抖动
→ 仿真步长太大,把
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);
}