基于51单片机步数检测计步器无线蓝牙APP上传设计
1. 系统功能概述
本设计是一款基于STC89C52单片机的智能计步器系统,通过ADXL345加速度传感器采集人体运动状态,实现步数、路程、卡路里计算与显示,同时将数据通过蓝牙模块实时上传到手机APP端。该系统采用LCD1602液晶屏显示运动数据,并通过呼吸灯动态显示运动节奏,既具有实用性,又具备良好的交互体验。
系统整体采用模块化设计,分为主控单元、加速度检测单元、蓝牙通信单元、液晶显示单元、呼吸灯指示单元以及电源管理单元。通过软硬件结合,实现了人体运动状态的智能检测与无线传输,能够识别站立(Stand)、躺卧(Lie)、走路(Walk)、奔跑(Run)等多种状态,并准确统计运动步数、计算行走距离和能量消耗。
该系统具有以下主要功能:
- 步数检测功能:利用ADXL345加速度传感器检测人体运动加速度变化,实现步数的精准计数。
- 运动状态识别:通过加速度幅值与方向判断当前运动状态(Stand、Lie、Walk、Run)。
- LCD实时显示:LCD1602液晶显示步数、路程、卡路里及运动状态等信息。
- 蓝牙数据上传:通过蓝牙模块将实时运动数据以字符串格式上传到手机APP,实现远程监测。
- 呼吸灯动态指示:LED呼吸灯根据运动强度和步频变化,动态显示运动状态,提升交互性。
- 低功耗设计:在无运动状态下自动进入低功耗模式,延长电池寿命。
系统上传的数据格式如下:
*B:0005J:02.3mK:0131.04calWalk #
*B:0006J:02.7mK:0157.25calStand#
其中:
- B 表示步数;
- J 表示路程(米);
- K 表示卡路里(cal);
- 最后的英文单词 表示运动状态。
2. 系统电路设计
系统硬件电路包括六个主要部分:
- STM89C52单片机最小系统
- ADXL345三轴加速度传感器模块
- LCD1602液晶显示模块
- 蓝牙无线通信模块
- 呼吸灯LED电路
- 电源模块
以下分别进行详细介绍。
2.1 STC89C52单片机最小系统
STC89C52单片机作为系统的核心控制单元,负责采集ADXL345传感器数据、分析运动状态、计算步数与卡路里、显示LCD信息以及蓝牙数据上传。
主要特性:
- 内部时钟频率高达12MHz;
- 具有丰富的I/O口资源,可同时连接多模块;
- 支持UART串口通信,用于蓝牙数据传输;
- 低功耗模式适用于便携式设备;
- 内部定时器用于步数采样与时间计算。
主要连接关系:
- I²C总线连接ADXL345(SCL与SDA);
- LCD1602使用并行接口连接P0口;
- 蓝牙模块通过UART(TXD、RXD)连接P3.0、P3.1;
- LED呼吸灯连接P2口的PWM输出端;
- 电源输入端提供+5V电压,经稳压电路转为3.3V。
2.2 ADXL345加速度传感器电路
ADXL345是一款低功耗、三轴数字加速度传感器,可测量静态加速度(重力)与动态加速度(运动或震动)。
主要技术参数:
- 测量范围:±16g;
- 通信接口:I²C或SPI;
- 分辨率:13位;
- 低功耗待机电流:0.1μA;
工作原理 :
人体运动时,ADXL345会检测到不同方向的加速度变化,单片机通过定时采样获取三轴加速度值,并通过滤波算法分析周期性波动。每当加速度信号超过阈值时,系统判断为一次有效步伐,从而实现步数检测。
电气连接:
- VCC → 3.3V;
- GND → GND;
- SDA → P2.1;
- SCL → P2.0。
2.3 LCD1602液晶显示电路
LCD1602模块用于实时显示运动数据,包括步数(B)、距离(J)、卡路里(K)以及运动状态。LCD1602具有价格低廉、字符显示清晰、编程简单等优点。
主要特点:
- 16列×2行字符显示;
- 工作电压5V;
- 数据接口可选择4位或8位模式;
- 带背光控制端。
系统使用8位并行方式,数据端连接P0口,控制端RS、RW、EN连接P2.5、P2.6、P2.7。程序中通过LCD初始化函数、清屏函数、显示字符串函数实现显示控制。
2.4 蓝牙通信电路
系统采用常用的HC-05蓝牙模块进行无线通信,通过UART接口与单片机连接。模块通过AT命令配置通信波特率(默认9600bps),实现与手机APP的数据交互。
主要功能:
- 接收单片机发送的运动数据;
- 通过串口蓝牙助手或自定义APP显示实时步数、距离与状态;
- 支持实时数据刷新与保存。
连接方式:
- VCC → 5V;
- GND → GND;
- TXD → P3.0(RXD);
- RXD → P3.1(TXD)。
蓝牙数据传输格式采用字符串方式,方便APP端直接解析。例如:
*B:0014J:7.7mK:448.45calWalk #
2.5 呼吸灯电路
呼吸灯采用PWM调光电路,通过单片机定时器输出可变占空比PWM信号,实现LED灯亮度缓慢变化的呼吸效果。
功能说明:
- 当运动状态为Walk或Run时,LED以动态节奏闪烁;
- 当处于Stand或Lie状态时,LED保持常亮或熄灭;
- 可通过PWM周期调节闪烁速度与亮度幅度。
LED呼吸灯不仅提升了系统美观度,还可作为运动节奏的视觉提示。
2.6 电源电路
系统电源采用5V供电,可使用锂电池或USB供电方式。电路中加入AMS1117-3.3稳压芯片为ADXL345与蓝牙模块提供3.3V电压,同时使用电解电容与陶瓷电容进行滤波,确保信号稳定。
3. 系统程序设计
系统程序采用模块化设计,包括主程序模块、传感器数据采集模块、步数计算模块、运动状态判断模块、LCD显示模块、蓝牙通信模块以及呼吸灯控制模块。
3.1 主程序设计
主程序负责系统初始化、定时采样与循环控制。核心逻辑为"采集 → 计算 → 显示 → 上传"。
c
#include <reg52.h>
#include "iic.h"
#include "adxl345.h"
#include "lcd1602.h"
#include "bluetooth.h"
#include "led.h"
#include "delay.h"
unsigned int step_count = 0;
float distance = 0;
float calorie = 0;
char state[10];
void main(void)
{
LCD_Init();
IIC_Init();
ADXL345_Init();
Bluetooth_Init();
LED_Init();
while(1)
{
ADXL345_ReadXYZ();
if(CheckStep())
{
step_count++;
distance = step_count * 0.45;
calorie = step_count * 0.08;
JudgeState();
DisplayData(step_count, distance, calorie, state);
Bluetooth_SendData(step_count, distance, calorie, state);
}
LED_BreathEffect(state);
Delay_ms(500);
}
}
3.2 ADXL345传感器采集程序
c
void ADXL345_ReadXYZ(void)
{
int16_t x, y, z;
x = IIC_Read16(ADXL345_ADDR, DATAX0);
y = IIC_Read16(ADXL345_ADDR, DATAY0);
z = IIC_Read16(ADXL345_ADDR, DATAZ0);
// 计算加速度幅值
acc_value = sqrt(x*x + y*y + z*z);
// 过滤噪声
if(acc_value > THRESHOLD)
step_flag = 1;
else
step_flag = 0;
}
3.3 步数检测算法
步数检测采用阈值法与时间间隔过滤法结合。
c
bit CheckStep(void)
{
static unsigned long last_time = 0;
if(step_flag == 1 && (millis() - last_time) > 300)
{
last_time = millis();
return 1;
}
return 0;
}
该算法能有效避免抖动误判与多次计步。
3.4 运动状态判断模块
根据加速度幅值与方向判断运动类型。
c
void JudgeState(void)
{
if(acc_value < 100) strcpy(state, "Lie");
else if(acc_value < 300) strcpy(state, "Stand");
else if(acc_value < 600) strcpy(state, "Walk");
else strcpy(state, "Run");
}
3.5 LCD显示模块
c
void DisplayData(unsigned int step, float dist, float cal, char *st)
{
LCD_Clear();
LCD_ShowString(0, 0, "B:");
LCD_ShowNum(2, 0, step, 4);
LCD_ShowString(8, 0, "J:");
LCD_ShowFloat(10, 0, dist, 2);
LCD_ShowString(0, 1, "K:");
LCD_ShowFloat(2, 1, cal, 2);
LCD_ShowString(10, 1, st);
}
LCD1602通过清晰的字符界面实时显示用户的运动情况。
3.6 蓝牙通信模块
c
void Bluetooth_SendData(unsigned int step, float dist, float cal, char *st)
{
char buffer[50];
sprintf(buffer, "*B:%04dJ:%.1fmK:%.2fcal%s #", step, dist, cal, st);
UART_SendString(buffer);
}
此函数格式化运动数据为字符串并通过蓝牙发送。手机端APP收到后即可实时显示。
3.7 呼吸灯控制程序
c
void LED_BreathEffect(char *st)
{
if(strcmp(st, "Walk") == 0)
LED_PWM(50); // 中等亮度
else if(strcmp(st, "Run") == 0)
LED_PWM(90); // 高亮快闪
else if(strcmp(st, "Stand") == 0)
LED_PWM(20); // 微亮
else
LED_PWM(0); // 熄灭
}
LED灯的亮度变化节奏与运动状态同步,提升了系统的交互效果。
4. 系统运行与效果说明
系统上电后,LCD1602显示初始界面,蓝牙模块自动连接手机。用户佩戴设备开始运动时,ADXL345检测到加速度波动,单片机分析后开始累计步数。LCD显示实时更新的步数、路程和卡路里,同时通过HC-05将数据上传至手机APP,用户可在手机端实时查看运动统计。
当用户停止运动时,LED呼吸灯亮度减弱或熄灭,表示系统进入待机状态。系统通过判断运动强度可识别出"躺卧""站立""走路""奔跑"等状态,并动态调整显示内容与灯光效果,实现了智能化、交互式的运动监测体验。
该系统不仅具备良好的实时性和准确性,而且具有可扩展性,可进一步加入心率传感器、GPS定位模块,实现更为全面的运动健康监测功能。