# stm32-temp-alarm-clock **Repository Path**: ch1ller/stm32-temp-alarm-clock ## Basic Information - **Project Name**: stm32-temp-alarm-clock - **Description**: 基于 STM32F103C8Tx 微处理器和 FreeRTOS 嵌入式操作系统开发的一款综合设备,集成了温度监测、超限报警、实时时钟、按键设置及串口远控等功能。通过滑动变阻器模拟温度传感器,实现了规定范围内的温度采集、显示与报警功能。 - **Primary Language**: C - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2026-01-23 - **Last Updated**: 2026-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: stm32, FreeRTOS ## README # STM32 测温报警时钟系统 ## 项目简介 本项目是基于 STM32F103C8Tx 微处理器和 FreeRTOS 嵌入式操作系统开发的一款综合设备,集成了**温度监测**、**超限报警**、**实时时钟**、**按键设置**及**串口远控**等功能。通过滑动变阻器模拟温度传感器,实现了 -40℃ ~ 85℃ 范围内的温度采集、显示与报警功能。 ### 主要特点 - 多任务实时调度系统(FreeRTOS) - 温度模拟采集与显示(-40℃ ~ 85℃) - 高低温报警(持续/间歇蜂鸣) - 8位 LED 数码管动态扫描显示 - 软件实时时钟(RTC)自动进位 - 三屏显示模式(时间/温度/阈值) - 本地 4 按键控制 - 串口远程控制与状态回显 ## 效果展示 ### 系统仿真 ![Proteus电路仿真](screenshots/proteus-circuit.png) ### 时钟显示 ![时间显示](screenshots/time-display.jpg) ![日期显示](screenshots/date-display.jpg) ### 温度显示 ![温度显示](screenshots/temp-display.jpg) ![负数温度显示](screenshots/temp-display-negative.jpg) ### 温度阈值设置 ![高温阈值调节](screenshots/high-temp-threshold.jpg) ![低温阈值调节](screenshots/low-temp-threshold.jpg) ### 报警功能 ![高温报警](screenshots/high-temp-alarm.jpg) ![低温报警](screenshots/low-temp-alarm.jpg) ### 串口控制 ![串口远程控制](screenshots/serial-control.png) ## 功能特性 ### 1. 温度监测功能 - 使用滑动变阻器模拟温度传感器 - ADC 12位精度采集,DMA 连续传输 - 均值滤波算法消除噪声干扰 - 温度范围:**-40℃ ~ 85℃** - 支持正负温度显示(<0℃ 显示负号) ### 2. 报警功能 | 报警类型 | 触发条件 | 蜂鸣模式 | 数码管显示 | | -------- | --------------- | --------------- | ---------- | | 高温报警 | T > 上限 | 持续鸣响 | `Error_Hi` | | 低温报警 | T < 下限 | 间歇鸣响(500ms) | `Error_Lo` | | 正常状态 | 下限 ≤ T ≤ 上限 | 静音 | 正常显示 | ### 3. 时钟日历功能 - 24小时制时间显示(HH:MM:SS) - 日期显示(YYYY:MM:DD) - 自动时间进位(秒→分→时→日→月→年) - 支持闰年自动检测 ### 4. 显示系统 - **屏幕1(RTC模式)**:时间/日期每3秒自动切换 - **屏幕2(温度模式)**:显示当前温度,带符号标识 - **屏幕3(阈值模式)**:显示/设置温度上下限 ### 5. 按键控制 | 按键 | 功能 | 说明 | | ------ | ----------------- | ---------------------- | | **K1** | 屏幕切换 | 屏1→屏2→屏3→屏1 循环 | | **K2** | 阈值+1/进上限设置 | 仅屏3有效 | | **K3** | 阈值-1/进下限设置 | 仅屏3有效 | | **K4** | 确认设置 | 保存阈值并退出设置模式 | ### 6. 串口远控功能 - 波特率:9600bps, 8N1 - 支持命令格式:`命令:参数` - 实时状态回显 ## 硬件架构 ### 系统框图 ``` ┌─────────────────────────────────────────────────────────────┐ │ STM32F103C8Tx 主控芯片 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ ADC1 │ │ TIM1 │ │ USART1 │ │ GPIO │ │ │ │ + DMA │ │ 1ms中断 │ │ 串口通信 │ │ 中断 │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ └───────┼─────────────┼─────────────┼─────────────┼───────────┘ │ │ │ │ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ │滑动变阻│ │数码管 │ │ PC │ │ 按键 │ │ 器模拟 │ │ 8位LED│ │ 串口 │ │ K1-K4 │ └───────┘ └───────┘ └───────┘ └───────┘ ``` ### 硬件连接 #### 输入模块 | 外设 | 引脚 | 功能 | | ---------- | ---- | ------------------- | | 滑动变阻器 | PB1 | ADC1_IN9 (温度模拟) | | 按键 K1 | PA15 | 屏幕切换 (EXTI15) | | 按键 K2 | PA14 | 阈值+1 (EXTI14) | | 按键 K3 | PA13 | 阈值-1 (EXTI13) | | 按键 K4 | PA12 | 确认设置 (EXTI12) | | USART1_RX | PA10 | 串口接收 | | USART1_TX | PA9 | 串口发送 | #### 输出模块 | 外设 | 引脚 | 功能 | | ----------- | ----------- | ---------------------- | | LED1-LED8 | PA0-PA7 | 数码管段选 (A-G+DP) | | 蜂鸣器 | PB0 | 报警提示音 | | LSA/LSB/LSC | PB5/PB4/PB3 | 数码管位选 (3-8译码器) | ## 软件架构 ### FreeRTOS 任务架构 | 任务名称 | 优先级 | 核心功能 | 同步机制 | | --------------- | ----------- | ------------------ | ------------------ | | **IdleTask** | Idle | 数据处理与显示计算 | 循环执行 | | **SecondTask** | AboveNormal | RTC时间更新 | bSem_1s信号量 | | **BeepTask** | Normal | 蜂鸣器控制 | bSem_Beep信号量 | | **AnalyzeTask** | High | 串口命令解析 | bSem_Analyze信号量 | ### 信号量同步机制 ``` ┌────────────────────────────────────────────────────────────┐ │ 信号量同步示意图 │ ├────────────────────────────────────────────────────────────┤ │ │ │ TIM1中断 (1ms) ──┬──> 1000次触发 ──> bSem_1s ──> SecondTask│ │ │ │ │ ├──> 数码管扫描 (seg7dsp) │ │ │ │ │ 按键中断 ────────┼──> bSem_Beep ─────────> BeepTask │ │ 报警检测 ────────┤ │ │ 串口命令 ────────┘ │ │ │ │ 串口接收中断 ───> bSem_Analyze ────> AnalyzeTask │ │ │ └────────────────────────────────────────────────────────────┘ ``` ### 目录结构 ``` 232226201137-EXP4/ ├── Core/ # 核心应用代码 │ ├── Src/ │ │ ├── main.c # 主程序(923行) │ │ ├── freertos.c # FreeRTOS 任务定义 │ │ ├── gpio.c # GPIO 配置 │ │ ├── adc.c # ADC 配置 │ │ ├── tim.c # 定时器配置 │ │ ├── usart.c # 串口配置 │ │ ├── dma.c # DMA 配置 │ │ └── stm32f1xx_it.c # 中断服务函数 │ └── Inc/ │ ├── main.h # 主头文件 │ ├── FreeRTOSConfig.h # FreeRTOS 配置 │ └── stm32f1xx_hal_conf.h # HAL 模块配置 ├── Drivers/ # HAL 驱动库 │ ├── STM32F1xx_HAL_Driver/ # STM32F1xx HAL │ └── CMSIS/ # CMSIS 核心文件 ├── Middlewares/ # 中间件 │ └── Third_Party/FreeRTOS/ # FreeRTOS 源码 ├── MDK-ARM/ # Keil 工程文件 │ ├── 232226201137-EXP4.uvprojx │ └── startup_stm32f103xb.s ├── 232226201137-EXP4.ioc # STM32CubeMX 配置文件 └── README.md # 本说明文档 ``` ## 使用说明 ### 1. 编译与烧录 #### 环境要求 - **IDE**:Keil MDK - ARM µVision5 - **SDK**:STM32CubeMX + HAL库 - **工具链**:ARM Compiler 5/6 #### 编译步骤 ```bash 1. 使用 STM32CubeMX 打开 232226201137-EXP4.ioc 2. 生成代码 3. 使用 Keil MDK-ARM 打开 232226201137-EXP4/MDK-ARM/232226201137-EXP4.uvprojx 4. 编译项目 5. 烧录到开发板 ``` ### 2. 操作说明 #### 开机默认状态 - 默认显示:**屏幕1(RTC模式)** - 初始时间:13:07:00 - 初始日期:2025-12-30 - 温度上限:60℃ - 温度下限:-20℃ #### 按键操作流程 **屏幕切换(K1)**: ``` 屏1 (RTC) ──K1──> 屏2 (温度) ──K1──> 屏3 (阈值) ──K1──> 屏1 (RTC) ``` **温度阈值设置**(在屏3): 1. 按 **K2**:进入上限设置,再次按K2上调(≤85) 2. 按 **K3**:进入下限设置,再次按K3下调(≥-40) 3. 按 **K4**:确认并保存设置,退出设置模式 #### 串口命令列表 | 命令格式 | 功能 | 示例 | 返回值 | | --------------- | ------------ | --------------- | ----------------------------- | | `SETH:XX` | 设置温度上限 | `SETH:70` | `SETH ACK = 70` | | `SETL:XX` | 设置温度下限 | `SETL:-10` | `SETL ACK = -10` | | `SETT:HHMMSS` | 设置时间 | `SETT:143000` | `SETT ACK = 143000` | | `SETD:YYYYMMDD` | 设置日期 | `SETD:20050307` | `SETD ACK = 20050307` | | `RSTT:` | 重置时间 | `RSTT:` | `RSTT ACK = 000000` | | `RSTD:` | 重置日期 | `RSTD:` | `RSTD ACK = 20000101` | | `SCRN:X` | 切换屏幕 | `SCRN:1` | `SCRN ACK = 1` | | `INFO:` | 输出状态 | `INFO:` | `Time = ..., Date = ..., ...` | ### 3. Proteus 仿真 项目包含 Proteus 仿真文件: - 位置:`Proteus/Big_Project.pdsprj` - 使用 Proteus 8.x 打开即可仿真 ## 技术栈 ### 嵌入式硬件 - **MCU**:STM32F103C8Tx (Cortex-M3, 72MHz, 64KB Flash, 20KB RAM) - **外设**:GPIO, ADC, TIM, USART, DMA, EXTI ### 软件框架 - **RTOS**:FreeRTOS v10.0.1 - **HAL库**:STM32F1xx HAL Driver - **开发工具**:STM32CubeMX 6.x, Keil MDK-ARM 5.x ### 核心技术 - 多任务实时调度 - 信号量同步机制 - 中断驱动编程 - DMA数据传输 - 动态数码管扫描 ## 测试验证 ### 测试覆盖率 | 功能模块 | 测试项 | 通过率 | | -------- | ------ | ------ | | 温度采集 | 2项 | 100% | | 报警功能 | 3项 | 100% | | 时钟功能 | 1项 | 100% | | 按键控制 | 3项 | 100% | | 串口通信 | 6项 | 100% | ### 主要测试用例 - ✅ 温度范围测试(-40℃ ~ 85℃) - ✅ 高温持续报警 - ✅ 低温间歇报警 - ✅ RTC自动进位 - ✅ 阈值逻辑限制 - ✅ 串口命令解析 ⭐ 如果这个项目对你有帮助,请给个 Star!