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