当前位置: 首页 > news >正文

STM32实战:基于STM32F103的智能输液监控系统(液滴检测+报警)

文章目录

    • 一、项目概述
    • 二、硬件电路连接
    • 三、开发环境准备
    • 四、STM32CubeMX配置
      • 步骤1:新建工程
      • 步骤2:系统时钟配置
      • 步骤3:GPIO引脚配置
      • 步骤4:串口配置
      • 步骤5:工程生成
    • 五、系统工作流程图
    • 六、完整代码实现
      • 1. 创建文件名:main.c
      • 2. 创建文件名:gpio.c
      • 3. 创建文件名:gpio.h
      • 4. 创建文件名:usart.c
      • 5. 创建文件名:usart.h
      • 6. 创建文件名:delay.c
      • 7. 创建文件名:delay.h
      • 8. 创建文件名:stm32f10x_it.c
      • 9. 创建文件名:stm32f10x_it.h
    • 七、代码编译与下载
      • 步骤1:添加文件到工程
      • 步骤2:编译工程
      • 步骤3:程序下载
    • 八、实物调试与功能验证
      • 步骤1:硬件连接检查
      • 步骤2:串口调试
      • 步骤3:功能测试
    • 九、常见问题解决
    • 十、项目扩展功能

一、项目概述

本项目基于STM32F103C8T6单片机,实现输液液滴自动检测、滴速计算、液位异常报警功能,完全适配医疗输液场景,零基础也能一步步复刻实现。
核心功能:

  1. 红外对管检测输液液滴,无接触式采集信号
  2. 实时计算输液滴速,串口打印数据
  3. 滴速异常/输液完成自动触发蜂鸣器+LED报警
  4. 硬件电路简单、代码开源可直接移植

硬件清单:

  • 主控:STM32F103C8T6最小系统板
  • 检测模块:红外对管(发射管+接收管)
  • 报警模块:有源蜂鸣器、LED指示灯
  • 辅助:杜邦线、USB转TTL模块、5V电源

二、硬件电路连接

所有接线均为直连,无需额外复杂电路,严格按照下表操作:

器件引脚STM32F103引脚功能说明
红外发射管正极3.3V供电
红外发射管负极GND接地
红外接收管输出PA0液滴检测信号输入
红外接收管VCC3.3V供电
红外接收管GNDGND接地
蜂鸣器正极PB0报警控制
蜂鸣器负极GND接地
LED正极PB1状态指示
LED负极GND接地
USB转TTL TXDPA10串口发送
USB转TTL RXDPA9串口接收
USB转TTL GNDSTM32 GND共地

三、开发环境准备

本项目使用Keil5 MDK+STM32CubeMX(零基础推荐,自动生成初始化代码)

  1. 安装Keil5 MDK,添加STM32F1系列芯片库
  2. 安装STM32CubeMX,配置Java环境
  3. 安装USB转TTL驱动
  4. 准备STM32F103C8T6最小系统板

四、STM32CubeMX配置

步骤1:新建工程

  1. 打开STM32CubeMX,点击ACCESS TO MCU SELECTOR
  2. 搜索STM32F103C8T6,选中芯片,点击Start Project

步骤2:系统时钟配置

  1. 点击RCCHSE选择Crystal/Ceramic Resonator
  2. 点击Clock Configuration,设置系统时钟为72MHz

步骤3:GPIO引脚配置

  1. PA0:设置为GPIO_INPUT(液滴检测输入)
  2. PB0:设置为GPIO_OUTPUT(蜂鸣器控制)
  3. PB1:设置为GPIO_OUTPUT(LED指示灯)

步骤4:串口配置

  1. 点击USART1,模式选择Asynchronous
  2. 波特率:115200,数据位8,停止位1,无校验

步骤5:工程生成

  1. 点击Project Manager,设置工程名、存储路径
  2. Toolchain/IDE选择MDK-ARM V5
  3. 点击GENERATE CODE生成工程

五、系统工作流程图

正常

异常/完成

系统上电初始化

红外对管检测液滴信号

检测到液滴?

计数+1, 计算滴速

滴速正常/输液完成?

蜂鸣器+LED报警

六、完整代码实现

所有代码均为标准库函数,无复杂操作,直接替换对应文件即可。

1. 创建文件名:main.c

