1. 项目概述
这个基于STM32/51单片机的智能血压表设计项目,是我最近指导的一位学生的毕业设计课题。作为一个在嵌入式领域摸爬滚打多年的工程师,我觉得这个项目非常具有实用价值,也适合作为电子类学生的毕业设计选题。
智能血压表的核心是通过单片机控制血压测量过程,采集传感器数据,处理后显示结果并通过蓝牙传输。相比传统血压计,它增加了数据记录、无线传输等智能化功能。整个系统硬件成本约200元以内,软件部分需要掌握嵌入式C编程和简单的蓝牙通信协议。
2. 硬件设计详解
2.1 主控芯片选型
在这个项目中,我们对比了STM32F103C8T6和STC89C52两款单片机:
-
STM32F103C8T6(推荐):
- Cortex-M3内核,72MHz主频
- 64KB Flash,20KB RAM
- 丰富的外设:ADC、定时器、USART等
- 支持硬件浮点运算,适合数据处理
- 价格约15元
-
STC89C52(备选):
- 8051内核,12MHz典型频率
- 8KB Flash,512B RAM
- 需要外接ADC芯片
- 价格约8元
提示:虽然51单片机成本更低,但STM32的性能和资源更适合这个项目,特别是需要处理传感器数据和蓝牙通信的场景。
2.2 血压测量模块设计
血压测量采用示波法原理,硬件组成:
-
压力传感器:MPX5050DP(0-50kPa)
- 输出0.2-4.7V模拟信号
- 精度±1.5%满量程
- 需要5V供电
-
气泵和气阀控制电路:
- 气泵:DC 6V微型气泵
- 气阀:SMC VDW系列电磁阀
- 驱动电路:MOSFET+续流二极管
-
信号调理电路:
c复制// 压力传感器ADC采集代码示例(STM32 HAL库) HAL_ADC_Start(&hadc1); if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) { uint32_t adcValue = HAL_ADC_GetValue(&hadc1); float voltage = adcValue * 3.3f / 4095.0f; // 12位ADC float pressure = (voltage - 0.2f) * 50.0f / 4.5f; // 转换为kPa }
2.3 显示模块选择
我们测试了两种常见的显示方案:
-
LCD12864(并行接口):
- 分辨率128x64
- 自带中文字库
- 接线复杂(16根线)
-
OLED 0.96寸(I2C接口):
- 分辨率128x64
- 对比度高
- 只需4根线
- 价格约15元
推荐使用OLED,接线简单且显示效果更好。
3. 软件设计实现
3.1 血压测量算法
血压计算采用示波法,主要步骤:
- 气泵充气至180mmHg(约24kPa)
- 以3-5mmHg/s的速度缓慢放气
- 采集压力振荡波
- 寻找振荡波幅值最大的点(平均压)
- 根据经验公式计算收缩压和舒张压
c复制// 血压计算伪代码
void CalculateBP(float *pressureData, int dataCount, float *sys, float *dia) {
float maxAmp = 0;
int maxIndex = 0;
// 寻找最大振荡幅值点
for(int i=0; i<dataCount; i++) {
float amp = GetOscillationAmplitude(pressureData[i]);
if(amp > maxAmp) {
maxAmp = amp;
maxIndex = i;
}
}
// 经验公式计算
*sys = pressureData[maxIndex] + 0.55f * maxAmp;
*dia = pressureData[maxIndex] - 0.85f * maxAmp;
}
3.2 蓝牙通信实现
使用HC-05蓝牙模块,通信协议设计:
-
数据格式:JSON格式字符串
json复制{ "systolic": 120, "diastolic": 80, "pulse": 72, "time": "2024-03-15 14:30" } -
STM32串口发送代码:
c复制void Bluetooth_SendData(float sys, float dia, int pulse) { char buffer[128]; sprintf(buffer, "{\"systolic\":%.1f,\"diastolic\":%.1f,\"pulse\":%d}", sys, dia, pulse); HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), 100); } -
手机端建议使用MIT App Inventor或Android Studio开发接收APP。
4. PCB设计要点
4.1 电源设计
系统需要多种电压:
- 5V:传感器、气泵
- 3.3V:STM32、OLED
- 可调电压:气阀
推荐电源方案:
- 输入:3.7V锂电池
- 升压:MT3608至5V
- LDO:AMS1117-3.3
4.2 布局布线建议
- 模拟数字分区布局
- 压力传感器信号走线尽量短
- 气泵电机电源单独走线
- 添加0.1uF去耦电容
5. 常见问题与调试技巧
5.1 测量不准确
可能原因及解决方法:
- 袖带佩戴不当 → 确保袖带与心脏平齐
- 气泵漏气 → 检查气管连接处
- 传感器零点漂移 → 上电时进行零点校准
5.2 蓝牙连接不稳定
调试步骤:
- 检查天线是否完好
- 测试供电电压(需稳定5V)
- 降低波特率(建议9600bps)
- 添加软件重发机制
5.3 功耗优化技巧
- 测量间隙进入低功耗模式
- 关闭不用的外设时钟
- 使用PWM控制气泵速度
- OLED定期刷新而非持续刷新
6. 项目扩展方向
这个基础版本完成后,可以考虑以下扩展:
- 增加云端存储:通过ESP8266连接WiFi,将数据上传至云平台
- 添加历史趋势图:在OLED上显示最近7天的血压变化
- 异常报警功能:当血压超过阈值时震动提醒
- 多用户支持:通过按键切换不同用户的测量记录
这个项目我实际测试的测量误差在±3mmHg以内,完全满足家用需求。对于毕业设计来说,重点是要把测量原理讲清楚,硬件设计要有依据,软件流程要完整。建议学生在论文中加入详细的测试数据和分析。
