物联网毕业设计 STM32单片机的蓝牙智能计步器手环


0 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 STM32单片机的蓝牙智能计步器手环(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 项目分享:

https://gitee.com/sinonfin/sharing

在这里插入图片描述

1 主要功能

由 STM32F103C8T6单片机最小系统+ADXL345三轴加速传感器模块+RTC时钟模块+DS18B20温度传感器模块+pulsesenneor心率采集模块+ BT06蓝牙模块+OLED显示模块+键盘模块
1、采用STM32F103C8T6单片机为主控制器

2、利用三轴加速度模块ADXL345实现计步,RTC内部时钟提供时钟信号,通过心率传感器pulsesennor采集心率信号STM32内部A/D转换测量心率,DS18B20温度传感器实现体温测量。
3、OLED0显示体温、步数、日期时间、心率等信息,
4、可通过BT06蓝牙模块传输至第三方手机软件APP(蓝牙助手)显示。
5、按键功能:三个按键用于调整日期、时间;具有一个清楚步数按键;具有一个切换信息显示按键。
6、步数清零功能:每天00:00会自动清除前一天的步数,也可通过按键清除。

在这里插入图片描述

2 硬件设计(原理图)

在这里插入图片描述

在这里插入图片描述

3 核心软件设计

本系统设计主要采用Keil软件编写与调试程序,程序语言采取易读性和移植性更高的C语言编写。系统运行流程图如下图所示。
要实现以上功能要求,我们画出软件程序框图如下图4-2所示。首先进行系统初始化,系统初始化包括液晶初始化配置、ADXL345加速度传感器初始化、RTC时钟初始化、串口初始化配置、FLASH模拟EEPROM数据读取、A/D转换配置、定时器2、定时器3、串口初始化配置。接下来进入主程序循环。主程序循环系统中主要是温度传感器数据的实时采集,实时时钟的读取,心率信号的测量。利用A/D转换和定时器3实现心率脉冲信号的捕获,最终计算得到实际的心率值。加速度传感器数据读取并实现算法计步,并保存步数到FLASH中。同时键盘子程序实时扫描,检测到切换键按下时,会切换显示;按键同时按下时会清除步数。通过内部定时器定时,当定时5秒到后,通过蓝牙模块发送一次数据到APP查看。在RTC实时时钟的作用下,当时间达到凌晨0:00时,会自动清零步数。并重新开始计步。程序执行到这里完了一次,以下列出整体软件设计的流程图,如图

在这里插入图片描述

关键代码

#include "led.h"
#include "delay.h"

#include "sys.h"
#include "usart.h"	 
#include "timer.h"
#include "adc.h"
#include "adxl345.h"
#include "Pedometer.h"
#include "stmflash.h"
#include "OLED_I2C.h"
#include "ds18b20.h"
#include "rtc.h"
#include "key.h"

#include "string.h" 	
/************************************************

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


extern _Bool Timer_Flag ;			//ʱ�䵽 ��׼λ
extern _Bool update_flag;			//���±�־����


//Ҫд�뵽STM32 FLASH���ַ�������
u8 TEXT_Buffer[]={"0000000"};
#define SIZE sizeof(TEXT_Buffer)	 	//���鳤��
//#define FLASH_SAVE_ADDR  0X08020000 	//����FLASH �����ַ(����Ϊż��������ֵҪ���ڱ�������ռ��FLASH�Ĵ�С+0X08000000)
#define FLASH_SAVE_ADDR  0X0800f400 	//����FLASH �����ַ(����Ϊż��������ֵҪ���ڱ�������ռ��FLASH�Ĵ�С+0X08000000)



void Dis_Init(void)
{
	OLED_ShowCN(0,0,10);			//����
	OLED_ShowCN(16,00,11);

	OLED_ShowStr(32,0,":---r/min",2);
	
	OLED_ShowCN(0,2,12);			//����
	OLED_ShowCN(16,2,13);

	
	OLED_ShowCN(0,4,14);			//����
	OLED_ShowCN(16,4,15);
}
unsigned char Dis_mode = 0;		//��ʾ״̬��־ 0����ʾ����������  1����ʾ����ʱ��


short x, y, z;
int main(void)
{	

	unsigned char p[16]=" ";

	u8 datatemp[SIZE];	
	unsigned int  STEP=0;			//������ʱ�滻ֵ			
	_Bool Heart_OK = 0;				//��ȡ����ȷ���ʱ�־λ
	unsigned char Heart = 0;		//����ֵ
	short temperature = 0; 				//�¶�ֵ
	
	STEPS_DIS = 1;
	delay_init();	    			//��ʱ������ʼ��	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//�����ж����ȼ�����Ϊ��3��2λ��ռ���ȼ���2λ��Ӧ���ȼ�
	
    LED_Init();		  				//��ʼ��������豸���ӵ�Ӳ���ӿ�
	OLED_Init();					//OLED��ʼ��
	
	OLED_CLS();						//����
	OLED_ShowCN(32,2,0);			//��ӭʹ��
	OLED_ShowCN(32+16,2,1);
	OLED_ShowCN(32+32,2,2);
	OLED_ShowCN(32+32+16,2,3);
	
		

	
	while(ADXL345_Init())			//3D���ٶȴ�������ʼ��	
	{
		OLED_ShowStr(0,0,"ADXL345 Error",2);
		delay_ms(200);
		OLED_ShowStr(0,0,"             ",2);
 		delay_ms(200);
	}
	while(DS18B20_Init())	//DS18B20��ʼ��	
	{
		OLED_ShowStr(0,0,"DS18B20 Error",2);
		
		delay_ms(200);
		OLED_ShowStr(0,0,"             ",2);	

		delay_ms(200);
	}
	delay_ms(100);
	while(DS18B20_Get_Temp()==850);	//DS18B20���ϵ�ʱ�� ��ȡ��ֵ��850 ����ȴ� ֱ������850�ſ�ʼ��һ��		
	delay_ms(5000);
	
	
	OLED_CLS();						//����
	Adc_Init();
	TIM3_Int_Init(1999,71);			//��ʱ2ms�ж�
	
	
	uart_init(9600);	 			//����һ��ʼ��Ϊ9600
	TIM2_Int_Init(199,7199);		//10Khz�ļ���Ƶ�ʣ�������500Ϊ20ms 
	KEY_Init();						//IO��ʼ��		
	EXTIX_Init();					//�ⲿ�жϳ�ʼ��
	
	OLED_CLS();						//���� 
	Dis_Init();						

	STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);  //flash�������
	
	STEPS = (datatemp[0]-0x30)*10000+(datatemp[1]-0x30)*1000+(datatemp[2]-0x30)*100+(datatemp[3]-0x30)*10+(datatemp[4]-0x30);//����ֵת��Ϊ����
//	RTC_Init();
//	
//	RTC_Set(2019,8,5,20,43,55);     //����ʱ��
 	while(1)
	{	

		if(Timer_Flag==1)					//500ms�� ��ȡ����
		{
			Timer_Flag = 0;					//�����־
			TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE ); 						//ʹ��ָ����TIM3�ж�,���������ж�
			TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE ); 						//ʹ��ָ����TIM3�ж�,���������ж�		
			temperature=DS18B20_Get_Temp();	//��ȡ�¶�
			TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 						//ʹ��ָ����TIM3�ж�,���������ж�
			TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 						//ʹ��ָ����TIM3�ж�,���������ж�

			TIM_Cmd(TIM2, ENABLE);  		//ʹ��TIMx	
			if (QS == true)					//��ȡ���������ź�
			{			
				QS = false; 				//�����־ �ȴ���һ�ζ�ȡ
				if(BPM>HEART_MIN_ERROR&&BPM<HEART_MAX_ERROR)		//��ȡ����ֵ�������������� 40-160��
				{
					Heart_OK = 1;			//��־λ��һ
					Heart = BPM;			//���ʴ��ݸ�Heart
				}
				else
				{
					Heart_OK = 0;			//��־λ����
					Heart = 0;				//����Ϊ0
				}	
			}
		}
				
		if(ADXL345_FLAG==1)					//20ms����
		{
			ADXL345_FLAG = 0;	  			//�����־λ
			step_counter();	
		}
		delay_ms(20);	
		if(STEP!=STEPS)						//���������ı� �洢һ��
		{
			STEP = STEPS;
			TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
			TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
			TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
			TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
			TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
		}
		if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2))		//�賿00:00:00  �������
		{
			STEPS = 0;
			TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
			TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
			TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
			TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
			TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
			delay_ms(500);
			
		}
		Key_set();							//ʱ������
	
		if(KEY0==0)							//KEY0�л���ʾ����
		{
			while(KEY0==0);					//�ȴ��ɿ�
			OLED_CLS();						//����	
			if(Dis_mode==0)					//�����һ������ʾ���ʡ����������� �� ����ʾʱ��
				Dis_mode = 1;
			else 							//�����һ�β�����ʾ���ʡ����������� �� �����ʡ�����������
			{
				Dis_mode = 0;				
				Dis_Init();					//��ʾ������Ϣ
			}		
		}
		if(KEY2==0)	   						//�������
		{
			while(KEY2==0);
			STEPS = 0;
			TEXT_Buffer[0]=(u16)'0';
			TEXT_Buffer[1]=(u16)'0';
			TEXT_Buffer[2]=(u16)'0';
			TEXT_Buffer[3]=(u16)'0';
			TEXT_Buffer[4]=(u16)'0';

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);		//�����洢һ������
		}
	
		if(update_flag==1) 					//2S��־�� ����һ�����ݵ��ֻ�APP
		{
			update_flag = 0;
			printf("Step:%5d H:%3d T:%4.1f \r\n",STEPS,Heart,(float)temperature/10);	//���ڷ��ͳ�ȥ

		}
	
		switch(Dis_mode)
		{
			case 0:	  										//��ʾ����������
				if(STEPS_DIS==1)							//ˢ�¼Ʋ���
				{
					sprintf((char*)p,":%-5d ",STEPS);		//��ʾ����
					OLED_ShowStr(32,2,p,2);
				}
 				sprintf((char*)p,":%4.1f    ",(float)temperature/10);
				OLED_ShowStr(32,4,p,2);						//��ʾ�¶�
				
				if(Heart_OK==1)								//��ȡ����ȷ���ʣ�
				{
					sprintf((char*)p,":%3dr/min",Heart);	//��ʾ����
					OLED_ShowStr(32,0,p,2);	
				}
				else
				{
					sprintf((char*)p,":---r/min");	
					OLED_ShowStr(32,0,p,2);
				}
			break;

			case 1:											//��ʾʱ�� ���ڵ���Ϣ
				RTC_Display();								//��ʾʱ��
			break;
		}
		
	}	
}


4 实现效果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5 最后

包含内容

在这里插入图片描述

🧿 项目分享:

https://gitee.com/sinonfin/sharing

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C51单片机步数检测计步器无线蓝牙APP上传设计软硬件设计文件+毕业设计论文文档资料: 10、系统硬件框图(针对本设计,1对1,直接用) 11、程序流程图(针对本设计,1对1,直接用) 12、器件清单(针对本设计,1对1,直接用) 13、所用到的芯片、电路模块资料(针对本设计,1对1,直接用) 14、元器件焊接方法及注意事项 15、疑难问题解答 16、答辩技巧 17、C语言学习视频教程 18、该设计单片机学习视频教程(多套经典教程) 19、程序下载串口软件STC_ISP安装包 1、使用前必读(怎样查看资料以及下载程序等等,一目了然) 20、程序下载串口软件STC_ISP使用视频教程(通旺科技版权所有) 21、程序编写软件Keil安装包 22、程序编写软件Keil使用教程及安装看程序视频教程(通旺通旺科技版权所有) 23、原理图绘制软件Altium Designer 15 24、原理图查看多种格式软件安装查看视频教程(通旺通旺科技版权所有) 2、源程序(C语言含详细备注) 3、原理图(源文件+PDF版+照片版) 4、PCB图 51蓝牙计步器.apk 5、实物图(高清) 6、演示视频(电路讲解,模块说明,设计工作流程,现象演示) 7、任务书 8、开题报告(1对1,可直接使用) 9、本设计论文(本设计论文,完全符合,内容丰富,1万字以上,详情请看目录截图) 摘要 计步器是一种颇受欢迎的日常锻炼进度监控器,可以激励人们挑战自己,增强体质,帮助瘦身。早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器。晃动这些装置时,可以听到有一个金属球来回滑动,或者一个摆锤左右摆动敲击挡块。 计步器功能可以根据计算人的运动情况来分析人体的健康状况。而人的运动情况可以通过很多特性来进行分析。与传统的机械式传感器不同,ADXL345是电容式三轴传感器,由它捕获人体运动时加速度信号,更加准确。信号通过低通滤波器滤波,由单片机采集数据。软件采用自适应算法实现计步功能,减少误计数,更加精确。选用单片机STC89C52作为系统控制芯片,通过蓝牙模块把单片机处理的数据传输到手机APP上,这样更能清楚看到检测的效果。整机工作电流只有1-1.5mA,实现超低功耗。采集的步数,路程,卡路里及运动状态用手机APP显示。 第二章 方案的设计与论证 2.1控制方案的确定 本设计由STC89C52单片机最小系统+ADXL345加速度传感器电路+蓝牙模块电路+LED灯电路+电源电路组成。 2.2控制方式的选择 2.2.1 单片机芯片的选择 方案一 采用可编程逻辑器件CPLD作为控制器,CPLD可以实现各种复杂的功能、规模大、密度高、体积小、稳定性高、I/O资源丰富、易于进行功能扩展。采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。且从使用及经济的角度考虑,最终放弃了此方案。 方案二 采用ST公司的STC89C52单片机作为主控制器,STC89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程 Flash 存储器。该单片机功耗低、接口丰富,成本低廉,完全能满足本设计要求。 方案三 采用单片机芯片控制MSP430单片机是美国德州仪器(TI)推出的一种16位超低功 耗的混合信号处理器(Mixed Signal Processor),主要是针对实际应用需求,把许多模拟电路、数字电路和微处理器集成在一个芯片上,以提供“单片”混合信号处理的解决方案。MSP430F149是一个16位的、具有精简指令集的、超低功耗的混合型单片机,具有可靠性高、功耗低、扩展灵活、体积小、价格低和使用方便等优点,广泛应用于仪器仪表、专用设备智能化管理及过程控制等领域,有效地提高了控制质量与经济效益,已成为众多单片机系列中一颗耀眼的新星。然而其成本太高,故舍弃。 故选择方案二。 2.2.2倾角传感器的选择 方案一 采用陀螺仪来检测老人的位置信息,陀螺仪是用高速回转体的动量矩敏感壳体相对惯性空间绕正交于自转轴的一个或二个轴的角运动检测装置,该模块精度高,稳定性强,但控制复杂。 方案二: 采用基于ADI公司的倾角传感器ADXL345模块来检测老人的位置信息,adxl345功能很强大,内置很多寄存器,而且成本低,易于控制。 故选择方案二。 2.2.3无线遥控模块的选择 方案一 采用红外遥控模块系统进行无线控制,红外载波频率:38KHz,其理论遥控范围为8-10米,遥控范围内,电路简单,成本极低。 中间有无障碍物等因素会影响到遥控距离,实际遥控距离可能更短,丧失了遥测的有用性。 方案二 使用WIFI模块进行本系统数据的无线传输。Wi-Fi是一种可以将个人电脑、手持设备(如PDA、手机)等终端以无
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值