单片机
返回首页

怎样去设计一种基于STM32单片机的智能手环脉搏心率计步器

2023-09-07 来源:elecfans

一:功能


基于STM32单片机智能手环心率计步器体温显示设计


本设计由STM32F103C8T6单片机核心板电路+ADXL345传感器电路+心率传感器电路+温度传感器+lcd1602电路组成。


1、通过重力加速度传感器ADXL345检测人的状态,计算出走步数、走路距离和平均速度。


2、通过心率传感器实时检测心率,通过温度传感器检测温度。


3、lcd1602实时显示步数、距离和平均速度、心率以及温度值。


二:电路图

fe7d8278db65a2b5692e7c3b4447bd9b_wKgaomTnJuaAJhKTAANoXFmZv_0383.png

三:源代码


#include 'led.h'

#include 'delay.h'

#include 'sys.h'

#include 'usart.h'

#include 

#include 'timer.h'

#include 'key.h'

#include 'exti.h'

#include 'adxl345.h'

#include 'lcd1602.h'

#include 'ds18b20.h'



unsigned char ReadAdxl345;                                              /* 定时读取adxl345数据          */

unsigned char ErrorNum=0;                                               /* 记录错误次数                 */

unsigned char CheckNum=0;                                               /* 检测次数                     */



char dis0[16];                                                          /* 液晶数组显示暂存             */

char dis1[35];



unsigned int xlTab[5];                                                  /* 心率数组                     */

unsigned char count=0;                                                  /* 心率滤波计数                 */

unsigned int xinLater=0;                                                /* 心率延时处理                 */

unsigned int xinLv =0;                                                  /* 心率值                       */



unsigned int BuShu=0;                                                   /* 步数                         */

unsigned int Normal_num=0;                                              /* 正常次数                     */

unsigned int Error_num=0;                                               /* 倾斜次数                     */



unsigned int disBuShu = 0;                                              /* 显示步数                     */

float disJuLi = 0;                                                      /* 显示距离                     */

float temperature;                                                      /* 温度                         */

unsigned char readTemp = 0;                                             /* 读取温度标志                 */



int main(void)

{

    delay_init();                                                       /* 延时函数初始化               */

    uart_init(9600);                                                    /* 串口初始化为9600             */

    TIM3_Int_Init(49,7199);                                             /* 50ms                         */

    EXTIX_Init();                                                       /* 初始化外部中断               */

    LED_Init();                                                         /* 初始化与LED连接的硬件接口    */

    KEY_Init();                                                         /* 初始化按键                   */

    

    Lcd_GPIO_init();                                                    /* 初始化lcd引脚                */

    Lcd_Init();                                                         /* 初始化lcd屏幕                */

    delay_ms(200);

    

    Init_ADXL345();

    if(Single_Read_ADXL345(0X00)==0xe5)

    {

        delay_ms(5);

    }

    else

    {

        delay_ms(3);

    }

    

    while(1)

    {

        

        if(ReadAdxl345== 1)                                             /* 定时读取adxl345数据          */

        {

            ReadAdxl345= 0;

            ReadData_x();                                               /* 三轴检测函数                 */

            CheckNum++;

            if((temp_Y>450)||(temp_Y<-450))                             /* 查看正常次数                 */

            {

                Normal_num++;                                           /* 正常次数++                   */

            }

            else

            {

                Error_num++;                                            /* 倾斜次数                     */

            }

            if((Error_num!=0)&&(Normal_num!=0))                         /* 检测到步数                   */

            {

                BuShu++;                                                /* 步数脉冲量++                 */

                Error_num=0;                                            /* 清除一个周期检测             */

                Normal_num=0;

            }

        }

        

        if(disFlag==1)                                                  /* 显示标志                     */

        {

            disFlag = 0;

            

            readTemp++;                                                 /* 定时计数                     */

            if(readTemp >= 8)                                           /* 约800ms处理一次数据 温度     */

            {

                readTemp =0;                                            /* 重新计数                     */

                temperature=(float)DS18B20_Get_Temp()/10;               /* 缩小10倍为实际值             */

            }

            

            disBuShu = BuShu/2;                                         /* 显示步数                     */

            disJuLi = disBuShu*0.45;                                    /* 显示距离                     */

            

            sprintf(dis0,'X:%03d/min %4.1f C',xinLv,temperature);       /* 打印                         */

            Lcd_Puts(0,0,(unsigned char *)dis0);                        /* 显示                         */

            Lcd_1Put(14,0,0xdf);                                        /* 显示符号                     */

            sprintf(dis1,'BS:%03d JL:%4.1fm  ',disBuShu,disJuLi);       /* 打印                         */

            Lcd_Puts(0,1,(unsigned char *)dis1);                        /* 显示                         */

            

        }

    }

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 用数字电路CD4069制作的万能遥控轻触开关

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

    相关电子头条文章