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

news2025/1/19 17:16:47

文章目录

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


一、功能简介

系统运行后,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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/997346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java JUC 并发编程(笔记)

文章目录 再谈多线程并发与并行顺序执行并发执行并行执行 再谈锁机制重量级锁轻量级锁偏向锁锁消除和锁粗化 JMM内存模型Java内存模型重排序volatile关键字happens-before原则 多线程编程核心锁框架Lock和Condition接口可重入锁公平锁与非公平锁 读写锁锁降级和锁升级 队列同步…

ARMv7-A 那些事 - 2.通用寄存器与流水线

By: Ailson Jack Date: 2023.09.10 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/154.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

Visual Studio 2019 简单安装教程

思路 官方页面下载 – 安装Visual Studio Installer – 安装Visual Studio 2019 下载 打开页面&#xff1a;Visual Studio 2019 生成号和发布日期 | Microsoft Learn 点击需要的版本&#xff0c;跳转后会开始下载在线安装包&#xff0c;这里选择第一个Community版本 安装 …

SpringBoot【基础篇】

一、快速上手 按照要求&#xff0c;左侧选择web&#xff0c;然后在中间选择Spring Web即可&#xff0c;选完右侧就出现了新的内容项&#xff0c;这就表示勾选成功了 关注&#xff1a;此处选择的SpringBoot的版本使用默认的就可以了&#xff0c;需要说一点&#xff0c;SpringBo…

PatchMatchNet 学习笔记 译文 深度学习三维重建

9 PatchMatchNet CVPR-2021 patchmatchnet源码下载 PatchMatchNet 代码注释版 下载链接(注释非常详细,较源码结构有调整,使用起来更方便) PatchMatchNet-CVPR-2021(源码、原文+注释+译文+批注) 9.0 主要特点 金字塔,基于传统的PatchMatch算法,精度高,速度快 Pa…

Redis带你深入学习数据类型set

目录 1、set 2、set相关命令 2.1、添加元素 sadd 2.2、获取元素 smembers 2.3、判断元素是否存在 sismember 2.4、获取set中元素数量 scard 2.5、删除元素spop、srem 2.6、移动元素smove 2.7、集合中相关命令&#xff1a;sinter、sinterstore、sunion、sunionstore、s…

基于SSM的在线购物系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

nrf52832 GPIO输入输出设置

LED_GPIO #define LED_START 17 #define LED_0 17 #define LED_1 18 #define LED_2 19 #define LED_3 20 #define LED_STOP 20设置位输出模式&#xff1a; nrf_gpio_cfg_output(LED_0); 输出高电平:nrf_gpio_pin_set(LED_0); 输…

sqli-labs关卡之一(两种做法)

目录 一、布尔盲注(bool注入) 二、时间盲注(sleep注入) 一、布尔盲注(bool注入) 页面没有报错和回显信息&#xff0c;只会返回正常或者不正常的信息&#xff0c;这时候就可以用布尔盲注 布尔盲注原理是先将你查询结果的第一个字符转换为ascii码&#xff0c;再与后面的数字比较…

[EROOR] SpringMVC之500 回调函数报错

首先&#xff0c;检查一下idea里面的报错的原因&#xff0c;我的是jdk的版本的问题。所以更换一下就可以了。

操作系统:四大特征(并发,共享,虚拟,异步)

1.并发 1.并发的定义 并发:指两个或多个事件在同一时间间隔内发生。 这些事件宏观上是同时发生的&#xff0c;但微观上是交替发生的。 值得注意的是&#xff0c;与并行&#xff08;指两个或多个事件在同一时刻同时发生&#xff09;区分开来。 2.操作系统的并发性 指计算机…

【微信读书】数据内容接口逆向调试01

需求爬取微信读书的某一本书的整本书的内容 增强需求&#xff0c;大批量爬取一批书籍内容 众所周知微信读书是一个很好用的app&#xff0c;他上面书籍的格式很好&#xff0c;质量很高。 本人充值了会员但是看完做完笔记每次还得去翻很不方便&#xff0c;于是想把书籍内容弄下…

【Unity基础】3.脚本控制物体运动天空盒

【Unity基础】3.脚本控制物体运动&天空盒 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;搭建开发环境 &#xff08;1&#xff09;下载visual studio 在我们下载unity编译器的时候&…

十一)Stable Diffussion使用教程:人物三视图

现在我们通过一个个具体的案例,去进阶SD的使用。 本篇案例:绘制Q版人物三视图 1)我们先选择一个偏3D的模型,选择文生图,输入魔法; 2)然后选择触发三视图的Lora:<lora:charturnerbetaLora_charturnbetalora:0.6>,注意这里的名称都是本地重新命名的,非原来C站下…

PLC编码器测速(限幅滤波+中心差分法求导SCL源代码)

M法测速的基本原理,大家可以查看专栏的系列文章,这里不再赘述常用链接如下: PLC通过编码器反馈值计算速度的推荐做法(算法解析+ST代码)_编码器脉冲怎么转换为速度_RXXW_Dor的博客-CSDN博客PLC如何测量采集编码器的位置数据,不清楚的可以参看我的另一篇博文:三菱FX3U PLC…

十五、Webpack打包图片-js-Vue、Label命令、resolve模块解析

一、webpack打包图片 &#xff08;1&#xff09;加载图片案例准备 为了演示我们项目中可以加载图片&#xff0c;我们需要在项目中使用图片&#xff0c;比较常见的使用图片的方式是两种&#xff1a; img元素&#xff0c;设置src属性&#xff1b;其他元素&#xff08;比如div&…

如何做一个合格的微软技术工程师

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下如何做一个合格的微软技术工程师。 我认为要做一个合格的微软技术工程师&#xff0c;首先是要有兴趣从事这个职业。现在很多人是因为软件行业的薪资高才进入的&#xff0c;但我的看法…

并查集快速合并

对于一组数据&#xff0c;并查集主要支持两个动作&#xff1a; union(p,q) - 将 p 和 q 两个元素连接起来。 find(p) - 查询 p 元素在哪个集合中。 isConnected(p,q) - 查看 p 和 q 两个元素是否相连接在一起。 在上一小节中&#xff0c;我们用 id 数组的形式表示并查集&am…

基于SSM的宿舍管理系统【附源码文档】

基于SSM的宿舍管理系统【附源码文档】 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员、宿舍管理员、学生 管理员&#xff1a;院系信息、班级信…

7X24即时新闻监测

即时新闻----是我们最快获取新闻内容的重要途径。一般内容简短精悍&#xff0c;更新频率高&#xff0c;很多字少事大的新闻首先在即时新闻里体现。即便是为我们及时获取新闻资讯带来方便&#xff0c;但我们仍然不可能一直盯着即时新闻页面看吧。我们希望当有重要新闻事件时&…