51系列--人体身高体重BMI指数检测健康秤

news2024/10/20 15:40:51
本文主要介绍基于51单片机实现的人体身高体重BMI指数检测健康秤称设计(程序、电路图、PCB以及文档说明书见文末链接)

一、简介

本系统由STC89C52单片机、LCD1602液晶显示、按键、超声波测距、HX711称重传感器模块(0-1000KG)以及模块电源组成。

主要功能介绍如下:
(1)称重传感器进行人体称重,测量范围0-1000kg,实时显示在液晶上。
(2)超声波测量的距离,测量范围0-5m,显示在液晶上。
(3)按键按下,进行BMI值进行计算。BMI值等于重量除以身高的平方。
如果BMI低于18.5,则显示“过轻”字样、如果BMI在18.5-23.9之间,则显示“正常”字样、如果BMI高于24,则显示“过重”字样。
注意:称重/压力传感器上电时,保持没有重物,去皮功能。

二、详细设计方案

(1)电路图设计
单片机最小系统选用STC89C52单片机;称重传感器选用YZC-516C-1T称重传感器模块,并通过HX711专用的24位精度AD转换模块转换后传给单片机系统;身高测量选用的是HC-SR04超声传感器,基于超声波测距功能实现身高测量;
此外还包括LCD1602液晶显示电路、电源供电电路等,具体如下图所示

在这里插入图片描述
(2)PCB设计
PCB设计方案如下图所示,使用的是Altium designer软件
在这里插入图片描述
(3)源程序代码

void main(void)
{
    TMOD|=0x01;		   //设T0为方式1,GATE=1;
    TH0=0;
    TL0=0;
    TIM2Inital();        //定时器初始化
    UART_Init(); //初始化串口

//    led_gl = 0;DelayMs(100);led_gl = 1;
    
    LCD_Init();//初始化液晶显示
    LCD_Clear();
    LCD_Write_String(0,0,"Init.. ");
    
    i = 5;startCheckWireLess=1;//启动检测无线
    while(i-- && wirelessFlag == 0) //此时判断是无线类型
    {UartSendString("ATE0\r\n");  DelayMs(100);}   
    startCheckWireLess=0;
    if(wirelessFlag == 1)
    {
        i = 50;while(i--){DelayMs(100);}//wifi启动 必须延时一定时间        
    //    UartSendString("AT+CWMODE_CUR=3\r\n");// 设置模式
    //    DelayMs(50); 
    //    UartSendString("AT+CWSAP=\"AUAISOUT000\",\"\",1,0\r\n");//设置网络名字及密码
    //    DelayMs(50);
    //    UartSendString("AT+CIPAP_CUR=\"10.10.10.11\"\r\n");//设置本机ip
    //    DelayMs(50);
    //    UartSendString("AT+CIPMODE=0\r\n");//设置ip模式
    //    DelayMs(50);
        UartSendString("AT+CIPMUX=1\r\n");//打开多连接
        DelayMs(50);
        UartSendString("AT+CIPSERVER=1,8080\r\n");//启动端口号
        DelayMs(50);   //以上作为服务端 局域网    
    }
	Weight_Maopi = HX711_Read();  	//读取去皮重量
	DelayMs(10);
	Weight_Maopi = HX711_Read();    

    while(1)
    {
        if(disFlag == 1)  //更新显示
        {
            disFlag = 0;

            csbDelater++;  //声音处理计数
            if(csbDelater>=4) //声音处理
            {
                csbDelater = 0;
                Trip=1;			   //启动一次模块		//不可以使用其他终端 容易造成死循环
                DelayUs2x(4);
                Trip=0;
                while(!Echo);		//当RX为零时等待
                TR0=1;			    //开启计数
                while(Echo);			//当RX为1计数并等待
                TR0=0;
                JlCoun=(long)(TH0*256+TL0);	 //计算数据
                JuLi=(float)(JlCoun*17)/100.0*1.08/1000;     //算出来是m 因为是11.0592M的晶振 11.0592/12
                if(JuLi > 9.99) JuLi = 8.88;//数据超出测量范围
            }

            readWeightFlag++;//计数
            if(readWeightFlag > 3)//达到一定时间 读取重量
            {
                readWeightFlag = 0;//清空标志

                Weight_Shiwu = HX711_Read();	 		//读取实物重量
                Weight_Shiwu = Weight_Maopi - Weight_Shiwu;// Weight_Shiwu - Weight_Maopi;		//获取净重

                if(Weight_Shiwu > 10)	//过滤错误		
                {	
                    Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/430);	//kg计算实物的实际重量		该称重值 针对0-1000kg的传感器												
                }
                else
                {	Weight_Shiwu = 0;}
                if(Weight_Shiwu < 50 ) Weight_Shiwu = 0;	//体重过低清空               
            }
            
			if(key == 0 || getBMIFlag ==1)   //按键按下或者接收到获取命令
			{
                getBMIFlag =0;//清空标志
				if(JuLi > 0)BMI = Weight_Shiwu/10/JuLi/JuLi;	//防止出现除数为0//计算BMI
				else {BMI = 0;}			
			}

			sprintf(dis0,"H:%3.2fm G:%04.1fKg" ,JuLi,(float)Weight_Shiwu/10);//打印	显示	  
			LCD_Write_String(0,0,dis0);//打印显	
			if(BMI <= 18.5)//体重过轻
			{
				sprintf(dis1,"BMI:%4.1f  GQ   " ,BMI);//打印			
			}
			else if(BMI <= 23.9)  //体重合适
			{
				sprintf(dis1,"BMI:%4.1f  ZC   " ,BMI);//打印			
			}
			else	 //体重过重
			{
				sprintf(dis1,"BMI:%4.1f  GZ   " ,BMI);//打印				
			}	
			LCD_Write_String(0,1,dis1);//打印显           
            
            sendDataFlag++;
            if(sendDataFlag >= 8)//发送数据计数	发送蓝牙数据
            {
                sendDataFlag =	0;		//定时发送数据清空
                
                sprintf(dis0,"身高:%3.2fm 体重:%04.1fKg \r\n" ,JuLi,(float)Weight_Shiwu/10);         
                sprintf(dis0,"%sBMI值:%4.1f\r\n" , dis0 , BMI); 
                if(BMI <= 18.5)//体重过轻
                {
                    sprintf(dis0,"%s参考分析:体重过轻\r\n\r\n" , dis0 ); 		
                }
                else if(BMI <= 23.9)  //体重合适
                {
                    sprintf(dis0,"%s参考分析:体重正常\r\n\r\n" , dis0 ); 		
                }
                else	 //体重过重
                {
                    sprintf(dis0,"%s参考分析:体重过重\r\n\r\n" , dis0 ); 		
                }	                
                if(wirelessFlag == 0)UartSendString(dis0);			 //发送	 对应的 数据
                else My_ESP8266_SendStrStr(dis0);			 //发送	 对应的 数据                
            }            
        }
        if(uartTest == 1 && sendDataFlag >= 2)//接收到 测试命令
        {
            uartTest = 0;//取消标志
            if(wirelessFlag == 0)UartSendString("Test Ok!\r\n\r\n");			 //发送	 对应的 数据
            else My_ESP8266_SendStrStr("Test Ok!\r\n\r\n");			 //发送	 对应的 数据    
        }  
    }
}

