【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计(原理图+源码+仿真工程+论文)

news2025/1/13 15:40:15

【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计(原理图+源码+仿真工程+论文)

文章目录

  • 【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计(原理图+源码+仿真工程+论文)
    • 资料下载链接
    • 任务书
    • 设计说明书
      • 摘要
      • 设计框架架构
      • 设计说明书及设计文件
      • 源码展示

资料下载链接

资料下载链接
资料链接:https://www.cirmall.com/circuit/29877/
包含此题目毕业设计全套资料:
原理图工程文件
源码工程文件
仿真工程文件
论文低重复率,26851字

任务书

人们对自身健康的关注促进了健康状态检测仪的发展,本课题设计一款具备心跳、体温、血压检测的多功能健康状态检测仪。
1.完成整个系统结构的设计,绘制系统框图;
2.选择主控芯片,及合适的传感器来分别完成心跳检测、温度检测、血压检测及相关电路设计;
3.完成主、子程序流程图设计;
4.运用Protues软件对健康状态检测仪进行系统仿真测试。

设计说明书

摘要

本次系统主要有硬件和软件两个部分组成。硬件部分由STC89C51单片机最小系统单元,温度检测电路单元,压力检测单元,体温检测单元,报警单元,人机交互单元,电源单元,液晶显示器单元组成,在设计上硬件需要考虑到系统的稳定性以及可靠性。软件部分通过对系统软件总流程图绘制,并绘制各个子控制驱动再对驱动程序编写完成系统程序的设计。在硬件与软件的设计上选择按照功能性分区设计,使设计有条理运行可靠。系统设计没有制作实物而是通过仿真方式调试完成。使用仿真软件Proteus来搭建系统硬件电路,调试测试。最后完成了血压检测,脉搏检测,体温检测并,并可以调节阈值实现对系统的报警自定义设置防止误报。

设计框架架构

在这里插入图片描述

设计说明书及设计文件

在这里插入图片描述

在这里插入图片描述

论文低重复率,26851字
在这里插入图片描述

源码展示

在这里插入图片描述

