功能:
0.本系统采用STM32F103RCT6作为单片机
1.系统采用LCD1602液晶实时显示转速 心率以及跑步时间等情况
2.系统设计有三个功能按键可以控制电机的启停以及复位跑步时间
3.心率检测采用成熟的功能模块,再将该信号经过比较器处理之后送入单片机
4.采用DC002作为电源接口可直接输入5V给整个系统供电
5.系统设置有心率上限值,一旦心率超过上限 声光将会报警
原理图:
PCB :
主程序:
#define __MAIN_C
#include "main.h"
#include "stdio.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "bsp_gpio.h"
#include "bsp_clkconfig.h"
#include "bsp_delay.h"
#include "bsp_GeneralTim.h"
#include "bsp_lcd1602.h"
#include "bsp_key.h"
#include "bsp_exti.h"
#define DIAMETER 30 //直径mm
volatile CreatByte Flag;
uint8_t datIndex = 0;
float heartRateBuf[6] = {0}; //暂存心率值
float heartRate = 0;
char tab0[16]; //显示内容缓存
uint16_t timeSecond = 0;
uint16_t timeMinute = 0;
uint16_t pulseCnt = 0;
uint32_t timeCnt = 0;
int main(void)
{
dispFlag = 1;
refreshFlag = 0;
updateFlag = 0;
startFlag = 0;
// 使用HSI,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是64MH
HSI_SetSysClock(RCC_PLLMul_2); //使用内部8MHz晶振,并设置PLL输出为8MHz
// GPIO端口初始化
GPIO_Config();
Key_GPIO_Config();
LCD_GPIO_Init();
LCD_Init();
LCD_Clear();
DelayMs(250);
LCD_DispStr(0, 0, " Welcome! ");
DelayMs(1000);
LCD_Clear();
sprintf(tab0, "Speed:%5.1fkm/h ", (float)pulseCnt * DIAMETER * 3.14 * 3.6 / 1000);
LCD_DispStr(0, 0, tab0); //显示转速 第一行
sprintf(tab0, "HR:%3dbpm %3dm%02d", (uint16_t)heartRate, timeMinute, timeSecond);
LCD_DispStr(0, 1, tab0); //显示心率
EXTI_MOTOR_Config();
GENERAL_TIM_Init(); //初始化TIM
GENERAL_TIM3_CH3_INPUT_CAPTURE(); //配置TIM3的CH3为输入捕获模式
TIM_ITConfig(GENERAL_TIM3, TIM_IT_Update | GENERAL_TIM3_IT_CCx, ENABLE); // 开启更新和捕获中断
while (1)
{
if (refreshFlag == 1)
{
TIM_ITConfig(GENERAL_TIM3, TIM_IT_Update | GENERAL_TIM3_IT_CCx, DISABLE); // 关闭更新和捕获中断
refreshFlag = 0;
heartRateBuf[datIndex] = (float)timeCnt / 1000.0; //算出间隔时间
timeCnt = 0;
datIndex++;
if (datIndex > 3) //记录到超过等于2次时间
{
datIndex = 1; //计数从1开始
updateFlag = 1; //测得2次开始显示
}
TIM_ITConfig(GENERAL_TIM3, TIM_IT_Update | GENERAL_TIM3_IT_CCx, ENABLE); // 开启更新和捕获中断
}
if (dispFlag == 1) //更新显示标志置位
{
dispFlag = 0; //更新显示标志清零
if (updateFlag == 1) //如果显示关 检测心率是否真实
{
updateFlag = 0;
heartRate = 60000 / ((heartRateBuf[1]/2) + (heartRateBuf[2]/2)); //心率计算 2次求平均值
if (heartRate > 120)
{
BUZZER_ON;
}
else
{
BUZZER_OFF;
}
sprintf(tab0, "HR:%3dbpm", (uint16_t)heartRate);
LCD_DispStr(0, 1, tab0); //显示心率
}
sprintf(tab0, "%3dm%02d", timeMinute, timeSecond);
LCD_DispStr(10, 1, tab0); //显示时间
sprintf(tab0, "Speed:%5.1fkm/h ", (float)pulseCnt * DIAMETER * 3.14 * 3.6 / 1000);
LCD_DispStr(0, 0, tab0); //显示转速 第一行
pulseCnt = 0;
}
KeyProcess();
}
}
/*********************************************END OF FILE**********************/