42、基于51单片机的蓝牙智能手环系统(全套资料)

编号:42

基于51单片机的蓝牙智能手环系统

功能描述:

     本设计由STC89C52单片机最小系统+ADXL345三轴加速传感器模块+DS1302时钟模块+DS18B20温度传感器模块+Pulse Sensor心率采集模块+BT06蓝牙模块+LCD1602显示模块+键盘模块组成

1、采用STC89C52单片机为主控制器
2、利用三轴加速度模块ADXL345实现计步,DS1302时钟芯片提供时钟信号,通过心率传感器Pulse Sensor采集心率信号通过LM393比较器输出测量心率,DS18B20温度传感器实现体温测量。
3、LCD1602显示体温、步数、日期时间、心率等信息, 
4、可通过BT06蓝牙模块传输至第三方手机软件APP(蓝牙助手)显示。
5、按键功能:三个按键用于调整日期、时间;具有一个清除步数按键;具有一个切换信息显示按键。
6、步数存储至单片机内部EEPROM

仿真Proteus7.8以上版本均可打开运行

视频演示链接:

42、基于51单片机的蓝牙智能手环系统

仿真图:

电路图:

PCB图:

程序源码:

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

***********************************************/
#include "reg52.h"
#include "lcd1602.h"
#include "delay.h"
#include "ds18b20.h"
#include "lcd1602.h"
#include "ds1302.h"
#include "KEY.h"
#include "ADXL345.h"
#include "pulsesensor.h"
#include "uart.h"
#include "eeprom.h"

#include "math.h"
#include "stdio.h"
#include "string.h"

sbit KEY = P3^6;
sfr T2MOD = 0xc9;          	 	//timer2 mode register

bit flag_timer = 0;				//600ms定时时间到标志位
bit ADXL345_FLAG = 0;			//200ms标志位
bit update_flag =0;				//2s更新标志变量



/************************************************************************
* 函数: void Timer2Init(void)
* 描述: 定时器1初始化函数
* 参数: none.
* 返回: none.
* 备注:定时50ms 11.0592MHz
************************************************************************/  
void Timer2Init(void)	//50毫秒@11.0592MHz
{
	T2MOD = 0;			//初始化模式寄存器
	T2CON = 0;			//初始化控制寄存器
	TL2 = 0x00;			//设置定时初值
	TH2 = 0x4C;			//设置定时初值
	RCAP2L = 0x00;		//设置定时重载值
	RCAP2H = 0x4C;		//设置定时重载值
	TR2 = 1;			//定时器2开始计时
	ET2 = 1;			//开始计数
	EA = 1;				//开总中断
}