#include <reg52.h>
#include <intrins.h>
#include "adc0832.h"
#define uint		unsigned int
#define uchar		unsigned char
#define ulong		unsigned long  /* 宏定义 */
#define LCD_DATA	P0/* 定义P0口为LCD_DATA */
sbit	LCD_RS	= P2 ^ 5;
sbit	LCD_RW	= P2 ^ 6;
sbit	LCD_E	= P2 ^ 7;    /* 定义LCD控制引脚 */
sbit	Xintiao = P1 ^ 0;     /* 心率检测输入端定义 */
sbit	speaker = P2 ^ 4;     /* 蜂鸣器引脚定义 */
sbit	DQ	= P3 ^ 7;
uchar blood = 0;
voiddelay5ms(void);                                                          /* 误差 0us */
voidLCD_WriteData(ucharLCD_1602_DATA);                                      /********LCD1602数据写入***********/
voidLCD_WriteCom(ucharLCD_1602_COM);                                        /********LCD1602命令写入***********/
void lcd_1602_word( uchar Adress_Com, uchar Num_Adat, uchar *Adress_Data );     /*1602字符显示函数,变量依次为字符显示首地址,显示字符长度,所显示的字符*/
voidInitLcd();                                                                 /* 液晶初始化函数 */
void Tim_Init();
uchar	Xintiao_Change=0;  /*  */
uint	Xintiao_Jishu;
uchar	stop;
uchar	View_Data[3];
uchar	View_L[3];
uchar	View_H[3];
uchar	Xintiao_H	= 100;          /*上限 */
uchar	Xintiao_L	= 40;         /*下限 */
uint	wendu		= 0;
uchar	Key_Change;
uchar	Key_Value;                                                              /*按键键值 */
uchar	View_Con;                                                               /* 设置的位(0正常工作,1设置上限,2设置下限) */
uchar	View_Change;
uchar bloodL = 139;
uchar bloodH = 160;
uint tempL = 360;
uint tempH = 373;
/*****延时子程序*****/
void Delay_DS18B20( int num )
{
	while ( num-- )		;
}
/*****初始化DS18B20*****/
void Init_DS18B20( void )
{
	unsigned char x = 0;
	DQ = 1;                 /* DQ复位 */
	Delay_DS18B20( 8 );     /*稍做延时 */
	DQ = 0;                 /* 单片机将DQ拉低 */
	Delay_DS18B20( 80 );    /* 精确延时,大于480us */
	DQ = 1;                 /* 拉高总线 */
	Delay_DS18B20( 34 );
}
/*****读一个字节*****/
unsigned char ReadOneChar( void )
{
	unsigned char	i	= 0;
	unsigned char	dat	= 0;
	for ( i = 8; i > 0; i-- )
	{
		DQ	= 0;    /* 给脉冲信号 */
		dat	>>= 1;
		DQ	= 1;    /* 给脉冲信号 */
		if ( DQ )
			dat |= 0x80;
		Delay_DS18B20( 4 );
	}
	return(dat);
}
void WriteOneChar( unsigned char dat )
{
	unsigned char i = 0;
	for ( i = 8; i > 0; i-- )
	{
		DQ	= 0;
		DQ	= dat & 0x01;
		Delay_DS18B20( 5 );
		DQ	= 1;
		dat	>>= 1;
	}
}
/*****读取温度*****/
unsigned int ReadTemperature( void )
{
	unsigned char	a	= 0;
	unsigned char	b	= 0;
	unsigned int	t	= 0;
	float		tt	= 0;
	Init_DS18B20();
	WriteOneChar( 0xCC );           /* 跳过读序号列号的操作 */
	WriteOneChar( 0x44 );           /* 启动温度转换 */
	Init_DS18B20();
	WriteOneChar( 0xCC );           /* 跳过读序号列号的操作 */
	WriteOneChar( 0xBE );           /* 读取温度寄存器 */
	a	= ReadOneChar();        /* 读低8位 */
	b	= ReadOneChar();        /* 读高8位 */
	t	= b;
	t	<<= 8;
	t	= t | a;
	tt	= t * 0.0625;
	t	= tt * 10 + 0.5;        /* 放大10倍输出并四舍五入 */
	return(t);
}
void main()                                                     /* 主函数 */
{
	InitLcd();
	Tim_Init();
	lcd_1602_word( 0x80, 16, "Heart Rate:     " );          /* 初始化显示 */
	lcd_1602_word( 0xC0, 16, "Te:      BP:    " );          /* 显示第二行数据 */
	TR0	= 1;
	TR1	= 1;                                            /* 打开定时器 */
	while ( 1 )                                             /* 进入循环 */
	{	  
		if ( View_Con == 0 )
		{
			wendu = ReadTemperature();
			lcd_1602_word( 0xC0, 3, "Te:" );        /* 显示第二行数据 */
			if ( wendu != 0 && wendu !=850)
			{
				LCD_WriteCom( 0x80 + 0x40 + 3 );
				LCD_WriteData( wendu / 100 + 0x30 );
				LCD_WriteData( wendu % 100 / 10 + 0x30 );
				LCD_WriteData( '.' );
				LCD_WriteData( wendu % 100 % 10 + 0x30 );
				LCD_WriteData( 0xdf );
				if(wendu>350 && wendu<450) {
					if (wendu >= tempH || wendu < tempL ) /* 不在范围内报警 */
						speaker=0;                                                                            /* 蜂鸣器响 */
					else
						speaker = 1;
				}
			
			}
			lcd_1602_word( 0xC0 + 8, 4, " BP:" ); /* 显示第二行数据 */
			LCD_WriteCom( 0x80 + 0x40 + 12 );
			LCD_WriteData( blood / 100 + 0x30 );
			LCD_WriteData( blood % 100 / 10 + 0x30 );
			LCD_WriteData( blood % 100 % 10 + 0x30 );
			lcd_1602_word( 0xC0 + 15, 1, " " ); /* 显示第二行数据 */
			if (blood >= bloodH || blood < bloodL )       /* 不在范围内报警 */
				speaker=0;                          /* 蜂鸣器响 */
			else
				speaker = 1;
		}
		if ( Key_Change )            /*有按键按下并已经得出键值 */
		{
			Key_Change	= 0;          /* 将按键使能变量清零,等待下次按键按下 */
			View_Change	= 1;
			switch ( Key_Value )      /* 判断键值 */
			{
			case 1:                  /* 设置键按下 */
			{
				View_Con++;          /* 设置的位加 */
				if ( View_Con == 3 )    /* 都设置好后将此变量清零 */
					View_Con = 0;
				break;         /* 跳出,下同 */
			}
			case 2:               /* 加键按下 */
			{
				if ( View_Con == 2 )      /* 判断是设置上限 */
				{
					if ( Xintiao_H < 150 )  /*上限数值小于150 */
						Xintiao_H++;     /*上限+ */
				}
				if ( View_Con == 1 )    /* 如果是设置下限 */
				{
					if ( Xintiao_L < Xintiao_H - 1 )  /*下限值小于上限-1(下限值不能超过上限) */
						Xintiao_L++;     /*下限值加 */
				}
				break;
			}
			case 3:          /* 减键按下 */
			{
				if ( View_Con == 2 )      /* 设置上限 */
				{
					if ( Xintiao_H > Xintiao_L + 1 ) /*上限数据大于下限+1(同样上限值不能小于下限) */
						Xintiao_H--;                    /*上限数据减 */
				}
				if ( View_Con == 1 )                      /* 设置下限 */
				{
					if ( Xintiao_L > 30 )                   /*下限数据大于30时 */
						Xintiao_L--;                    /*下限数据减 */
				}
				break;
			}
			}
		}
		if ( View_Change )               /* 开始显示变量 */
		{
			View_Change = 0;          /* 变量清零 */
			if ( stop == 0 )            /* 心率正常时 */
			{
				if ( View_Data[0] == 0x30 ) /* 最高位为0时不显示 */
					View_Data[0] = ' ';
			}else   { /* 心率不正常(计数超过5000,也就是两次信号时间超过5s)不显示数据 */
				View_Data[0]	= ' ';
				View_Data[1]	= ' ';
				View_Data[2]	= ' ';
			}
			switch ( View_Con )
			{
			case 0:                         /* 正常显示 */
			{
				lcd_1602_word( 0x80, 16, "Heart Rate:     " );  /* 显示一行数据 */
				lcd_1602_word( 0x8d, 3, View_Data );     /* 第1行显示心率 */
				break;
			}
			case 1:                     /* 设置下限时显示 */
			{
				lcd_1602_word( 0x80, 16, "Heart Rate:     " );  /* 第一行显示心率 */
				lcd_1602_word( 0x8d, 3, View_Data );
				View_L[0]	= Xintiao_L / 100 + 0x30;       /* 将下限数据拆字 */
				View_L[1]	= Xintiao_L % 100 / 10 + 0x30;
				View_L[2]	= Xintiao_L % 10 + 0x30;
				if ( View_L[0] == 0x30 )         /* 最高位为0时,不显示 */
					View_L[0] = ' ';
				lcd_1602_word( 0xC0, 16, "Warning L : " );/* 第二行显示下限数据 */
				lcd_1602_word( 0xCd, 3, View_L );
				break;
			}
			case 2:  /* 设置上限时显示(同上) */
			{
				lcd_1602_word( 0x80, 16, "Heart Rate:     " );
				lcd_1602_word( 0x8d, 3, View_Data );
				View_H[0]	= Xintiao_H / 100 + 0x30;
				View_H[1]	= Xintiao_H % 100 / 10 + 0x30;
				View_H[2]	= Xintiao_H % 10 + 0x30;
				if ( View_H[0] == 0x30 )
					View_H[0] = ' ';
				lcd_1602_word( 0xC0, 16, "Warning H :     " );
				lcd_1602_word( 0xCd, 3, View_H );
				break;
			}
			}
		}
	}
}

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

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

