基于51单片机步数检测计步器无线蓝牙APP上传设计

基于51单片机步数检测计步器无线蓝牙APP上传设计


1. 系统功能概述

本设计是一款基于STC89C52单片机的智能计步器系统,通过ADXL345加速度传感器采集人体运动状态,实现步数、路程、卡路里计算与显示,同时将数据通过蓝牙模块实时上传到手机APP端。该系统采用LCD1602液晶屏显示运动数据,并通过呼吸灯动态显示运动节奏,既具有实用性,又具备良好的交互体验。

系统整体采用模块化设计,分为主控单元、加速度检测单元、蓝牙通信单元、液晶显示单元、呼吸灯指示单元以及电源管理单元。通过软硬件结合,实现了人体运动状态的智能检测与无线传输,能够识别站立(Stand)、躺卧(Lie)、走路(Walk)、奔跑(Run)等多种状态,并准确统计运动步数、计算行走距离和能量消耗。

该系统具有以下主要功能:

  1. 步数检测功能:利用ADXL345加速度传感器检测人体运动加速度变化,实现步数的精准计数。
  2. 运动状态识别:通过加速度幅值与方向判断当前运动状态(Stand、Lie、Walk、Run)。
  3. LCD实时显示:LCD1602液晶显示步数、路程、卡路里及运动状态等信息。
  4. 蓝牙数据上传:通过蓝牙模块将实时运动数据以字符串格式上传到手机APP,实现远程监测。
  5. 呼吸灯动态指示:LED呼吸灯根据运动强度和步频变化,动态显示运动状态,提升交互性。
  6. 低功耗设计:在无运动状态下自动进入低功耗模式,延长电池寿命。

系统上传的数据格式如下:

复制代码
*B:0005J:02.3mK:0131.04calWalk #
*B:0006J:02.7mK:0157.25calStand#

其中:

  • B 表示步数;
  • J 表示路程(米);
  • K 表示卡路里(cal);
  • 最后的英文单词 表示运动状态。

2. 系统电路设计

系统硬件电路包括六个主要部分:

  1. STM89C52单片机最小系统
  2. ADXL345三轴加速度传感器模块
  3. LCD1602液晶显示模块
  4. 蓝牙无线通信模块
  5. 呼吸灯LED电路
  6. 电源模块

以下分别进行详细介绍。


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定位模块,实现更为全面的运动健康监测功能。

相关推荐
沐欣工作室_lvyiyi5 小时前
基于单片机和LabVIEW的多路数据采集器系统设计(论文+源码)
单片机·嵌入式硬件·毕业设计·数据采集·labview
何须至远7 小时前
机器人市场:犹如一颗深水核弹
stm32·单片机·机器人
m0_5982500010 小时前
串扰12-串扰对信号的影响
笔记·嵌入式硬件·硬件工程
小咕聊编程11 小时前
【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
微信小程序·小程序·毕业设计·教学辅助系统
LadyKaka22611 小时前
【IMX6ULL驱动学习】PWM驱动
linux·stm32·单片机·学习
Molesidy12 小时前
【MCU】【STM32】基于STM32CubeMX+CLion的STM32开发环境
stm32·单片机·嵌入式硬件·stm32cubemx·clion
10001hours13 小时前
(基于江协科技)51单片机入门:10.AT24C0
科技·嵌入式硬件·51单片机
transuperb14 小时前
51单片机AD/DA
网络·嵌入式硬件·51单片机
光子物联单片机16 小时前
STM32G474单片机开发入门(一)STM32G474RET6单片机详解
stm32·单片机·嵌入式硬件·mcu