基于STM32单片机的人体健康体测仪(Proteus仿真+程序)

编号:16

基于STM32单片机的人体健康体测仪

功能描述:

本设计由STM32单片机+DS18B20温度传感器+称重传感器(电位器通过A/D转换模拟)+HC_SR04超声波模块+键盘模拟+OLED显示模块组成。
1、主控制器是STM32单片机
2、通过HC_SR04超声波模块测量身高,有DS18B20温度传感器进行温度补偿,使精度更大;
3、10K电位器通过STM32内部A/D转换器进行A/D转换,用来模拟称重传感器实现称重,量程0-200kg;
4、OLED显示身高、体重;通过公式计算出BMI,得出体重指数辨别是否肥胖;
5、三个按键进行相关信息设置,可设置被测人性别、年龄。通过以上数据计算体脂率进行显示。

注意:proteus8.11版本才能打开 

视频演示链接:

https://www.bilibili.com/video/BV1f14y1G7ZJ/?spm_id_from=333.999.0.0

仿真图:

信息设定界面

程序源码:

/***********************************************

***********************************************/
#include "delay.h"
#include "key.h"
#include "timer.h"
#include "ds18b20.h"
#include "HCSR04.h"
#include "adc.h"
#include "OLED_I2C.h" 

#include "stdio.h" 	
#include "stdlib.h" 	

extern unsigned char Age ;						//年龄

extern unsigned char Gender; 					//0 :女 1:男

short temprature;		   			   			//定义温度变量

extern unsigned int Weight;						//体重
float Height = 0;								//身高
float BMI = 0;									//bmi指数的计算公式为体重(KG)除以身高(M)的平方				
float Fat = 0;									//体脂率

void Dis_Init(void)
{

	
	
	OLED_ShowStr(0,0,"BMI",2); 
	
	OLED_ShowCN(16*5,0,30);			//体脂率
	OLED_ShowCN(16*6,0,31);
	OLED_ShowCN(16*7,0,32);
	
	OLED_ShowCN(0,2,0);				//身高
	OLED_ShowCN(16,2,1);
	
	OLED_ShowCN(0,4,2);				//体重
	OLED_ShowCN(16,4,3);



	OLED_ShowCN(16*0,6,16);			//体重指数
	OLED_ShowCN(16*1,6,17);
	OLED_ShowStr(16*2,6,":",2); 
}


int main(void)
{	

	unsigned int distance = 0;			//距离
	unsigned char buf[16];
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	OLED_Init();                                    //OLED初始化操作
	OLED_CLS();                                     //OLED清除屏幕	
	Dis_Init();
	DS18B20_Init();
	while(DS18B20_Init()!=0)						//ds18b20初始化检测  
	{
        OLED_ShowStr(0,0,(u8 *)" DS18B20 Error! ",2);
        delay_ms(800);
        OLED_ShowStr(0,0,(u8 *)"                ",2);
        delay_ms(800);
	}
	TIM3_Int_Init(499,7199);						//10Khz的计数频率,计数到500为50ms 
	KEY_Init();										//初始化端口
	Adc_Init();
	
	HCSR04_Init();									//超声波模块相关初始化
	while(1)										//等待温度传感器稳定
	{
		temprature = DS18B20_Get_Temp();	    	//读取温度
		delay_ms(100);
		if(temprature!=850)
			break;
	}
	
 	while(1)
	{	
		if(flag_timer==1)						//200毫秒赋一次值 flag_timer是标志位
		{	
			flag_timer = 0;						//清除标志  等待下一次600ms

			temprature = DS18B20_Get_Temp();	    //读取温度
			Get_Weight();	
			sprintf((char *)buf,(const char *)":%5.1fkg",(float)Weight/1000);

			OLED_ShowStr(16*2,4,buf,2);
			
			
			if(HCSR04_Count(&distance)==0)		//测距 将距离值传递给distance
			{
				sprintf((char *)buf,(const char *)":%3dcm",distance);				
						
			}
			else
			{
				sprintf((char *)buf,(const char *)":---cm");			
			}
			OLED_ShowStr(16*2,2,buf,2); 

			Height = (float)distance/100;
			BMI = Weight/1000/(Height*Height);	
			
			sprintf((char *)buf,(const char *)":%4.1f",BMI);
			OLED_ShowStr(16*1+8,0,buf,2);              	//显示BMI
			
			
			Fat = 1.2*BMI + 0.23 * Age -5.4-10.8* Gender;
			sprintf((char *)buf,(const char *)"%4.1f%%",Fat);
			if(Fat<50)
				OLED_ShowStr(16*5+8,2,buf,2);          //显示体脂率
			/*
			1、正常:18-24;

			2、超重:24-27.5;

			3、肥胖:超过27.5;

			4、轻度肥胖:27.5-32.5;

			5、中度肥胖:32.5-37.5;

			6、重度肥胖:37.5以上;

			7、极重度肥胖:超过50。
			*/
			if(BMI<18)				//过轻
			{
				OLED_ShowCN(16*2+8,6,34);
				OLED_ShowCN(16*3+8,6,35);
			}
			if(BMI>=18&&BMI<24)		//正常
			{
				OLED_ShowCN(16*2+8,6,4);
				OLED_ShowCN(16*3+8,6,5);	
			}
			if(BMI>=24&&BMI<27.5)	//超重
			{
				OLED_ShowCN(16*2+8,6,6);
				OLED_ShowCN(16*3+8,6,7);
			}
			if(BMI>=27.5&&BMI<32.5)	//轻度肥胖
			{
				OLED_ShowCN(16*2+8,6,10);
				OLED_ShowCN(16*3+8,6,33);
				OLED_ShowCN(16*4+8,6,8);
				OLED_ShowCN(16*5+8,6,9);
			}
			if(BMI>=32.5&&BMI<37.5)	//中度肥胖
			{
				OLED_ShowCN(16*2+8,6,11);
				OLED_ShowCN(16*3+8,6,33);
				OLED_ShowCN(16*4+8,6,8);
				OLED_ShowCN(16*5+8,6,9);
			}
			if(BMI>=37.5&&BMI<50)	//重度肥胖
			{
				OLED_ShowCN(16*2+8,6,12);
				OLED_ShowCN(16*3+8,6,33);
				OLED_ShowCN(16*4+8,6,8);
				OLED_ShowCN(16*5+8,6,9);
			}
			if(BMI>=50)				//极度肥胖
			{
				OLED_ShowCN(16*2+8,6,13);
				OLED_ShowCN(16*3+8,6,33);
				OLED_ShowCN(16*4+8,6,8);
				OLED_ShowCN(16*5+8,6,9);
			}
			
			
		}	
		KEY_Set();
	
		
		
		
	}	
}

软件免费下载地址:

1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包

链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w 
提取码:2756 


3、KEIL5 MDK软件(STM32开发软件)
链接:https://pan.baidu.com/s/1t3eY-3yRdTa7jZMlijq_jg 

提取码:ab58 

文件下载:

https://pan.baidu.com/s/1jkwimd1hZ1IX5_gj4rf8Ew?pwd=j4ev

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机技能设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值