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

news2025/1/18 17:04:08

编号: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

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

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

相关文章

Leetcode Top 100 Liked Questions(序号75~104)

75. Sort Colors 题意&#xff1a;红白蓝的颜色排序&#xff0c;使得相同的颜色放在一起&#xff0c;不要用排序 我的思路 哈希 代码 Runtime 4 ms Beats 28.23% Memory 8.3 MB Beats 9.95% class Solution { public:void sortColors(vector<int>& nums) {vector…

Ping32客户端安装注册

登录Ping32&#xff0c;进入主界面 回到“开始”界面 在桌面会生成客户端安装程序

EOCR电机保护器MODBUS通讯的使用

在工厂自动化中&#xff0c; 数据连接是必不可少的&#xff0c; 尤其是在工业4.0概念不断扩大其覆盖范围的今天。而通过EOCR的MODBUS通讯&#xff0c;用户可将电动机的运行状态、运行电流、故障原因及时间等信息传输至上位机中&#xff0c;以方便用户实时监测电动机的状态&…

《Linux多线程服务端编程》读书笔记(一)

线程安全 一个线程安全的类应该满足下面三个条件 多个线程同时访问&#xff0c;其表现出正确的行为无论操作系统如何调度这些线程&#xff0c;无论这些线程的执行顺序如何交织调用端代码无需额外的同步或其他协调动作 对象的线程安全 对象构造要做到线程安全&#xff0c;唯…

弹幕引擎使用教学

欢迎阅读 弹幕引擎 / 弹幕会模板 使用教学&#xff01; 不知道您是否听说过“弹幕游戏”&#xff0c;Scratch 闯关游戏作品&#xff1a;东方虹魔馆 如果听说过&#xff0c;那就太好啦&#xff01;您很有可能已经对“弹幕”甚至“符卡”有了认识基础。没有也不要紧&#xff0c;您…

智能化新十年,“全栈智能”定义行业“Copilot智能助手”

“智能化转型是未来十年中国企业穿越经济周期的利器”&#xff0c;这是联想集团执行副总裁兼中国区总裁刘军在去年联想创新科技大会上做出的判断&#xff0c;而2023年正值第四次工业革命第二个十年的开端&#xff0c;智能化是第四次工业革命的主题。2023年初&#xff0c;基于谷…

红盟云卡系统v1.1.17虚拟商品在线售卖平台源码

红盟云卡系统是一款基于PHPMySQL开发的虚拟商品在线售卖平台 v1.1.17.20230627 增加强制登录插件 增加QQ微信防红插件 增加首页弹窗插件 增加鱼儿游背景特效插件 官方微信支付插件增加jsapi类型 后台订单列表增加下单必填项字段显示 修复分站个人中心开通分站报错的问题 修复提…

FAST协议详解3 可null(空)类型

一、概述 所谓可null、可空&#xff0c;其实是一个特性的两个方面&#xff0c;某些情况下&#xff0c;我们不需要传递某个字段的值&#xff0c;则可以将该字段“空”起来&#xff0c;不赋值&#xff0c;则接收方在收到该字段时会自动解析为null值。所以空是对于发送方而言&…

控制各种开环伺服阀放大器

控制不带电气位置反馈模块式伺服阀开环控制&#xff0c;最大电流10mA至1000mA范围可选&#xff1b; 常规可选电流档位&#xff1a;10mA、15mA、20mA、40mA、100mA、300mA等&#xff1b; 前面板电位器或者上位机精细调整零位及增益。 颤振频率以及颤振幅度可选。 快速电流驱…

初入职场六个注意

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 作为一个职场新人&#xff0c;最重要的变化是从学校的学习生活转变进入职场的工作生活&#xff0c;一切都是新鲜的&#xff0c;步入职场就是进入了社会。 其实学校也是一个…

高忆管理:成交量突然放大股价下跌?

在出资股票时&#xff0c;咱们常常看到股票价格急剧跌落&#xff0c;而此时成交量正在暴增。许多出资者进入股市的初期或许会产生困惑&#xff0c;将“成交量忽然扩大股价跌落”视为出资时的一般改变和常态&#xff0c;但其实并不总是如此。这种现象或许暗示着不同的问题和情况…

Qt:界面实时响应鼠标拖动绘制

采用双缓冲实现界面实时响应鼠标的拖动绘制。 思想如下&#xff1a;首先需要两张画布pix和tempPix&#xff0c;他们都是QPixmap实例&#xff1b;pix用来保存初始界面或上一阶段以完成的绘制&#xff1b;tempPix用来作为鼠标拖动时的实时界面绘制&#xff1b;当鼠标左键按下后拖…

C# 生成唯一ID

1.首先通过nuget安装yitter.idgenerator 下面的三行代码搞定

文心一言 VS 讯飞星火 VS chatgpt (83)-- 算法导论8.1 4题

四、用go语言&#xff0c;假设现有一个包含n个元素的待排序序列。该序列由 n/k 个子序列组成&#xff0c;每个子序列包含k个元素。一个给定子序列中的每个元素都小于其后继子序列中的所有元素&#xff0c;且大于其前驱子序列中的每个元素。因此&#xff0c;对于这个长度为 n 的…

C++ | 源码分析 Why double free?

源码分析 Why double free? 文章目录 源码分析 Why double free?WhatWhy1.浅拷贝 VS 深拷贝浅拷贝深拷贝 2.push_back 和 emplace_backpush_back 源码emplace_back 源码 Example HowReference>>>>> 欢迎关注公众号【三戒纪元】 <<<<< What 前…

【爬虫小知识】如何利用爬虫爬网页——python爬虫

前言 网络时代的到来&#xff0c;给我们提供了海量的信息资源&#xff0c;但是&#xff0c;想要获取这些信息&#xff0c;手动一个一个网页进行查找&#xff0c;无疑是一项繁琐且效率低下的工作。这时&#xff0c;爬虫技术的出现&#xff0c;为我们提供了一种高效的方式去获取…

el-form的表单验证,有值却报红!

正确的写法是 el-form中的form用 :model绑定&#xff0c;各个输入项用 v-model绑定值 原因 显然&#xff0c;区别就是 v-model 和 :model的区别 V-mode v-model是一个语法糖&#xff0c;用于 “表单元素上” 实现双向数据绑定。包括数据绑定和事件监听。 <input v-model&q…

Docker技术--Docker简介和架构

1.Docker简介 (1).引入 我们之前学习了EXSI,对于虚拟化技术有所了解,但是我们发现类似于EXSI这样比较传统的虚拟化技术是存在着一定的缺陷:所占用的资源比较多,简单的说,就是你需要给每一个用户提供一个操作平台,这一个操作平台就会占用你的资源。这样资源的浪费是比较多的…

Ansys Zemax | 大功率激光系统的 STOP 分析(五)

大功率激光器广泛用于各种领域当中&#xff0c;例如激光切割、焊接、钻孔等应用中。由于镜头材料的体吸收或表面膜层带来的吸收效应&#xff0c;将导致在光学系统中由于激光能量吸收所产生的影响也显而易见&#xff0c;大功率激光器系统带来的激光能量加热会降低此类光学系统的…

问道管理:逾4600股飘红!汽车板块爆了,多股冲击涨停!

A股商场今天上午全体低开&#xff0c;但其后逐级上行&#xff0c;创业板指数上午收盘大涨超越3%&#xff0c;北向资金也完成净买入38亿元。 别的&#xff0c;A股商场半年报成绩发表如火如荼进行中&#xff0c;多家公司发表半年报后股价应声大涨&#xff0c;部分公司股价冲击涨停…