void main(void)
{
	unsigned int STEPS = 0;
	short temprature;		   		//读到的温度值
	short Temp;						//用于显示温度值
	unsigned short bushu = 0;		//步数临时值
	unsigned char keyvalue = 0;		//键值 
	unsigned char Dis_mode = 0;		//显示状态标志 0:显示传感器数据  1:显示日期时间
	short heart = 0;				//定义心率变量
//	xdata unsigned char T_buf[7]={0,20,9,17,15,32,20};			//用与手动修改时间 修改相应参数即可		
	Lcd1602_Init();		  			//LCD1602液晶初始化

	Timer2Init();					//50毫秒@11.0592MHz
	EXIT0_Init();					//外部中断初始化
	Timer0Init();					//10毫秒@11.0592MHz	
	UartInit();						//9600bps@11.0592MHz

	DS1302_Init();  			   	//DS1302初始化
//	DS1302_SetTime(T_buf);

	Lcd1602_String(0,0,"              ");
	Lcd1602_String(0,1,"              ");
//	while(ADXL345_Init()!=0)					//ADXL345初始化
//	{
//		Lcd1602_String(0,0," ADXL345  Error! ");
//		delay_ms(500);
//		Lcd1602_String(0,0,"                 ");
//		delay_ms(500);
//	}
	while(1)
	{
		keyvalue = KEY_Scan(0);				//获取单击按键键值
		switch(keyvalue)
		{
			case 1:		  					//key0按键处理
				KEY_Set();					//键盘设置时间
			break;
			
			case 3:							//key2按键处理
				 STEPS = 0;
			
			
			break;
			
			case 4:		  					//key1按键处理
				if(Dis_mode==0)
					Dis_mode = 1;
				else 
					Dis_mode = 0;
					Lcd1602_Write_Com(0x01); //清屏	
			break;
		}
		if(KEY==0)
		{
			while(KEY==0);
			STEPS++;
		}
		heart =Pulsesensor_Read(); 			//获取心率值	
	    DS1302_ReadTime();					//读取DS1302
//		if(ADXL345_FLAG==1)					//200ms到?
//		{
//			ADXL345_FLAG = 0;	  			//清除标志位
//			STEPS = Step_Count()/2;			//是来回算两下  要除以二
//			
//		}
//		if(bushu!=STEPS)					//步数变化一次就 存储一次到EEPROM
//		{
//			bushu = STEPS;
//			EEPROM_Write();					//写数据进eepROM
//		}
		switch(Dis_mode)
		{
			case 0:	  						//显示传感器数据
					
				Lcd1602_String(0,0,"Step:");		//显示步数
				Lcd1602_Write_Data(STEPS/10000+0x30);
				Lcd1602_Write_Data(STEPS%10000/1000+0x30);
				Lcd1602_Write_Data(STEPS%10000%1000/100+0x30);
				Lcd1602_Write_Data(STEPS%10000%1000%100/10+0x30);
				Lcd1602_Write_Data(STEPS%10000%1000%100%10+0x30);
				Lcd1602_String(11,0,"H:");		//从第11行第0列开始显示	
				if(heart==0)		 			//未检测到心率信号  		
				{
					Lcd1602_Write_Com(0x80+13);	//设定显示位置第二行 第13列
					Lcd1602_Write_Data('-');
					Lcd1602_Write_Data('-');
					Lcd1602_Write_Data('-');

				}
				else	 						//检测到心率信号
				{
				 	Lcd1602_Write_Com(0x80+13);	//设定显示位置第二行 第13列
					Lcd1602_Write_Data(heart/100+0X30);
					Lcd1602_Write_Data(heart%100/10+0X30);
					Lcd1602_Write_Data(heart%100%10+0X30);

				}
				
				if(flag_timer==1)						//600毫秒赋一次值 flag_timer是标志位
				{	
					flag_timer = 0;						//清除标志  等待下一次600ms
		
					temprature=DS18B20_Get_Temp();		//读取温度
					Lcd1602_String(0,1,"Temp:");		//从第二行第0列开始显示		
					if(temprature>=0)  					//如果温度大于等于0
					{	
						Temp = temprature; 				//取反				
						Lcd1602_Write_Data(' ');
					}	
					else	 							//如果温度是负的
					{
						Temp = abs(temprature); 		//取绝对值
						Temp = Temp+1; 				  	//根据手册提示 这里要加一
						Lcd1602_Write_Data('-');		//显示负号
					}
					Lcd1602_Write_Data(Temp/1000+0X30);
					Lcd1602_Write_Data(Temp%1000/100+0X30);
					Lcd1602_Write_Data(Temp%1000%100/10+0X30);
					Lcd1602_Write_Data('.');
					Lcd1602_Write_Data(Temp%1000%100%10+0X30);
					Lcd1602_Write_Data(0XDF);
					Lcd1602_Write_Data('C');
					
				} 	
			break;

			case 1:								//显示时间 日期等信息
				
				DS1302_Time();					//显示时钟
			break;
		}
		if(update_flag==1) 						//2S标志到 发送一次数据到手机APP  23个字节
		{
			update_flag = 0;
			Uart_SendString("Step:");	    	//串口发送
			Uart_SendChar(STEPS/10000+0x30);
			Uart_SendChar(STEPS%10000/1000+0x30);
			Uart_SendChar(STEPS%10000%1000/100+0x30);
			Uart_SendChar(STEPS%10000%1000%100/10+0x30);
			Uart_SendChar(STEPS%10000%1000%100%10+0x30);

			Uart_SendString("H:");	
			Uart_SendChar(heart/100+0X30);
			Uart_SendChar(heart%100/10+0X30);
			Uart_SendChar(heart%100%10+0X30);

			Uart_SendString("T:");  		//温度
			Uart_SendChar(temprature/100+0X30);
			Uart_SendChar(temprature%100/10+0X30);
			Uart_SendChar('.');
			Uart_SendChar(temprature%100%10+0X30);
			Uart_SendString("\r\n");		//换行
		}
		

	}
}
//定时器2中断服务函数	 50ms
void tm2_isr() interrupt 5 using 1
{
	static unsigned int cnt=0;							  
 	TF2 = 0;

	cnt++;

	if(cnt%12==0)    		//50ms*12 =600ms
	{
		flag_timer = 1;	 	//600ms到 赋值标志为1  600ms赋一次 600ms不是必须的  可以自己修改	
	}
	if(cnt%40==0)    		//50ms*40 = 2s
	{
		cnt = 0;
		update_flag = 1;	//2s到 赋值标志为1  2s发一次数据到蓝牙 2s不是必须的  可以自己修改
		
	}
	
}

