基于stm32的脉搏血氧仪设计

📅 2026/8/10 16:48:06
基于stm32的脉搏血氧仪设计
目录一、设计概述 1二、设计方案 21、设计任务 21.对传感器输出的模拟信号进行AD转换 22.在屏幕显示脉搏波形 23.测量并显示心率与体温 24.可与上位机通过USB接口通信 25.按键与屏幕多级菜单设计进行人机交互 26.自动检测设备连接状态 27.数据通过ESP01S上传到服务器实现远程监测 22、设计思路 2三、 硬件电路设计 3四、 系统程序设计 4五、 传感器简介 81、Pulse sensor 8图四 Pulse Sensor传感器 92、NTC负温度系数热敏电阻 9图五 NTC电阻温度曲线 93、MAX30102血氧模块 9图六 MAX30102模块 10六、成果展示 10图七 总装配图 11图八 脉搏波测量 11七、调试中出现问题的解决 121、调试遇到的问题 122、问题的解决 12八、收获体会 13九、器件明细清单 14参 考 文 献 15二、设计方案1、设计任务1.对传感器输出的模拟信号进行AD转换2.在屏幕显示脉搏波形3.测量并显示心率与体温4.可与上位机通过USB接口通信5.按键与屏幕多级菜单设计进行人机交互按键向上向下返回确定6.自动检测设备连接状态7.数据通过ESP01S上传到服务器实现远程监测2、设计思路1.采用stm32固件库开发2.对脉搏传感器输出的模拟信号进行AD转换采样频率100次每秒3.转化结果采用DMA传输避免频繁进入中断4.开启两个串口USART1用来调试USART2用来发送HTTP报文5.电源采用可充电电池供电6.采用查表法与线性插值法获取温度7.按键与LCD液晶屏多级菜单设计进行人机交互按键采用外部中断向上向下返回确定屏幕显示体温血氧浓度脉搏波波形四、系统程序设计1、程序设计思想毕业设计所需功能较为简单无需操作系统使用裸机编程足够应对需求。故采用裸机编程方式。裸机系统通常分成轮询系统和前后台系统。轮询系统即是在裸机编程的时候先初始化好相关的硬件然后让主程序在一个死循环里面不断循环顺序地做各种事情。轮询系统是一种非常简单的软件结构通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动 的就能完成的事情。例如只是实现 LED 翻转串口输出液晶显示等 这些操作那么使用轮询系统将会非常完美。本文转载自http://www.biyezuopin.vip/onews.asp?id14972但是如果加入了按键操作等需要检测外部 信号的事件用来模拟紧急报警那么整个系统的实时响应能力就不会那么好了。故轮询系统只适合顺序执行的功能代码当有外部事件驱动时实时性就会降低。1 int main(void) 2 { 3 /* 硬件相关初始化 */ 4 HardWareInit(); 5 6 /* 无限循环 */ 7 for (;;) { 8 /* 处理事情 1 */ 9 DoSomething1(); 10 /* 处理事情 2 */ 11 DoSomething2(); 12 /* 处理事情 3 */ 13 DoSomething3(); 14 } 15 }相比轮询系统前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成事件的处理还是回到轮询系统中完成中断在这里我们称为前台main 函数 里面的无限循环我们称为后台在顺序执行后台程序的时候如果有中断来临那么中断会打断后台程序的正常执行流转而去执行中断服务程序在中断服务程序里面标记事件如果事件要处理的事情很简短则可在中断服务程序里面处理如果事件要处理的事情比较多则返回到后台程序里面处理。虽然事件的响应和处理是分开了但是事件的处理还是在后台里面顺序执行的但相比轮询系统前后台系统确保了事件不会丢失再加上中断具有可嵌套的功能这可以大大的提高程序的实时响应能力。在大多数的中小型项目中前后台系统运用的好堪称有操作系统的效果。1 int flag1 0; 2 int flag2 0; 3 4 int main(void) 5 { 6 /* 硬件相关初始化 */ 7 HardWareInit(); 8 9 /* 无限循环 */ 10 for (;;) { 11 if (flag1) { 12 /* 处理事情 1 */ 13 DoSomething1(); 14 } 15 16 if (flag2) { 17 /* 处理事情 2 */ 18 DoSomething2(); 19 } 20 21 } 22 }尽管前后台系统利用中断一定程度上提升了轮询系统的实时性但它并不完美。因为它将所有有可能要做的任务在死循环中无差别循环执行CPU不停歇工作而这些工作很多是不必要的。相比前后台系统中后台顺序执行的程序主体在多任务系统中根据程序的功能我 们把这个程序主体分割成一个个独立的无限循环且不能返回的小程序这个小程序我们 称之为任务。每个任务都是独立的互不干扰的所以相比前后台系统多任务系统的事件响应也是在中断中完成的但是事件的处理是在任务中完成的。在多任务系统中任务跟中断一样也具有优先级优先级高的任务会被优先执行。当一个紧急的事件在中断被标记之后如果事件对应的任务的优先级足够高就会立马得到响应。相比前后台系统多任务系统的实时性又被提高了。1 void DoSomething1(void) 2 { 3 /* 无限循环不能返回 */ 4 for (;;) { 5 / * 任务实体 */ 6 if (flag1) { 7 8 } 9 } 10 } 11 12 void DoSomething2(void) 13 { 14 /* 无限循环不能返回 */ 15 for (;;) { 16 /* 任务实体 */ 17 if (flag2) { 18 19 } 20 } 21 }