相关文章

Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之五

问题点 7&#xff1a; 关于BLE HIDS data 写入到Android 节点"/dev/uhid"的flow&#xff1b; 关于BLE中的HIDS&#xff0c;首先我们需要理解好角色的定义&#xff1a; GATT Server 作为HID Service 提供者&#xff0c;对应HID Device角色&#xff1b; GATT Client…

maven大全(概述、安装配置、使用步骤)

一、概述 1.什么是maven&#xff1f; 答&#xff1a; 全称是Apache Maven。专门用于管理和构建项目的工具 2.maven有什么作用&#xff1f; &#xff08;1&#xff09;提供了一套标准化的项目结构 官方&#xff1a; 就是使用的idea&#xff0c;eclipse编译器的项目结构不统…

基于Matlab的高压直流输电系统仿真研究

目录 摘要 I Abstract II 第1章 绪论 1 1.1 高压直流输电系统 1 1.2 高压直流输电系统的历史 1 1.3 高压直流输电系统的特点 1 1.4 我国高压直流输电系统的现状 2 1.5 高压直流输电技术的发展前景 5 第2章 高压直流输电控制基本原理 6 2.1 高压直流输电控制系统分层结构 6 2.2 …

领夹直播麦克风常规的使用方法及方案说明

麦克风多对我们来说并不陌生&#xff0c;但领夹式麦克风我们日常可能会用的比较少&#xff0c;像做自媒体、采访等会用到的比较多&#xff0c;它能收到人说话的声音&#xff0c;避开外界嘈杂的声音。接下来我们一起来了解一下领夹式麦克风的相关知识吧&#xff01; 一、领夹式麦…

Win11系统启动文件夹是空的怎么解决?

Win11系统启动文件夹是空的怎么解决&#xff1f;有用户发现自己系统的启动文件夹里面没有任何的文件&#xff0c;这样可能会导致我们的电脑出现问题&#xff0c;导致无法正常的启动桌面程序。那么如何去解决这个问题&#xff0c;一起看看具体的解决方法分享吧。 解决方法&#…

从I/O的视角看DPU

计算的流动性 随手翻开一个公有云&#xff0c;都会发现有不同的计算实例&#xff0c;搭配不同的CPU、内存、网络和存储来应对不同业务的需求. 当云原生和大量的新技术出现后&#xff0c;作为公有云考虑的最重要的一件事情就是提供这些丰富服务的成本: 青云、Ucloud也都在A股上…

