STM32单片机驱动的智能手环设计与Proteus仿真研究

编号8

基于STM32单片机的智能手环设计(OLED显示)

功能描述:

        由 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 

代码下载:

https://pan.baidu.com/s/1UsOJUPcWZJHoh6UiGPrnCA?pwd=6aos

物联沃分享整理
物联沃-IOTWORD物联网 » STM32单片机驱动的智能手环设计与Proteus仿真研究

发表评论