软件免费下载地址:

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/1zTjNmovLZ0pN32VPlfN4Fw?pwd=5j5m 
提取码:5j5m

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国际旅游网络的大数据分析(数学建模练习题)

题目:国际旅游网络的大数据分析 伴随着大数据时代的到来,数据分析已经深入到现代社会生活中的各个方面。 无论是国家政府部门、企事业单位还是个人,数据分析工作都是进行决策之前的 重要环节。 山东省应用统计学会是在省民政厅注册的学术类社会组织&…

Node与Express后端架构:高性能的Web应用服务

在现代Web应用开发中,后端架构的性能和可扩展性至关重要。Node.js作为一个基于事件驱动、非阻塞I/O的平台,以及Express作为一个流行的Node.js框架,共同构建了高性能的Web应用服务。 在本文中,我们将深入探讨Node与Express后端架构…

先进API生产力工具eqable HTTP,一站式开发调试工具推荐

简介 Reqable是什么? Regable Fiddler/Charles Postman Reqable是HTTP一站式开发调试国产化解决方案,拥有更便捷的体验,更先进的协议,更高效的性能和更精致的界面。 Reqable是一款跨平台的专业HTTP开发和调试工具,在全平台支持…

opencv 车牌号的定位和识别+UI界面识别系统

目录 一、实现和完整UI视频效果展示 主界面: 识别结果界面:(识别车牌颜色和车牌号) 查看历史记录界面: 二、原理介绍: 车牌检测->图像灰度化->Canny边缘检测->膨胀与腐蚀 边缘检测及预处理…

关于单例模式

单例模式的目的: 单例模式的目的和其他的设计模式的目的都是一样的,都是为了降低对象之间的耦合性,增加代码的可复用性,可维护性和可扩展性。 单例模式: 单例模式是一种常用的设计模式,用简单的言语说&am…

Springboot2.0快速入门(第一章)

目录 一,SpringBoot简介1.1,回顾什么是Spring1.2,Spring是如何简化Java开发的1.3,什么是SpringBoot 二,Hello,World2.1,准备工作2.2,创建基础项目说明2.3,创建第一个Hell…

Gitlab设置中文

1. 打开设置 2.选择首选项Preferences 3. 下滑选择本地化选项Localization,设置简体中文,然后保存更改save changes。刷新网页即可。

【QT】ComboBox的使用(14)

ComboBox这个控件我常用于多文本的储存、调用,正如他的中文意思为:下拉列表框。 下拉列表框:字面意思就是一个多文本的列表框,今天来看下如何使用ComboBox这个控件。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&…

葡萄叶病害识别(图像连续识别和视频识别,Python代码,pyTorch框架)

