STM32实战:基于STM32F103的智能输液监控系统(液滴检测+报警)
文章目录一、项目概述二、硬件电路连接三、开发环境准备四、STM32CubeMX配置步骤1新建工程步骤2系统时钟配置步骤3GPIO引脚配置步骤4串口配置步骤5工程生成五、系统工作流程图六、完整代码实现1. 创建文件名main.c2. 创建文件名gpio.c3. 创建文件名gpio.h4. 创建文件名usart.c5. 创建文件名usart.h6. 创建文件名delay.c7. 创建文件名delay.h8. 创建文件名stm32f10x_it.c9. 创建文件名stm32f10x_it.h七、代码编译与下载步骤1添加文件到工程步骤2编译工程步骤3程序下载八、实物调试与功能验证步骤1硬件连接检查步骤2串口调试步骤3功能测试九、常见问题解决十、项目扩展功能一、项目概述本项目基于STM32F103C8T6单片机实现输液液滴自动检测、滴速计算、液位异常报警功能完全适配医疗输液场景零基础也能一步步复刻实现。核心功能红外对管检测输液液滴无接触式采集信号实时计算输液滴速串口打印数据滴速异常/输液完成自动触发蜂鸣器LED报警硬件电路简单、代码开源可直接移植硬件清单主控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 MDKSTM32CubeMX零基础推荐自动生成初始化代码安装Keil5 MDK添加STM32F1系列芯片库安装STM32CubeMX配置Java环境安装USB转TTL驱动准备STM32F103C8T6最小系统板四、STM32CubeMX配置步骤1新建工程打开STM32CubeMX点击ACCESS TO MCU SELECTOR搜索STM32F103C8T6选中芯片点击Start Project步骤2系统时钟配置点击RCCHSE选择Crystal/Ceramic Resonator点击Clock Configuration设置系统时钟为72MHz步骤3GPIO引脚配置PA0设置为GPIO_INPUT液滴检测输入PB0设置为GPIO_OUTPUT蜂鸣器控制PB1设置为GPIO_OUTPUTLED指示灯步骤4串口配置点击USART1模式选择Asynchronous波特率115200数据位8停止位1无校验步骤5工程生成点击Project Manager设置工程名、存储路径Toolchain/IDE选择MDK-ARM V5点击GENERATE CODE生成工程五、系统工作流程图否是正常异常/完成系统上电初始化红外对管检测液滴信号检测到液滴?计数1, 计算滴速滴速正常/输液完成?蜂鸣器LED报警六、完整代码实现所有代码均为标准库函数无复杂操作直接替换对应文件即可。1. 创建文件名main.c#includestm32f10x.h#includedelay.h#includeusart.h#includegpio.h// 全局变量定义uint16_tdrop_count0;// 液滴计数uint32_ttime_count0;// 计时变量floatdrop_speed0.0;// 滴速滴/分钟uint8_tdrop_flag0;// 液滴检测标志位// 函数声明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_count1000){// 滴速计算公式60秒内的滴数 检测到的滴数 * 60drop_speeddrop_count*60;// 串口打印数据printf(液滴总数%d 滴\r\n,drop_count);printf(当前滴速%.1f 滴/分钟\r\n,drop_speed);printf(\r\n);// 重置计时time_count0;// 重置计数如需累计总滴数注释此行drop_count0;}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)0drop_flag0){drop_flag1;// 标志位置1防止重复计数drop_count;// 液滴计数1printf(检测到液滴\r\n);}// 液滴离开重置标志位if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)1){drop_flag0;}}// 报警判断函数滴速异常/输液完成触发报警voidAlarm_Check(void){// 条件1滴速为0输液完成// 条件2滴速超过120滴/分钟过快异常if(drop_speed0||drop_speed120){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#includegpio.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_PinGPIO_Pin_0;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IN_FLOATING;// 浮空输入GPIO_Init(GPIOA,GPIO_InitStruct);// PB0蜂鸣器输出PB1LED输出GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;// 推挽输出GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;// 速度50MHzGPIO_Init(GPIOB,GPIO_InitStruct);}3. 创建文件名gpio.h#ifndef__GPIO_H#define__GPIO_H#includestm32f10x.hvoidGPIO_Init(void);#endif4. 创建文件名usart.c#includeusart.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);// PA9TX 复用推挽输出GPIO_InitStruct.GPIO_PinGPIO_Pin_9;GPIO_InitStruct.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);// PA10RX 浮空输入GPIO_InitStruct.GPIO_PinGPIO_Pin_10;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,GPIO_InitStruct);// 串口配置USART_InitStruct.USART_BaudRate115200;USART_InitStruct.USART_WordLengthUSART_WordLength_8b;USART_InitStruct.USART_StopBitsUSART_StopBits_1;USART_InitStruct.USART_ParityUSART_Parity_No;USART_InitStruct.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_InitStruct.USART_ModeUSART_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#includestm32f10x.h#includestdio.hvoidUSART1_Init(void);#endif6. 创建文件名delay.c#includedelay.h// 延时初始化voiddelay_init(void){SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);SysTick-CTRL~SysTick_CTRL_ENABLE_Msk;}// 毫秒延时voiddelay_ms(uint32_tms){uint32_ti;SysTick-LOAD9000;SysTick-CTRL|SysTick_CTRL_ENABLE_Msk;for(i0;ims;i){while(!(SysTick-CTRL(116)));}SysTick-CTRL~SysTick_CTRL_ENABLE_Msk;}// 微秒延时voiddelay_us(uint32_tus){uint32_ti;SysTick-LOAD9;SysTick-CTRL|SysTick_CTRL_ENABLE_Msk;for(i0;ius;i){while(!(SysTick-CTRL(116)));}SysTick-CTRL~SysTick_CTRL_ENABLE_Msk;}7. 创建文件名delay.h#ifndef__DELAY_H#define__DELAY_H#includestm32f10x.hvoiddelay_init(void);voiddelay_ms(uint32_tms);voiddelay_us(uint32_tus);#endif8. 创建文件名stm32f10x_it.c#includestm32f10x_it.hvoidNMI_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#includestm32f10x.h#endif七、代码编译与下载步骤1添加文件到工程打开Keil5打开生成的工程在Project中新建分组将上述所有.c和.h文件添加到工程配置头文件路径步骤2编译工程点击Build按钮无报错、无警告即为编译成功若报错检查文件路径、引脚定义、拼写错误步骤3程序下载连接ST-Link下载器与STM32开发板Keil中配置下载器为ST-Link Debugger点击Load按钮下载程序到单片机八、实物调试与功能验证步骤1硬件连接检查检查所有接线是否与接线表一致红外对管对准输液管滴壶无遮挡蜂鸣器、LED接线无短路步骤2串口调试打开串口调试助手波特率选择115200系统上电串口打印启动信息用手遮挡红外对管模拟液滴串口打印检测到液滴步骤3功能测试正常滴速红外对管检测到液滴串口实时显示滴速无报警输液完成无液滴输入滴速为0蜂鸣器响、LED亮滴速过快快速遮挡红外对管滴速超过120触发报警九、常见问题解决串口无数据输出检查USB转TTL接线TX接PA10RX接PA9检查波特率是否为115200检查共地是否连接液滴不计数红外对管正负极接反接收管输出引脚未接PA0红外对管距离过远蜂鸣器不报警蜂鸣器正负极接反PB0引脚配置错误报警条件未触发程序无法下载下载器接线错误开发板未上电芯片选择错误十、项目扩展功能添加OLED屏幕实时显示滴速、液滴总数添加蓝牙模块实现手机APP远程监控添加按键设置滴速阈值添加存储模块记录输液数据