一:功能介绍
1、实物组成部分:stm32f103c8t6核心板+LCD1602显示屏+HC05蓝牙模块+HX711称重传感器(100KG)+按键
2、通过称重传感器采集被测人的体重,显示到LCD1602显示屏上;
3、通过按键设置被测人的身高,显示到LCD1602显示屏上;
4、通过程序内部计算,得到被测人的BMI指数,显示到LCD1602显示屏上;
5、通过蓝牙HC05模块将身高、体重、BMI指数上传到手机APP;
二:实物演示视频
263-基于stm32单片机体重秤BMI指数人体健康监测系统(程序+原理图+元器件清单)
三:程序代码预览(采用keil5编写,使用的C语言,程序有中文注释,新手容易看懂)
特别注意:下载资料包以后一定要先解压! !!(建议解压到桌面上,文件路径太深会导致程序打开异常),解压后再用keil5打开。


int main(void){int adcx;int weight,bmi;#ifdef DEBUGdebug();#endif //执行主函数之前的调试函数,不影响最终的release版//------------初始化------------下面三个初始化delay_init();delay_ms(100);LCD1602_Init();RCC_Configuration();//RCC指时钟控制预分频器GPIO_Configuration();//初始化GPIO口状态USART_Configuration( ); //初始化串口配置KEY_Init();uart_init(9600); //串口初始化为9600while(1) //恒运行下面的程序{key(); //多次读取按键状态adcx=filter();//adcx值由这个子函数读出,这个数需要由下面两句转kg值key();//多次读取按键状态adcx=adcx/100;//为节省运算量,将AD值固定缩小100倍weight=((float)adcx/429.496+0.005)*10; //实际用的时候需要调试,429.496由于传感器差异这个系数一般在400到500之间,加0.005是为了四舍五入weight=(weight-1975)*2;//去皮操作if(weight<0) weight=0;bmi=weight*1000/(high*high);LCD_Write_Command(0x80);//第一行的首地址LCD_Write_Date(' ');LCD_Write_Date(' ');LCD_Write_Date(' ');LCD_Write_Date('B');LCD_Write_Date('M');LCD_Write_Date('I');LCD_Write_Date('=');LCD_Write_Date(bmi%1000/100+0x30); //显示bmiLCD_Write_Date(bmi%100/10+0x30);LCD_Write_Date(bmi%10+0x30);key(); //多次读取按键状态LCD_Write_Command(0x80+0x40);LCD_Write_Date('H');LCD_Write_Date('=');LCD_Write_Date(high%1000/100+0x30); //显示身高LCD_Write_Date(high%100/10+0x30);LCD_Write_Date(high%10+0x30);LCD_Write_Date('C');LCD_Write_Date('M');LCD_Write_Date(' ');LCD_Write_Date('W');LCD_Write_Date('=');LCD_Write_Date(weight%1000/100+0x30);//显示体重LCD_Write_Date(weight%100/10+0x30);LCD_Write_Date('.');LCD_Write_Date(weight%10+0x30);LCD_Write_Date('K');LCD_Write_Date('G');printf("BMI=%d\r\n",bmi);printf("H=%d CM\r\n",high);printf("W=%d.%d KG\r\n",(weight/10),(weight%10)); //蓝牙上传数据}}/******************************************************************************** Function Name : Delay_Ms* Description : delay 1 ms.* Input : dly (ms)* Output : None* Return : None*******************************************************************************/void Delay_MS(u16 dly){u16 i,j;for(i=0;i<dly;i++)for(j=1000;j>0;j--);}void delay_us(u16 dly1) //延时函数{u16 i;for(i=dly1;i>0;i--);}/******************************************************************************** Function Name : Read_HX711* Description : Read weigh* Input : None* Output : None* Return : None*******************************************************************************/unsigned long Read_HX711(void) //读HX711芯片输出的数据。{unsigned long val = 0; //long型32位unsigned char i = 0;//DOUT指串行数据输出,SCK指的是PD_SCK串行时钟输入GPIO_SetBits(GPIOB,GPIO_Pin_11); //DOUT=1 ,PB11接HX711数据口浮空输入,还是不懂什么叫浮空输入,但是连线的话把HX711的数据线口接STM的PB11口GPIO_ResetBits(GPIOB,GPIO_Pin_12); //SCK=0 ,PB12接HX711CLKwhile(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)); //等待DOUT=0delay_us(1); //等1us执行下面for(i=0;i<24;i++){GPIO_SetBits(GPIOB,GPIO_Pin_12); //SCK=1val=val<<1; //左移1位,右补0delay_us(1);GPIO_ResetBits(GPIOB,GPIO_Pin_12); //SCK=0if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)) //DOUT=1val++;delay_us(1);}GPIO_SetBits(GPIOB,GPIO_Pin_12);val=val^0x800000;//异或。delay_us(1);GPIO_ResetBits(GPIOB,GPIO_Pin_12);delay_us(1);return val;}
四:原理图展示(源文件采用Altium Designer打开,公众号有安装包)


五:实物图展示



六:元器件清单展示

7:资料清单展示(文件中包含的相关资料)


被折叠的 条评论
为什么被折叠?



