【Proteus仿真】【STM32单片机】智能手环

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

系统运行后,OLED显示温度、心率、加速度极其阈值;
可按下K3键进入阈值设置模式,K1和K2调节对应阈值,K4确定;当检测体温、心率、加速度超出阈值范围,则蜂鸣器报警,同时将发送报警信息。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/



//系统数据显示
void sys_data_show(void)
{
	u8 buf[5];
	while(1)
	{
		//正常模式
		if(sys_ctrl.mode==0)
		{
			//温度显示
			buf[0]=sys_ctrl.temp/100+0x30;
			buf[1]=sys_ctrl.temp%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.temp%100%10+0x30;
			buf[4]='\0';
			OLED_ShowString(3*8,2,buf,16);
			//心率显示
			OLED_ShowNum(3*8,4,sys_ctrl.heat,3,16);
			//加速度显示
			OLED_ShowNum(3*8,6,sys_ctrl.adxl,2,16);

			//温度阈值显示
			buf[0]=sys_ctrl.temph/100+0x30;
			buf[1]=sys_ctrl.temph%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.temph%100%10+0x30;
			buf[4]='\0';
			OLED_ShowString(10*8,2,buf,16);
			//心率阈值显示
			OLED_ShowNum(9*8,4,sys_ctrl.heatl,2,16);
			OLED_ShowNum(12*8,4,sys_ctrl.heath,3,16);
			//加速度阈值显示
			OLED_ShowNum(9*8,6,sys_ctrl.adxlh,2,16);
		}
			
		//阈值设定,数据位置闪烁
		switch(sys_ctrl.mode)
		{
			case 1://温度
				OLED_ShowString(10*8,2,"    ",16);
				delay_ms(1);
				buf[0]=sys_ctrl.temph/100+0x30;
				buf[1]=sys_ctrl.temph%100/10+0x30;
				buf[2]='.';
				buf[3]=sys_ctrl.temph%100%10+0x30;
				buf[4]='\0';
				OLED_ShowString(10*8,2,buf,16);
				break;
			case 2://心率下
				OLED_ShowString(9*8,4,"  ",16);
				delay_ms(1);
				OLED_ShowNum(9*8,4,sys_ctrl.heatl,2,16);
				break;
			case 3://心率上
				OLED_ShowString(12*8,4,"   ",16);
				delay_ms(1);
				OLED_ShowNum(12*8,4,sys_ctrl.heath,3,16);
				break;
			case 4://加速度
				OLED_ShowString(9*8,6,"  ",16);
				delay_ms(1);
				OLED_ShowNum(9*8,6,sys_ctrl.adxlh,2,16);
				break;
		}

		break;			
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	
	key=KEY_Scan(0);
	//模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>4)sys_ctrl.mode=1;
	}
	//阈值设置模式
	if(sys_ctrl.mode!=0)
	{
		//加
		if(key==KEY1_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度 
					sys_ctrl.temph++;
					if(sys_ctrl.temph>999)sys_ctrl.temph=0;
					break;
				case 2://心率下 
					sys_ctrl.heatl++;
					if(sys_ctrl.heatl>99)sys_ctrl.heatl=0;
					break;
				case 3://心率上 
					sys_ctrl.heath++;
					if(sys_ctrl.heath>999)sys_ctrl.heath=0;
					break;
				case 4://加速度
					sys_ctrl.adxlh++;
					if(sys_ctrl.adxlh>99)sys_ctrl.adxlh=0;
					break;
			}		
		}
		//在设置模式下,减
		else if(key==KEY2_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度 
					sys_ctrl.temph--;
					if(sys_ctrl.temph<0)sys_ctrl.temph=999;
					break;
				case 2://心率下 
					sys_ctrl.heatl--;
					if(sys_ctrl.heatl<0)sys_ctrl.heatl=99;
					break;
				case 3://心率上 
					sys_ctrl.heath--;
					if(sys_ctrl.heath<0)sys_ctrl.heath=999;
					break;
				case 4://加速度
					sys_ctrl.adxlh--;
					if(sys_ctrl.adxlh<0)sys_ctrl.adxlh=99;
					break;
			}		
		}
		//确定
		else if(key==KEY4_PRESS)
		{
			sys_ctrl.mode=0;		
		}
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	KEY_Init();
	BEEP_Init();
	DS18B20_Init();
	pcf8591_init();
	ADCx_Init();
	USART1_Init(9600);
	OLED_Init();//LCD1602初始化
	//读取温度数据,等待稳定
	while(i--)
	{
		//温度获取
		sys_ctrl.temp=DS18B20_GetTemperture();
		//角速度获取
		sys_ctrl.adxl=pcf8591_read_adcvalue(0);
		sys_ctrl.adxl=cal_map(sys_ctrl.adxl,0,255,0,99);
		delay_ms(100);		
	}
	sys_open_show();//系统初始界面显示

	while(1)
	{
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制		
	}
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619

【Proteus仿真】【STM32单片机】智能手环_第1张图片
【Proteus仿真】【STM32单片机】智能手环_第2张图片
【Proteus仿真】【STM32单片机】智能手环_第3张图片
【Proteus仿真】【STM32单片机】智能手环_第4张图片


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(单片机,proteus,stm32)