#include"stm32f10x.h"#include"delay.h"#include"usart.h"#include"gpio.h"// 全局变量定义uint16_tdrop_count=0;// 液滴计数uint32_ttime_count=0;// 计时变量floatdrop_speed=0.0;// 滴速(滴/分钟)uint8_tdrop_flag=0;// 液滴检测标志位// 函数声明voidSystem_Init(void);// 系统总初始化voidDrop_Check(void);// 液滴检测函数voidAlarm_Check(void);// 报警判断函数voidAlarm_On(void);// 报警开启voidAlarm_Off(void);// 报警关闭intmain(void){// 系统初始化System_Init();// 开机提示printf("STM32智能输液监控系统已启动\r\n");printf("===================================\r\n");while(1){Drop_Check();// 实时检测液滴Alarm_Check();// 实时判断报警条件time_count++;// 计时累加// 每1秒计算一次滴速if(time_count>=1000){// 滴速计算公式:60秒内的滴数 = 检测到的滴数 * 60drop_speed=drop_count*60;// 串口打印数据printf("液滴总数:%d 滴\r\n",drop_count);printf("当前滴速:%.1f 滴/分钟\r\n",drop_speed);printf("===================================\r\n");// 重置计时time_count=0;// 重置计数(如需累计总滴数,注释此行)drop_count=0;}delay_ms(1);}}// 系统总初始化:GPIO+串口+延时voidSystem_Init(void){delay_init();// 延时初始化USART1_Init();// 串口初始化GPIO_Init();// GPIO初始化Alarm_Off();// 关闭报警}// 液滴检测函数:红外对管信号判断voidDrop_Check(void){// 红外接收管:无液滴为高电平,有液滴为低电平if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0&&drop_flag==0){drop_flag=1;// 标志位置1,防止重复计数drop_count++;// 液滴计数+1printf("检测到液滴!\r\n");}// 液滴离开,重置标志位if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1){drop_flag=0;}}// 报警判断函数:滴速异常/输液完成触发报警voidAlarm_Check(void){// 条件1:滴速为0(输液完成)// 条件2:滴速超过120滴/分钟(过快异常)if(drop_speed==0||drop_speed>120){Alarm_On();}else{Alarm_Off();}}// 报警开启:蜂鸣器响+LED亮voidAlarm_On(void){GPIO_SetBits(GPIOB,GPIO_Pin_0);// 蜂鸣器开GPIO_SetBits(GPIOB,GPIO_Pin_1);// LED亮}// 报警关闭:蜂鸣器停+LED灭voidAlarm_Off(void){GPIO_ResetBits(GPIOB,GPIO_Pin_0);// 蜂鸣器关GPIO_ResetBits(GPIOB,GPIO_Pin_1);// LED灭}

2. 创建文件名:gpio.c

#include"gpio.h"// GPIO初始化:PA0输入,PB0/PB1推挽输出voidGPIO_Init(void){GPIO_InitTypeDef GPIO_InitStruct;// 开启GPIOA、GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);// PA0:红外接收输入GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;// 浮空输入GPIO_Init(GPIOA,&GPIO_InitStruct);// PB0:蜂鸣器输出,PB1:LED输出GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;// 推挽输出GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;// 速度50MHzGPIO_Init(GPIOB,&GPIO_InitStruct);}

3. 创建文件名:gpio.h

#ifndef__GPIO_H#define__GPIO_H#include"stm32f10x.h"voidGPIO_Init(void);#endif

4. 创建文件名:usart.c

#include"usart.h"// 串口1初始化:波特率115200voidUSART1_Init(void){GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);// PA9:TX 复用推挽输出GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);// PA10:RX 浮空输入GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStruct);// 串口配置USART_InitStruct.USART_BaudRate=115200;USART_InitStruct.USART_WordLength=USART_WordLength_8b;USART_InitStruct.USART_StopBits=USART_StopBits_1;USART_InitStruct.USART_Parity=USART_Parity_No;USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStruct);// 使能串口USART_Cmd(USART1,ENABLE);}// 重定向printf函数,实现串口打印intfputc(intch,FILE*f){USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);returnch;}

5. 创建文件名:usart.h

#ifndef__USART_H#define__USART_H#include"stm32f10x.h"#include<stdio.h>voidUSART1_Init(void);#endif

6. 创建文件名:delay.c

#include"delay.h"// 延时初始化voiddelay_init(void){SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;}// 毫秒延时voiddelay_ms(uint32_tms){uint32_ti;SysTick->LOAD=9000;SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;for(i=0;i<ms;i++){while(!(SysTick->CTRL&(1<<16)));}SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;}// 微秒延时voiddelay_us(uint32_tus){uint32_ti;SysTick->LOAD=9;SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;for(i=0;i<us;i++){while(!(SysTick->CTRL&(1<<16)));}SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;}

7. 创建文件名:delay.h

#ifndef__DELAY_H#define__DELAY_H#include"stm32f10x.h"voiddelay_init(void);voiddelay_ms(uint32_tms);voiddelay_us(uint32_tus);#endif

8. 创建文件名:stm32f10x_it.c

#include"stm32f10x_it.h"voidNMI_Handler(void){}voidHardFault_Handler(void){while(1){}}voidMemManage_Handler(void){while(1){}}voidBusFault_Handler(void){while(1){}}voidUsageFault_Handler(void){while(1){}}voidSVC_Handler(void){}voidDebugMon_Handler(void){}voidPendSV_Handler(void){}voidSysTick_Handler(void){}

9. 创建文件名:stm32f10x_it.h

