赞
踩
由 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 <string.h>
-
- 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
代码下载:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。