void TIM2Inital(void)
{
    RCAP2H = (65536-50000)/256;//晶振12M 60ms 16bit 自动重载
    RCAP2L = (65536-50000)%256;
    ET2=1;                     //打开定时器中断
    EA=1;                      //打开总中断
    TR2=1;                     //打开定时器开关
}
void TIM2(void) interrupt 5 using 1//定时器2中断
{
    TF2=0;
    time_50ms++;
    if(time_50ms%2==0)		 //定时更新显示
    {
        disFlag = 1;//标志位置位
    }
    if(uartbusy>0)	   //串口数据采集处理
    {
        uartbusy--;   //说明刚刚接收到数据
    }
    else//长时间没有接受数据 情况接收参数重新接收
    {
        firstin =0;//接收启示标志
        Count=0;//接收计数
    }
}


void UART_Init(void)
{
    SCON  = 0x05;                // SCON: 模式 1, 8-bit UART, 使能接收
    TMOD = 0x02;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
    TL1 = TH1;
    TR1   = 1;                  // TR1:  timer 1 打开
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}


void uartSendByte(unsigned char dat)
{
    unsigned char time_out;
    time_out=0x00;
    SBUF = dat;              //将数据放入SBUF中
    while((!TI))  //检测是否发送出去
    {
        time_out++;    //未发送出去 进行短暂延时//**All notes can be deleted and modified**//
    }
}

void UartSendString(unsigned char *s)
{
    while(*s!='\0')// \0 表示字符串结束标志,
        //通过检测是否字符串末尾
    {
        uartSendByte(*s);//发送一个字节
        s++;//指向下一个
    }
}

