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

本文介绍了一种基于STC89C52单片机的蓝牙智能手环,集成了ADXL345传感器、DS1302时钟、心率传感器等模块,可实时监测步数、心率和体温,并通过BT06模块将数据传输至手机APP。设计包括硬件连接、软件编程及Proteus仿真等内容。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机技能设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值