[Redis] Spring Boot 使用Redis---RedisTemplate泛型约束乱码问题

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

牛客网-《刷C语言百题》第五期

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;《C语言入门必刷百题》 &#x…

计算机毕业设计ssm+vue+elementUI高校志愿者服务招募网站

项目介绍 随着我国教育制度的改革和社会的进步&#xff0c;越来越多的人希望加入志愿者这个行列从而贡献自己的一份爱。加入志愿者不仅能够更好的锻炼自己&#xff0c;也可以帮助那些需要帮助的人&#xff0c;从而让社会变的更加温暖和美好&#xff0c;尤其是对比较发达的地区…

基于matlab创建基于物理统计的雷达模型(附源码)

目录 一、前言 二、、定义场景 三、定义用于检测生成的雷达 四、生成统计雷达检测 五、定义用于 IQ 信号生成和处理的雷达 六、IQ 信号和处理仿真 七、总结 八、程序 一、前言 此示例演示如何以编程方式从统计雷达模型创建基于物理的雷达模型。 雷达是一种感知系统&…

Zookeeper的功能简介

1.ZooKeeper是什么&#xff1f; ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff…

超神之路 数据结构 2 —— Queue队列实现和循环队列和普通队列的性能比较

接上一篇继续往下挖&#xff0c;在上一篇&#xff0c;我们实现了一个属于自己的动态数组。利用这个动态数组&#xff0c;我们来实现一个基于动态数组&#xff0c;一个属于自己的普通队列Queue。 Queue 是一种它许我们从表的一段进行删除&#xff0c;表的另一端进行插入的线性表…

Docker—苹果Mac安装Docker的两种方式

文章目录Docker简介方式一&#xff1a;官网dmg安装方式二&#xff1a;homebrew安装前置条件brew安装docker关注微信公众号&#xff1a;CodingTechWork&#xff0c;一起学习进步。Docker简介 &emsp docker就是集镜像、容器和仓库三个概念于一身的集装箱&#xff0c;应用于…

GPO:组策略与系统配置

1、所有的服务器不需要按ctrl+alt+del交互式登录; 2、关闭所有机器的睡眠功能 3、所有计算机都不允许登录Microsoft账户; 4、允许IT组进行系统时间修改 5、设定所有职务为managers的用户为本地管理员,除了域控制器 GPO:组策略与系统配置 所有的服务器不需要按ctrl+alt+del;…

基于ELK搭建的本地社工库

简介 ELK原本是一个开源实时日志分析平台。 ELK是三个开源软件的缩写&#xff0c;分别为&#xff1a;Elasticsearch 、 Logstash以及Kibana 。目前又新增了一个Beats&#xff0c;是一个轻量级的日志收集处理工具&#xff0c;Beats占用资源少&#xff0c;适合于在各个服务器上…

Greenplum GPKafka【实践 01】使用GPKafka实现Kafka数据导入Greenplum数据库踩坑问题记录(不断更新ing)

1.说明 Kafka 是分布式消息订阅系统&#xff0c;有非常好的横向扩展性&#xff0c;可实时存储海量数据&#xff0c;是很常用的流数据处理中间件。物联网设备采集的数据很多时候就是通过 Kafka 进行处理的。当 Kafka 数据要入库分布式数据库 Greenplum 时&#xff0c;我们就需要…

二、IAR新建一个工程

之前录制了无线传感网综合项目实战课程&#xff0c;这个课程非常适合应届毕业生和想转行Linux的朋友&#xff0c;用来增加项目经验。 其中一部分内容是关于CC2530zigbee的知识&#xff0c;后面会更新几篇关于cc2530的文章&#xff0c;敬请关注&#xff01; 下面是该系列文章链…

gcc 好玩的 builtin 函数

gcc 好玩的 builtin 函数 前言 在本篇文章当中主要想给大家介绍一些在 gcc 编译器当中给我们提供的一些好玩的内嵌函数 (builtin function)&#x1f923;&#x1f923;&#x1f923; 。 __builtin_frame_address 使用内嵌函数实现 __builtin_frame_address(x) // 其中 x 一…

【GPU】Nvidia CUDA 编程高级教程——利用蒙特卡罗法求解近似值(MPI方法)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

无线蓝牙运动耳机推荐,目前实用性不错的运动耳机推荐

对于运动人士来说&#xff0c;运动耳机是日常出门标配&#xff0c;一款实用性好的运动耳机能给我们带来很大的动力&#xff0c;在运动时戴着听音乐&#xff0c;能够释放压力的同时让运动过程变得更加心情愉快。但是运动耳机实在是太多了&#xff0c;琳琅满目&#xff0c;各种各…