void UART_SER (void) interrupt 4     //串行中断服务程序
{
    unsigned char midVal=0;
    unsigned char r_buf;
    static char rec01 = 0;
    if(RI)                        //判断是接收中断产生
    {
        RI=0;                      //标志位清零
        r_buf = SBUF;
        
        if(startCheckWireLess == 1 && wirelessFlag == 0)//启动检测无线
        {
            if(r_buf == 'O')rec01 = 1;
            else if (rec01 == 1 && r_buf == 'K')
            {
                wirelessFlag = 1; //1表示wifi
            }        
        }
        
        uartbusy = 20;
        if(r_buf=='*')		//接收到起始标志
        {
            firstin = 1; //接收标志成功
            Count = 0;
            tab[Count++]=r_buf;

        }
        else if(firstin == 1)	  //接收到其实标志成功
        {
            tab[Count++]=r_buf;
            if(tab[1] == '%')
            {   
                uartTest = 1;//接收到串口命令  
                firstin =0;
                Count=0;
            }            
            if(Count>=3) //*SM0# //设置值
            {
                if(tab[4] == '#')//**All notes can be deleted and modified**//
                {
                    if(tab[1] == 'B' && tab[2] == 'M')//检测到标志
                    {
                        getBMIFlag = 1;//获取BMI值
//                        setVal = (tab[3] - '0')*10 + (tab[4] - '0')*1; //提取数据     
                    }
                }
                firstin =0;
                Count=0;
            }
        }
    }
    if(TI)  TI=0; //如果是发送标志位,清零       
}

void My_ESP8266_SendStrStr( char *str)//发送数据
{
//    u8 i;
    unsigned char midLen=0;      //数据长度变量
    xdata unsigned char midTab[20]; //中间变量数组
    while(str[midLen]!='\0') midLen++;  //计算数据长度  
//    for(i=0;i<2;i++)
    {
        sprintf(midTab,"AT+CIPSEND = 0, %d \r \n",(unsigned int)midLen);	//打印
        UartSendString(midTab);//发送at命令
        DelayMs(10);//延时一下发送 等待相应
        UartSendString(str);//发送数据
//        UartSendString("\r\n");//发送数据
        DelayMs(6);//延时一下发送 等待相应
    }
}

三、实物图示

如下图所示为HC-SR04超声波传感器、YZC-516C-1T称重传感器模块以及HX711 AD转换模块
在这里插入图片描述

四、附完整资源链接

百度网盘链接: https://pan.baidu.com/s/1yyXPn0CIwzz8rfwZcrZDmg?pwd=usvi
提取码: usvi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

O(1)调度算法与CFS

目录 引言 linux内核的O&#xff08;1&#xff09;进程调度算法介绍 主要特点 工作原理 优点 缺点 运行队列 活动队列 过期队列 active指针和expired指针 O(1)调度器&#xff0c;两个队列的机制 两个队列的机制如下&#xff1a; 这个算法后期被CFS替代 CFS 工作原…

进阶篇-Redis集群算法详细介绍

目录 一 、集群是什么1.1 主从复制与集群的架构区别 二、Redis集群的作用三、集群算法3.1.分片-槽位slot3.2 分片是什么3.3如何找到找到给定的key值分片3.4分片的优势 四、槽位映射的三中国解决方案4.1 哈希取余分区算法4.2 哈希一致性算法4.2.1 背景以及概念4.2.2 算法的步骤4…

【Python加密与解密】深入了解Python中的数据加密技术!

Python加密与解密&#xff1a;深入了解Python中的数据加密技术 在现代信息时代&#xff0c;数据加密成为保障网络和通信安全的重要手段之一。无论是在保护个人隐私还是在保证企业数据的安全性方面&#xff0c;加密技术都发挥着关键作用。Python 作为一种流行的编程语言&#x…

(10) GTest c++单元测试(mac版)

文章目录 概要安装实现机制-断言&#xff08;简单、独立的测试&#xff09;实现机制-测试套件实现机制-Test Fixture和事件 概要 官方文档 https://google.github.io/googletest/ 安装 git clone https://github.com/google/googletestcd googletestmkdir build && c…

鸿蒙开发 四十五 鸿蒙状态管理(嵌套对象界面更新)

当运行时的状态变量变化&#xff0c;UI重新渲染&#xff0c;在ArkUI中称为状态管理机制&#xff0c;前提是变量必须被装饰器修饰。不是状态变量的所有更改都会引起刷新&#xff0c;只有可以被框架观测到的更改才会引起UI刷新。其中boolen、string、number类型&#xff0c;可观察…

PyQt 入门教程(3)基础知识 | 3.2、加载资源文件

