在这里插入代码片
最近设计了一个项目基于单片机的身体参监测系统,与大家分享一下:
一、基本介绍
单片机类型:STM32F103C8T6
具体功能:
1、通过MLX90614监测当前的体温,监测到体温不在设置的阈值内声光报警;
2、通过心率检测模块检测当前用户的心率,监测到心率不在设置的阈值内声光报警;
3、通过血压监测模块监测当前用户的血压,监测到血压不在设置的阈值内声光报警;
4、通过按键设置各阈值,启停体温、心率、血压监测;
5、通过OLED显示测试的数据;
二、32实物图
单片机型号:STM32F103C8T6
板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。
供电接口:TYPE-C
三、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
四、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
五、系统框图
此次设计是基于STM32F103C8T6单片机的身体参数监测系统;该设计主要可以分为三部分:输入、输出和中控。中控部分采用STM32F103C8T6单片机作为主控芯片,主要是对输入进行处理然后控制输出;输入又可以分为五部分:第一部分是体温检测模块,通过该模块获取当前人体温度;第二部分是心率检测模块,通过此模块可以监测当前人体心率数据;第三部分是血压监测模块,由此模块可以检测当前人体血压数据。第四部分是按键模块,通过按键可以设置阈值以及控制继电器的开关;第五部分是供电电路,主要是用来对整个系统进行供电;输出主要可以分为二个部分:第一部分是显示部分,显示当前人体的体温,心率,血压数据;第二部分是声光报警模块,该模块用于当测量值超过设定的阈值时进行声光报警。
六、软件设计流程
七、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
函数名:按键函数
传参值:无
返回值:无
**********************************/
void Key_Function(void)
{
key_num = Chiclet_Keyboard_Scan(0); //按键扫描,获取键值
if(key_num != 0) //有按键按下
{
switch(key_num)
{
case 1: //按键1:切换界面
display_num++;
if(display_num >= 7)
{
display_num = 0;
}
Oled_Clear_All(); //清屏
break;
case 2: //按键2切换监测数据
switch(display_num)
{
case 0:
flag_select++;
if(flag_select >= 4)
{
flag_select = 0;
}
break;
case 1: //界面1:温度最大值+1
if(temp_max < 99)
temp_max++;
break;
case 2: //界面2:温度最小值+1
if(temp_min < temp_max-1)
temp_min++;
break;
case 3: //界面3:心率最大值+1
if(pulse_max < 200)
pulse_max++;
break;
case 4: //界面4:心率最小值+1
if(pulse_min < pulse_max-1)
pulse_min++;
break;
case 5: //界面5:血压值最大值+1
if(blood_h_max < 200)
{
blood_h_max++;
}
break;
case 6: //界面6:血压值最小值+1
if(blood_h_min < blood_h_max - 1)
{
blood_h_min++;
}
break;
default:
break;
}
break;
case 3: //按键3监测与清零
switch(display_num)
{
case 0:
if(flag_select > 0)
flag_cl++;
if(flag_cl >= 3)
{
flag_cl = 0;
}
break;
case 1: //界面1:温度最大值-1
if(temp_max > temp_min+1)
temp_max--;
break;
case 2: //界面2:温度最小值-1
if(temp_min > 0)
temp_min--;
break;
case 3: //界面3:心率最大值-1
if(pulse_max > pulse_min+1)
pulse_max--;
break;
case 4: //界面4:心率最小值-1
if(pulse_min > 0)
pulse_min--;
break;
case 5: //界面5:血压值最大值-1
if(blood_h_max > blood_h_min+1)
blood_h_max --;
break;
case 6: //界面6:血压值最小值-1
if(blood_h_min> 0)
blood_h_min --;
break;
default:
break;
}
break;
default:
break;
}
}
}