【Proteus仿真】【STM32单片机】血压心率血氧体温蓝牙

文章目录

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


一、功能简介

系统运行后,LCD1604液晶显示心率、血氧、血压和体温,及其阈值;可通过K3键进入阈值设置模式,K1和K2加减调节,K4确定;当检测心率、血氧、血压和体温任意超限则蜂鸣器报警;
同时系统会将数据通过蓝牙传输出去;


二、软件设计

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

*/


//系统数据获取
void sys_data_get(void)
{
	static u8 i=0;
	while(1)
	{
		i++;
		//间隔采集温度
		if(i%5==0)
		{
			sys_ctrl.temp=DS18B20_GetTemperture()*10;//放大10倍,保留小数点后1位	
		}
		//获取血氧
		sys_ctrl.oxy=pcf8591_read_adcvalue(0);
		sys_ctrl.oxy=pcf8591_read_adcvalue(0);
		sys_ctrl.oxy=cal_map(sys_ctrl.oxy,0,255,0,150);
		//获取高低压
		sys_ctrl.xy_hval=pcf8591_read_adcvalue(1);
		sys_ctrl.xy_hval=pcf8591_read_adcvalue(1);
		sys_ctrl.xy_lval=pcf8591_read_adcvalue(2);
		sys_ctrl.xy_lval=pcf8591_read_adcvalue(2);

		break;
	}	
}

//系统数据显示
void sys_data_show(void)
{
	u8 buf[5];
	static u8 i=0;
	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';
			lcd1604_show_string(3,0,buf);
			//心率显示
			if(sys_ctrl.sta==1)
			{
				sys_ctrl.sta=0;
				sys_ctrl.cnt=0;
				lcd1604_show_nums(3,1,sys_ctrl.heart,3,0);
				EXTI_Sta(1);//打开计数
			}
			//血氧显示
			lcd1604_show_nums(3,2,sys_ctrl.oxy,3,0);
			//血压低显示
			lcd1604_show_nums(4,3,sys_ctrl.xy_lval,3,0);
			//血压高显示
			lcd1604_show_nums(13,3,sys_ctrl.xy_hval,3,0);
			
			//温度阈值显示
			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';
			lcd1604_show_string(11,0,buf);
			//心率阈值显示
			lcd1604_show_nums(9,1,sys_ctrl.heartl,3,0);
			lcd1604_show_nums(13,1,sys_ctrl.hearth,3,0);
			//血氧阈值显示
			lcd1604_show_nums(9,2,sys_ctrl.oxyl,3,0);
			lcd1604_show_nums(13,2,sys_ctrl.oxyh,3,0);
			
			//蓝牙传输数据
			i++;
			if(i%4==0)
			{
				printf("\r\n体温:");
				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';
				UART_SendString(buf);
				printf("\r\n");
				printf("心率:%d\r\n",sys_ctrl.heart);
				printf("血氧:%d\r\n",sys_ctrl.oxy);
				printf("血压低:%d\r\n",sys_ctrl.xy_lval);
				printf("血压高:%d\r\n",sys_ctrl.xy_hval);
			}
		}
		
		//设置阈值下,数字闪烁提示
		switch(sys_ctrl.mode)
		{
			case 1://温度阈值
				lcd1604_show_string(11,0,"    ");
				delay_ms(50);
				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';
				lcd1604_show_string(11,0,buf);
				break;
			case 2://心率下限
				lcd1604_show_string(9,1,"   ");
				delay_ms(50);
				lcd1604_show_nums(9,1,sys_ctrl.heartl,3,0);
				break;
			case 3://心率上限
				lcd1604_show_string(13,1,"   ");
				delay_ms(50);
				lcd1604_show_nums(13,1,sys_ctrl.hearth,3,0);
				break;
			case 4://血氧下限
				lcd1604_show_string(9,2,"   ");
				delay_ms(50);
				lcd1604_show_nums(9,2,sys_ctrl.oxyl,3,0);
				break;
			case 5://血氧上限
				lcd1604_show_string(13,2,"   ");
				delay_ms(50);
				lcd1604_show_nums(13,2,sys_ctrl.oxyh,3,0);
				break;
		}
		
		break;			
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//正常模式
	if(sys_ctrl.mode==0)
	{
		//如果温度、血氧、心率、血压超限,蜂鸣器报警
		if(sys_ctrl.temp>sys_ctrl.temph || 
			sys_ctrl.heart>sys_ctrl.hearth || sys_ctrl.heart<sys_ctrl.heartl
			|| sys_ctrl.oxy>sys_ctrl.oxyh || sys_ctrl.oxy<sys_ctrl.oxyl
			|| sys_ctrl.xy_hval>XY_HVAL1 || sys_ctrl.xy_hval<XY_HVAL2
			|| sys_ctrl.xy_lval>XY_LVAL1 || sys_ctrl.xy_lval<XY_LVAL2)
		{
			beep_alarm(2,2000);
		}
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	KEY_Init();
	BEEP_Init();
	pcf8591_init();
	My_EXTI_Init();
	TIM2_Init(100,800-1);
	USART1_Init(9600);
	//等待数据稳定
	while(i--)
	{
		//读取温值
		sys_ctrl.temp=DS18B20_GetTemperture()*10;
		delay_ms(100);
	}
	lcd1604_init();//LCD1604初始化
	sys_open_show();//系统初始界面显示
	EXTI_Sta(1);//打开计数

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

//定时器2中断
void TIM2_IRQHandler(void)
{
	static u8 i=0;
	if(TIM_GetITStatus(TIM2,TIM_IT_Update))
	{
		i++;
		if(i>=100)//间隔1S
		{
			i=0;
			EXTI_Sta(0);//关闭计数
			TIM_Cmd(TIM2,DISABLE);//关闭定时器
			sys_ctrl.sta=1;
			sys_ctrl.heart=sys_ctrl.cnt;
		}
	}
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);	
}

//外部中断函数
void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line14)==1)
	{
		if(sys_ctrl.cnt==0)TIM_Cmd(TIM2,ENABLE);//打开定时器
		sys_ctrl.cnt++;
	}
	EXTI_ClearITPendingBit(EXTI_Line14);
}


三、实验现象

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

【Proteus仿真】【STM32单片机】血压心率血氧体温蓝牙_第1张图片
【Proteus仿真】【STM32单片机】血压心率血氧体温蓝牙_第2张图片
【Proteus仿真】【STM32单片机】血压心率血氧体温蓝牙_第3张图片


联系作者

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

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