文章目录 一、加载资源文件1、PyQt5加载资源文件2、PyQt6加载资源文件 一、加载资源文件 常见的资源文件有图像、图标、样式表&#xff0c;下面分别介绍下加载资源文件的常用方法 1、PyQt5加载资源文件 创建.qrc文件&#xff1a; 可以使用QtCreator或手动创建一个.qrc文件&…

注意LED亚型号区分

一. 前言 最近产品试产遇到一次批量事故&#xff1a;全部绿光LED的光功率不达标。最终定位到的原因就是未注意LED的细分型号&#xff0c;试产采用的批次与研发时的亚型号不一样&#xff0c;光功率范围不一致。在此记录下来&#xff0c;供大家做参考&#xff0c;避免走弯路。 …

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架&#xff0c;JAVA作…

uniapp结合uview-ui创建项目

准备工作&#xff1a; 下载HBuilderX;官网地址:HBuilderX-高效极客技巧 安装node.js;官网地址&#xff1a;Node.js — 在任何地方运行 JavaScript,下载所需版本&#xff0c;安装后配置好环境变量即可 方式一&#xff08;NPM安装方式&#xff09;&#xff1a; 1、打开开发者…

OpenRTP 乱序排包和差分抖动计算

OpenRTP 开源地址 OpenRTP 开源地址 暂时使用h264 aac 的音频去测试&#xff0c;点开配置去选择 1 音视频同步问题 先要解决一个音视频同步问题&#xff0c;否则包排不排序都不对&#xff0c;这是因为视频时间戳不一定能够对上音频&#xff0c;为什么呢&#xff1f;因为大部…

前端考试总结

1HTML标签 h标题标签 块级标签 独占一行 p段落标签 同上 br换行标签 单标签 img图片标签 内联标签:不独占一行(src图片地址 alt图片的替代文字 title鼠标悬停提示文字) a超链接标签 同上 (href跳转路径 target属性{_blank新窗口打开 _self在当前窗口打开}) 列表标签(ul无…

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望

诺贝尔物理学奖与机器学习、神经网络&#xff1a;一场跨时代的融合与展望 机器学习与神经网络的崛起 机器学习与神经网络的发展前景 机器学习和神经网络的研究与传统物理学的关系 总结 2024年&#xff0c;诺贝尔物理学奖颁给了机器学习与神经网络&#xff0c;这一具有里程碑…

JAVA就业笔记5——第二阶段(2)

课程须知 A类知识&#xff1a;工作和面试常用&#xff0c;代码必须要手敲&#xff0c;需要掌握。 B类知识&#xff1a;面试会问道&#xff0c;工作不常用&#xff0c;代码不需要手敲&#xff0c;理解能正确表达即可。 C类知识&#xff1a;工作和面试不常用&#xff0c;代码不…

房屋租赁管理系统|基于java和小程序的房屋租赁管理系统小程序设计与实现(源码+数据库+文档)

房屋租赁管理系统小程序 目录 基于java和小程序的房屋租赁管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设…

asp.net core _ViewStart.cshtml 和 _ViewImports.cshtml

_ViewStart.cshtml asp.net mvc 就出现了 》》/Views/ViewStart.cshtml _ViewStart.cshtml 是默认模板&#xff0c;当页面没有指定 Layout 时&#xff0c;会自动调用此默认模板‌&#xff0c;如果要取消 在当页面设定 &#xff08;如下&#xff09;&#xff0c;则表示 当前页面…

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP&#xff0b;MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密&#xff0c;其他开源可二开 演示源码下载 开…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

包子凑数

类似完全背包求方案数&#xff0c;再加上点数论知识&#xff0c;裴蜀定理。 #include<bits/stdc.h> using namespace std; #define int long long #define endl \n const int N300000; bool f[N]; int a[120]; signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.…

华为ICT大赛2024-2025网络赛道考试分析

华为ICT大赛2024-2025正在报名中&#xff0c;网络赛道的同学如何备考&#xff0c;了解考试内容呢&#xff1f; 一、考试概况 华为ICT大赛分为4个赛段&#xff0c;分别为省赛初赛、省赛复赛、中国总决赛&#xff0c;全球总决赛。其中对应的能力级别分别如下&#xff1a; 省赛…

PHP爬虫API:获取商品详情的新利器

为什么选择PHP爬虫API 灵活的数据处理&#xff1a;PHP强大的数据处理能力&#xff0c;使得从API获取的数据可以被快速地处理和分析。丰富的库支持&#xff1a;PHP拥有如cURL、Guzzle等库&#xff0c;这些库简化了HTTP请求的发送和响应的接收。易于集成&#xff1a;PHP作为服务…