由 STM32单片机+按键模拟计步+RTC时钟模块+DS18B20温度传感器模块+心率采集模块+串口模块+OLED显示模块+键盘模块
1、采用STM32F103单片机为主控制器
2、利用按键模拟实现计步,RTC内部时钟提供时钟信号,通过心率传感器采集心率信号测量心率,DS18B20温度传感器实现体温测量。
3、OLED显示体温、步数、日期时间、心率等信息,
4、通过串口将心率、步数、体温、IBI等信息发送至串口显示
5、按键功能:三个按键用于调整日期、时间;具有一个清楚步数按键;具有一个切换信息显示按键。
6、步数清零功能:每天00:00会自动清除前一天的步数,也可通过按键清除。
7、仿真中心率传感器用波形发生器和按键两种方式模拟,可用开关切换。
注意:proteus8.11版本才能打开 心率测量误差±1
8、基于STM32单片机的智能手环设计(OLED显示)
主界面:
#include "delay.h"
#include "OLED_I2C.h"
#include "pulsesensor.h"
#include "ds18b20.h"
#include "timer.h"
#include "rtc.h"
#include "key.h"
#include "usart.h"
#include "stdio.h"
#include "stdlib.h"
#include
extern unsigned int cnt;
unsigned char Dis_mode; //显示状态标志 0:显示传感器数据 1:显示日期时间
void Dis_Init(void)
{
OLED_ShowCN(0,0,10); //心率
OLED_ShowCN(16,00,11);
OLED_ShowStr(32,0,":---/min",2);
OLED_ShowCN(0,2,12); //步数
OLED_ShowCN(16,2,13);
OLED_ShowCN(0,4,14); //体温
OLED_ShowCN(16,4,15);
}
void Dis_Time(void)
{
OLED_ShowCN(16*2,0,16); //时间
OLED_ShowCN(16*3,0,17);
OLED_ShowCN(16*4,0,30); //时间
OLED_ShowCN(16*5,0,31);
OLED_ShowCN(0,2,18); //日期
OLED_ShowCN(16,2,19);
OLED_ShowCN(0,4,16); //时间
OLED_ShowCN(16,4,17);
}
void RTC_Clock_Init(void);
int main(void)
{
unsigned char buf[18];
unsigned short int STEPS=0; //步数
unsigned char Heart = 0; //心率值
short temprature; //定义温度变量
unsigned char key_value = 0; //按键返回值
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
OLED_Init(); //OLED初始化操作
OLED_CLS(); //OLED清除屏幕
OLED_ShowCN(32,2,0); //欢迎使用
OLED_ShowCN(32+16,2,1);
OLED_ShowCN(32+32,2,2);
OLED_ShowCN(32+32+16,2,3);
KEY_Init(); //IO初始化
DS18B20_Init();
while(DS18B20_Init()!=0) //ds18b20初始化检测
{
OLED_ShowStr(0,0,(u8 *)" DS18B20 Error! ",2);
delay_ms(100);
OLED_ShowStr(0,0,(u8 *)" ",2);
delay_ms(100);
}
USART1_Init(9600);
TIM3_Int_Init(11,7350); //定时 按照正常计算发现数值偏大 这里作为微调使仿真中更加准确
EXTIX_Init(); //外部中断初始化
TIM2_Int_Init(199,7199); //10Khz的计数频率,计数到200为20ms
RTC_Clock_Init();
OLED_CLS(); //清屏
Dis_Init();
UsartPrintf(USART1,"*************************** 欢迎使用!******************\r\n");
while(1)
{
key_value = KEY_Scan(0); //按键单击
switch(key_value)
{
case 1:
KEY_Set();
break;
case 2: //清除步数
STEPS = 0;
break;
case 4:
OLED_CLS(); //清屏
if(Dis_mode==0) //如果上一次是显示心率、步数、体温 的 则显示时间
{
Dis_Time();
Dis_mode = 1;
}
else //如果上一次不是显示心率、步数、体温 的 则心率、步数、体温
{
Dis_mode = 0;
Dis_Init(); //显示汉字信息
}
break;
case 5: //KEY5按下
STEPS++;
break;
}
if(flag_timer==1) //毫秒赋一次值 flag_timer是标志位
{
flag_timer = 0; //清除标志 等待下一次
TIM_Cmd(TIM2, DISABLE); //使能TIMx
TIM_Cmd(TIM3, DISABLE); //使能TIMx
temprature = DS18B20_Get_Temp(); //读取温度
TIM_Cmd(TIM2, ENABLE); //使能TIMx
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
if(update_flag==1) //2S标志到 发送一次数据到手机APP
{
update_flag = 0;
UsartPrintf(USART1,"步数:%5d步 心率:%3d/min 体温:%4.1f℃ IBI:%4dms\r\n",STEPS,Heart,(float)temprature/10,cnt); //串口发送出去
}
if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2)) //凌晨00:00:00 清除步数
{
STEPS = 0;
}
switch(Dis_mode)
{
case 0: //显示传感器数据
sprintf((char*)buf,":%5d",STEPS); //显示步数
OLED_ShowStr(16*2,2,buf,2);
OLED_ShowCN(16*5,2,12); //汉字 步
Heart = Pulsesensor_Read(); //获取心率值
sprintf((char *)buf,(const char *)":%3d/min",Heart);
OLED_ShowStr(16*2,0,buf,2);
sprintf((char *)buf,(const char *)":%5.1f",(float)temprature/10);
OLED_ShowStr(16*2,4,buf,2);
sprintf((char *)buf,(const char *)"IBI:%4dms",cnt);
OLED_ShowStr(0,6,buf,2);
break;
case 1: //显示时间 日期等信息
RTC_Display(); //显示时钟
break;
}
}
}
1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包
链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w
提取码:2756
3、KEIL5 MDK软件(STM32开发软件)
链接:https://pan.baidu.com/s/1t3eY-3yRdTa7jZMlijq_jg
提取码:ab58
代码下载:
https://pan.baidu.com/s/1UsOJUPcWZJHoh6UiGPrnCA?pwd=6aos