最近设计了一个项目基于单片机的血压测量仪系统设计,与大家分享一下:
一、基本介绍
项目名:血压测量仪
项目编号:mcuclub-dz-013
单片机:STC89C52
功能简介:
1、通过血压计模块检测血压,分为收缩压和舒张压
2、通过按键可设置正常的收缩压和舒张压阈值(收缩压在90-140mmHg、舒张压在60-90mmHg)
3、通过语音播报测量数据,并提示收缩压和舒张压是否正常
4、通过LCD1602显示收缩压和舒张压
5、通过蓝牙模块获取测量数据,并提示收缩压和舒张压是否正常
二、51实物图
单片机型号:STC89C52
板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。
供电接口:TYPE-C
三、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
四、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
五、系统框图
本课题血压检测仪,硬件采用六部分组成,第一部分是按键模块,用户通过按键进行界面的切换及其高血压及其低血压值的设置;第二部分是血压监测模块,通过该模块监测血压值;第三部分是供电模块,给整个系统进行供电;第四部分LCD1602液晶显示模块,将监测的血压和设置的血压进行显示;第五部分是语音播报模块,播报监测的血压数据及其当前血压是否正常;第六部分是蓝牙模块,通过该模块,用户可以通过手机查看当前监测的血压值。。
六、软件设计流程
系统的主流程图如图4-2所示。在主程序中:首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先进入第一个函数按键函数,单片机通过扫描按键是否按下,监测到按键按下,执行对应的处理,如切换界面,设置收缩压和舒张压;然后进入第二个函数监测函数,通过调用收缩压和舒张压的函数获取当前的收缩压和舒张压;然后进入第三个函数显示函数,不同的显示界面,显示不同的内容;最后进入第四个函数,处理函数,正常范围内蓝牙发送收缩压数值,语音播报收缩压正常,异常范围内蓝牙发送收缩压数值,语音播报收缩压异常,正常范围内蓝牙发送舒张压数值,语音播报舒张压正常,异常范围内蓝牙发送舒张压数值,语音播报舒张压异常。
七、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
*******处理函数
*****/
void Manage_function(void)
{
if(flag_display == 0) //测量界面
{
if(flag_blood == 0) //测量收缩压
{
if(flag_play_shrink == 1) //收缩压测量完成
{
if(shrink_value < shrink_max && shrink_value > shrink_min) //正常范围内蓝牙发送收缩压数值,语音播报收缩压正常
{
sprintf(send_buf,"收缩压:%dmmHg\r\n",shrink_value);
Uart1_Sent_Str(send_buf);
Uart2_Sent_Str("收缩压正\xfd常");
Delay_function(1000);
flag_play_shrink = 0;
flag_play_diastole = 0;
flag_blood = 1;
}
else //异常范围内蓝牙发送收缩压数值,语音播报收缩压异常
{
sprintf(send_buf,"收缩压:%dmmHg\r\n",shrink_value);
Uart1_Sent_Str(send_buf);
Uart2_Sent_Str("收缩压异常");
Delay_function(1000);
flag_play_shrink = 0;
flag_play_diastole = 0;
flag_blood = 1;
}
}
}
else //测量舒张压
{
if(flag_play_diastole == 1) //舒张压测量完成
{
if(diastole_value < diastole_max && diastole_value > diastole_min)
{
sprintf(send_buf,"舒张压:%dmmHg\r\n",diastole_value); //正常范围内蓝牙发送舒张压数值,语音播报舒张压正常
Uart1_Sent_Str(send_buf);
Uart2_Sent_Str("舒张压正\xfd常");
Delay_function(1000);
flag_play_diastole = 0;
flag_play_shrink = 0;
diastole_value = 0;
flag_blood = 0;
}
else
{
sprintf(send_buf,"舒张压:%dmmHg\r\n",diastole_value); //异常范围内蓝牙发送舒张压数值,语音播报舒张压异常
Uart1_Sent_Str(send_buf);
Uart2_Sent_Str("舒张压异常");
Delay_function(1000);
flag_play_diastole = 0;
flag_play_shrink = 0;
diastole_value = 0;
flag_blood = 0;
}
}
}
}
}