葡萄叶病害识别(图像连续识别和视频识别,Python代码,pyTorch框架)_哔哩哔哩_bilibili 葡萄数据集 第一个文件夹为 Grape Black Measles(葡萄黑麻疹)病害(3783张) Grape Black rot葡…

iOS HealthKit 介绍

文章目录 一、简介二、权限配置1. 在开发者账号中勾选HealthKit2. 在targets的capabilities中添加HealthKit。3. infoPlist需要配置权限 三、创建健康数据管理类1. 引入头文件2. 健康数据读写权限3. 检查权限4. 读取步数数据5. 写入健康数据 四、运行获取权限页面 一、简介 He…

Java源码分析(三)ArrayList

ArrayList是我们经常用到的一个集合类&#xff0c;那么本篇我们一起学习下ArrayList的源码。 一、创建ArrayList 首先&#xff0c;我们从创建ArrayList开始。如下代码&#xff0c;创建一个空的ArrayList&#xff1a; List<String> list new ArrayList<>(); 看下…

Linux下的系统编程——系统调用(五)

前言&#xff1a; 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。系统调用就是应用程序同系统之间数据交互的桥梁。 一、open/close函数 1.open函数&#xff1a; &#xff08;1&#xff09;int open(char *pathname, int flags)…

npm常用命令 + 前端常用的包管理工具 以及 npm淘宝镜像配置等

npm常用命令 前端常用的包管理工具 以及 npm淘宝镜像配置等 1. 前言1.1 NodeJs的下载安装1.2 windows上1.3 常用包管理工具 2. npm2.1 npm 的安装2.2 npm初始化包2.3 npm 安装、卸载包2.3.1 非全局安装2.3.1.1 单个包的安装2.3.1.1.1 默认版本安装2.3.1.1.2 指定版本安装 2.3.…

Ceph入门到精通-如何编译安装Quagga?

Quagga 1. 理论部分 1.1 软件简介 Quagga中文翻译斑驴&#xff0c;是一种先进的路由软件包&#xff0c;提供一套基于TCP/IP的路由协议。 1.2 斑驴的应用场景 – 使得操作系统变成专业的路由 – 使得操作系统具有与传统路由通过路由协议直接对接 1.3 斑驴支持的路由协议 …

SpringCluod深入教程

1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#…

【前端】常用功能合集

目录 js跳转到新标签打开PDF文件js每十个字符换行 es6用表达式或变量名作为对象的属性名 vuev-for插值、:style、:class父组件加载完后再加载子组件keep-alive缓存跨域请求第三方接口跨域请求之callback&#xff08;不建议&#xff09;读取本地文件浏览器播放提示音audio jquer…

Element Plus 日期选择器的使用和属性

element plus 日期选择器如果如果没有进行处理 他会返回原有的属性值data格式 如果想要获取选中的日期时间就需要通过以下的代码来实现选中的值 format"YYYY/MM/DD" value-format"YYYY-MM-DD" <el-date-pickerv-model"formInline.date" type&…

前端面试基础面试题——1

总结了一些基础的面试题 如果大家有兴趣的话可以关注留意一下 今后会不断更新一些面试题 1.JavaScript 中的 AJAX 原理及应用。 2.什么是闭包?请简单描述一下闭包的特点与应用场景。 3.请简述 HTTPS 与 HTTP 的区别&#xff0c;如何保证 HTTPS 的安全性? 4.请简述…

2023年6月GESP C++ 四级试卷解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 1.高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A.编辑 B.保存 C.调试 D.编译 【答案】D 【考纲知识点】编程环境(一级) 【解析】本题…

考研408 | 【操作系统】 文件管理

初识文件管理 文件属性&#xff1a; 文件内部的数据应该怎样组织起来&#xff1f; 操作系统应该向上提供哪些功能&#xff1f; 从上往下看&#xff0c;文件应该如何存放在外存&#xff1f; 其他需要由操作系统实现的文件管理功能 总结&#xff1a; 文件的逻辑结构 无结构文…