#ifndef__STM32F10X_IT_H#define__STM32F10X_IT_H#include"stm32f10x.h"#endif

七、代码编译与下载

步骤1:添加文件到工程

  1. 打开Keil5,打开生成的工程
  2. Project中新建分组,将上述所有.c.h文件添加到工程
  3. 配置头文件路径

步骤2:编译工程

  1. 点击Build按钮,无报错、无警告即为编译成功
  2. 若报错,检查文件路径、引脚定义、拼写错误

步骤3:程序下载

  1. 连接ST-Link下载器与STM32开发板
  2. Keil中配置下载器为ST-Link Debugger
  3. 点击Load按钮,下载程序到单片机

八、实物调试与功能验证

步骤1:硬件连接检查

  1. 检查所有接线是否与接线表一致
  2. 红外对管对准输液管滴壶,无遮挡
  3. 蜂鸣器、LED接线无短路

步骤2:串口调试

  1. 打开串口调试助手,波特率选择115200
  2. 系统上电,串口打印启动信息
  3. 用手遮挡红外对管,模拟液滴,串口打印检测到液滴!

步骤3:功能测试

  1. 正常滴速:红外对管检测到液滴,串口实时显示滴速,无报警
  2. 输液完成:无液滴输入,滴速为0,蜂鸣器响、LED亮
  3. 滴速过快:快速遮挡红外对管,滴速超过120,触发报警

九、常见问题解决

  1. 串口无数据输出

    • 检查USB转TTL接线(TX接PA10,RX接PA9)
    • 检查波特率是否为115200
    • 检查共地是否连接
  2. 液滴不计数

    • 红外对管正负极接反
    • 接收管输出引脚未接PA0
    • 红外对管距离过远
  3. 蜂鸣器不报警

    • 蜂鸣器正负极接反
    • PB0引脚配置错误
    • 报警条件未触发
  4. 程序无法下载

    • 下载器接线错误
    • 开发板未上电
    • 芯片选择错误

十、项目扩展功能

  1. 添加OLED屏幕,实时显示滴速、液滴总数
  2. 添加蓝牙模块,实现手机APP远程监控
  3. 添加按键,设置滴速阈值
  4. 添加存储模块,记录输液数据
http://www.jsqmd.com/news/774670/

相关文章:

  • 3秒安全弹出USB设备:告别Windows设备占用难题的高效解决方案
  • AI工具精选列表:从分类解析到实战应用的全方位指南
  • 基于LiveKit与LangGraph构建实时语音AI通话代理的完整指南
  • 2026年质量好的十字型封箱机/封箱机/苏州折盖封箱机/苏州自适应封箱机精选厂家推荐 - 品牌宣传支持者
  • C语言第3讲:分支和循环
  • Kimi K2.5智能设备两周深度体验与性能评测
  • 抖音下载器:免费快速批量下载抖音视频的终极解决方案
  • 2026年质量好的恒压供水水泵/辽宁水冷式水泵优质厂家汇总推荐 - 行业平台推荐
  • 开源智能仪表盘OpenJarvisDashboard:开发者效率工具全解析
  • 别再手动算线宽了!用这个Matlab函数快速搞定微带线设计(附ADS对比验证)
  • 量子计算与高性能计算融合架构解析
  • Twinny:免费离线的AI代码补全工具部署与调优指南
  • 自动驾驶仿真训练平台SIMSCALE的技术解析与应用实践
  • 多核处理器在嵌入式与通信领域的优化实践
  • FedAvg联邦学习实战避坑指南:数据非独立同分布(Non-IID)到底有多坑?
  • 2026年质量好的联合板木箱/木箱/工业设备包装木箱口碑好的厂家推荐 - 行业平台推荐
  • YOLOv8改进 | 检测头篇 |最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)
  • 为AI Agent集成实时搜索能力:基于Council Tavily Search的实践指南
  • 2026年评价高的深井潜水泵/鱼塘潜水泵口碑好的厂家推荐 - 品牌宣传支持者
  • MAX9705 Class D音频放大器低EMI设计解析
  • Windows微信群发工具:告别手动发送,一键批量处理好友消息
  • Touchpoint:基于无障碍API的跨平台桌面自动化Python库详解
  • 【Android】ES文件管理器,此版不提示安装HMS Core。
  • commitlint多场景配置指南:Angular/Conventional/Lerna全支持
  • 功率电子技术:提升能源效率的关键
  • 2026年防火阀厂家推荐-通风工程与管道阀门厂家优选:浙江日鑫自动化系统有限公司 - 栗子测评
  • 2026年比较好的深井水泵/水冷式水泵公司哪家好 - 品牌宣传支持者
  • Karakeep 2026-2031技术愿景:打造AI驱动的一站式个人知识管理平台
  • Python 爬虫高级实战:分布式爬虫集群架构与消息队列调度
  • 基于Godot与C#的开源进化模拟游戏Thrive开发全解析