怎样去设计一种基于STM32单片机的智能手环脉搏心率计步器
2023-09-07 来源:elecfans
一:功能
基于STM32单片机智能手环心率计步器体温显示设计
本设计由STM32F103C8T6单片机核心板电路+ADXL345传感器电路+心率传感器电路+温度传感器+lcd1602电路组成。
1、通过重力加速度传感器ADXL345检测人的状态,计算出走步数、走路距离和平均速度。
2、通过心率传感器实时检测心率,通过温度传感器检测温度。
3、lcd1602实时显示步数、距离和平均速度、心率以及温度值。
二:电路图
三:源代码
#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); /* 显示 */
}
}
}