职场文秘网

首页 > 心得体会 > 工作体会 / 正文

毕业设计报告--便携式人体健康监测系统设计

2020-03-09 19:40:25

  

 本科生毕业设计报告

 便携式人体健康监测系统设计

 姓

 名:**

 专

 业:自动化

 指导教师:***讲师

 2017年05月

 论文题目:便携式人体健康监测系统设计

 学科专业:自动化

 申请人:**

 指导教师:***讲师

 摘

 要

 随着现代人生活节奏的加快以及生活质量的提高,社会经济和工业的发展,人们潜在的病发症状也越来越多。所以人们对自身的健康状况越来越关注,希望能随时随地的进行了解,以至于出现问题时能及时去医院就医。但是人们不希望把时间都浪费在医院里。因此,一些体积小的便携式健康检测装置成为了人们的首选,比如:体温表、电子血压计等。但是,这些装置功能单一,如果想对多种健康指标进行检测,那就给人们带来了一些不必要的麻烦。因此本设计对多种人体信号进行检测,减少使用者的麻烦。

 该系统以51系列单片机作为主控制核心,由单片机最小系统、体温模块、血压模块、脉搏模块、显示模块、报警模块等组成。能实现体温测量、血压测量和脉搏测量等功能,在检测值超出限定值时报警提示。

 最后搭建便携式人体健康监测系统实验平台,在此平台之上进行了实验。并对所开发的便携式人体健康监测系统进行了性能测试。经过实验结果表明,该系统可以实现对人体健康参数体温、血压、脉搏的测量,能及时的向人们反映自身的健康状况。同时,在人们的健康参数出现非正常状态时还能及时的起到警示作用,让人们能及时去医院就诊。

 关 键 词:体温测量;血压测量;脉搏测量;单片机AT89C52

 论文类型:工程设计

 Title: Design of Detecting System Based on Portable Health Indicators

 Speciality: Automation

  Applicant: Wei Ma

  Supervisor: Lecturer. Xiaojuan Wei

  ABSTRACT

 With the accelerated pace of modern life and the improvement of quality of life, socio-economic and industrial development, People are also more likely to suffer from symptoms. So people are increasingly concerned about their own health status, hoping to understand anytime, anywhere, so that when have problems can be timely to the hospital for medical treatment. But people do not want to waste time in the hospital. So some small size of the portable health detection device has become the first choice, such as: thermometer, electronic sphygmomanometer and so on. However, these devices function single, if you want to test a variety of health indicators, it gives people some unnecessary trouble. So the design of a variety of human body signal detection, reduce the user's trouble.

 This system uses 51 series microcontroller as the main control core by microcomputer system, Consists of temperature module, blood pressure module, pulse module, display module, alarm module. To achieve the measurement of body temperature, blood pressure measurement and the pulse measurement function, the detection value exceeds the limit alarm.

 After building the portable human health monitoring system experimental platform. Experiments were carried out on this platform. And do a test for human health monitoring system. Experiments show that the system can achieve the measurement of body temperature, blood pressure and pulse of human health parameters, and can reflect the health status of people in time. At the same time, When people's health parameters appear abnormal state, they can also play a warning role in time, so that people can go to the hospital in time. Let people go to the hospital in time.

 KEY WORDS: Temperature measurement ; Blood pressure measurement ; Pulse measurement ; Single chip AT89C52

 TYPE OF THESIS: Engineering Design

  目

 录

 1 绪论 1

 1.1 研究目的和意义 1

 1.2 国内外研究现状 1

 1.2.1 国外研究现状 1

 1.2.2 国内研究现状 2

 1.3 本课题的主要研究内容 3

 1.4 论文的内容安排 3

 2 便携式人体健康监测系统总体设计 5

 2.1 系统主要功能 5

 2.2 系统各个模块方案确定 5

 2.2.1 体温检测模块方案确定 5

 2.2.2 血压检测模块方案确定 6

 2.2.3 脉搏检测模块方案确定 6

 2.2.4 显示方案确定 6

 2.2.5 按键方案确定 7

 2.2.6 报警方案确定 7

 2.3 系统总体设计 7

 3 便携式人体健康监测系统硬件设计 8

 3.1 单片机最小系统 8

 3.2 体温测量模块设计 9

 3.3 血压测量模块设计 9

 3.4 脉搏测量模块设计 10

 3.4.1 光电传感器工作原理 10

 3.4.2 脉搏信号采集电路 10

 3.4.3 脉搏信号处理电路信号 11

 3.5 显示电路设计 12

 3.6 按键电路设计 13

 3.7 报警电路设计 13

 4 便携式人体健康监测系统软件设计 15

 4.1 系统主程序设计 15

 4.2 系统子程序设计 16

 4.2.1 体温测量子程序设计 16

 4.2.2 血压测量子程序设计 16

 4.2.3 脉搏测量子程序设计 17

 4.2.4 按键模块子程序设计 18

 5 便携式健康监测系统调试与问题 19

 5.1 系统调试方案 19

 5.1.1 体温模块调试 19

 5.1.2 血压模块调试 19

 5.1.3 脉搏模块调试 20

 5.2 系统调试中遇到的问题及解决方法 21

 6 便携式人体健康监测系统测试结果分析 22

 6.1 测试方案 22

 6.2 测试数据 22

 6.2.1 体温测量数据记录及分析 22

 6.2.2 血压测量数据记录及分析 22

 6.2.3 脉搏测量数据记录及分析 23

 6.2.4 数据测试误差率记录分析 23

 6.3 结果分析 24

 7 结论与展望 25

 7.1 总结 25

 7.2 展望 25

 参考文献 26

 附

 录 27

 致

 谢 41

 章的MathType的章标记(打印前将其字体颜色变为白色,在打印预览中看不见即

 1

  绪论

 1.1 研究目的和意义

 近些年来由于社会经济和工业发展以及国际贸易之间的来往,虽然经济发展越来越快,但是带来的问题也越来越多,各种病毒和病发症状也越来越频繁。这也让人们对自己的健康情况开始重视,为了更方便的帮助人们了解自己的健康情况,能让人们在出现身体健康问题时及时的得到相应的治疗。本设计就提出便携式身体健康监测系统,用于个人自主的随时随地可以了解自己的健康状况,以防治各种病毒扩散。同时该设计还以实用性、经济性、可靠性与方便携带性为设计目标,期望能达到大众化需求的商业目标。

 一般而言,生命机能常以体温、血压、脉搏等为主,这些生命机能显示着我们个体的正常生命状态,一旦这些生命机能出现非正常状态时,通常也代表人体的健康出现了一些异状,就需要进行进一步的检查。一般来言,大多数的病毒都会带来一个明显的身体机能变化状态,那就是发烧,体温上升,脉搏紊乱,血压不稳等等。拿 2003年SARS扩大传染期间来说,发烧就为病毒传染的主要症状,以公共卫生病理学来说,体温对于控制病毒传染极为重要。本设计系统将针对体温、血压、脉搏进行检测,当生理机能有一定程度超出正常状况时提出适当警示,让使用者更了解自身生理健康状况,也能给医生提供诊断时的初步依据。

 人体主要生理信号一般有:脉搏、呼吸、血压、体温等。人体的这些生理信号一旦出现问题也代表人的身体状况出现了问题。测量人体生理信号技术就是要应用现代科学技术研究各种人体生理信号,通过有创或无创的方法获得各种信息,加以分析、综合和研究,服务于临床[1]。人体的不同生理信号代表这不同部位的健康状况,这些生理信号在医学中起着很重要的诊断作用。将生理参数检护从大型医院扩展到社区医院以及患者家中是很有意义的。人体生理信息种类繁多,脉搏信号(Pulse wave)能反映人体心脏器官和血液循环系统的生理变化,在临床健康观察和疾病诊断中十分重要,并且从生命信息科学的角度也具有重要的研究价值。所以设计一个便携式的人体健康监测系统能有效的帮助人们了解自己的健康状况也能在医生的诊断中起到很大的帮助。因此本文设计的目标是具有便携式特点的人体生理信号监测系统。

 1.2 国内外研究现状

 1.2.1 国外研究现状

 在国外,一种以传感器网络构成的人体生理信号监测仪器得到了迅速的发展。这种传感器网络散布于一种人体可穿戴的表面看起来很普通的衣服。当人们穿着这种特

 制衣服的时候,他们的人体生理信号通过无线的方式传输到PC系统中,PC系统可以对人体的状态进行无间断的记录。当人体出现异常状况的时候,PC系统会发出报警信号。如果需要远程监控,可以将监测到的信号,通过局域网传输到Internet上。但是这种传感器网络构成的人体生理信号监测仪器并没有在医疗领域得到广泛的应用。所以数字健康革命仍然停滞不前,虽然科技巨头纷纷涉足该领域,诸如Apple Health、Google Fit的产品接连诞生,但在真正的医疗用途上依然没什么进展。Fitbit、Jawbone等可穿戴设备可以测量用户的步数和心率,但不能进行深入诊断诸如生物标记(可作为严重疾病的早期预警)的东西。目前,那些想要准确排查疾病或者检查身体状况的人还是需要到医院去,所以能用到医学上的数字设备仍然还处于发展阶段,我们只能开发出基础的生理信号检测设备以更好的帮助医生起到初步诊断的作用[2-3]。如图1-1健康监测服装图所示。

 图2-1 健康监测服装图

 1.2.2 国内研究现状

 目前中国在便携式人体健康检测仪器方面也有一定的研究,为了能更方便的检测到人体的健康状况,各科研公司也开发出了相应的仪器。比如:小米手环、中医经络检测仪、腕式血压电子仪等。但是国内数字健康的科研、生产与国际先进水平相比还存在一定的差距,我们虽然在医疗建设方面做出了很多努力,但是大多数高、精、尖的监护设备依旧依赖于国外进口,而且价格比较昂贵,普通家庭根本无力购买,严重影响了数字健康仪器在我国的应用和推广。

 最近几年由于中国老龄化步伐的加快,各种以传感器网络构成的便携式健康检测仪器出现,人们希望能实现个人“个人—社区—医院”一线式健康服务。但是由于这种健康便携式的检测仪器发展的并不理想,所以这种传感器网络构成的人体生理信号监测仪器并没有在医疗领域得到广泛的应用,也不能被大多数人认可。如图1-2智能电子血压计图所示。

 图12 智能电子血压计图

 1.3 本课题的主要研究内容

 近些年来随着中国老龄化的速度加快,用在医疗方面的费用也是居高不下,出现在医疗方面的问题也越来越多。本文所设计的这套检测系统,可以同步采集人体的体温信号、血压信号和脉搏信号,并通过液晶显示器显示出数据信息。主要内容为以下几个部分:

 (1)如何进行人体健康参数的信息采集;想要了解人体的健康参数,那么就要首先想办法检测到人体的这些参数。

 (2)如何对采集的信号进行封存和处理;检测到了这些健康参数,接下来的就是要对这些数据进行分析和处理。

 (3)如何在参数超过健康范围时进行报警提示;该设计不只是为了检测这些数据,主要的目的是能及时为人体做到提示作用,让人们能更好的了解自己的健康状况。所以超限报警也是一个主要的问题。

 1.4 论文的内容安排

 第一章,绪论 主要研究了课题的背景和意义,便携式人体健康监测系统国内外研究现状以及发展现状等。

 第二章,便携式人体健康监测系统总体方案设计,对各个模块方案进行比较,分别对各种方案的优势和劣势进行分析之后,然后进行便携式人体健康监测系统平台的总体结构和方案设计。

 第三章,便携式人体健康监测系统硬件设计。通过传感器选型、信号采集模块、信号调理模块的设计,搭建便携式人体健康监测硬件平台。

 第四章,便携式人体健康监测系统软件设计。通过对各个模块的软件程序编写,系统能实现体温检测、血压检测和脉搏检测等功能。

 第五章,便携式人体健康监测系统调试与问题。搭建好平台并进行焊接后,对各个模块进行检查,查看是否有漏焊和虚焊的情况存在,通电后能不能正常工作。

 第六章,便携式人体健康监测系统测试结果分析。在系统没有问题的情况下进行通电测试,收集测试数据进行分析处理,验证控制系统的准确性。

 第七章,结论与展望 对本文的主要研究工作和结论进行了总结,并就所发现的问题提出进一步的改进方法。论文整体如图1-3论文结构图所示。

 图13 论文结构图

 2

  便携式人体健康监测系统总体设计

 2.1 系统主要功能

 本设计主要用来检测人的体温、血压和脉搏参数,然后通过液晶显示出来。体温检测采用温度传感器DS18B20进行检测,血压检测采用电容式压力传感器SENSOR101进行检测,脉搏检测采用光电传感器ST188进行检测,显示模块用数码管或者是集成的液晶进行显示。整体的控制和数据处理用51系列的单片机。本系统的功能主要包括测量体温、测量血压、测量脉搏、数据显示、按键控制等。

 (1) 测量体温除了测量人体的正常体温外还可以进行温度上下限的设定,超出限定范围时报警提示。

 (2) 测量血压除了测出人体的舒张血压和收缩血压外,还可以设定血压的上下限,在出现超出范围的时候能报警提示。

 (3) 测量脉搏主要实现对人体脉搏的测量。

 (4) 数据显示能实时的将测量出来的各数据显示出来。

 (5) 按键控制主要用来控制系统的上电、复位以及对上下限的调节。

 2.2 系统各个模块方案确定

 2.2.1 体温检测模块方案确定

 方案一:利用水银的热胀冷缩原理,制作简易的测温工具,对体温进行检测。

 方案二:采用数字的温度传感器DS18B20进行体温测量。

 方案确定:方案一主要是利用水银的热胀冷缩原理来对人体的体温进行测量,不需要模数的转换就能直接的测量到人体的体温,但是要把数据传输到单片机相对的比较麻烦,而方案二是利用集成的数字温度传感器,便于携带,而且在数据传输时更加的方便。

 体温模块采用体温传感器DS18B20来测量人体的体温。在该设计中,人体的体温是非电量的模拟信号,这里采用DS18B20传感器,可以将人体模拟的体温信号进行处理,然后转化为数字信号来和单片机进行交换。DS18B20数字温度传感器只有一根信号线和单片机进行数据交换处理。读 、写和完成温度变换所需的电源可以由数据线本身提供,而不需要外部电源。首先向传感器发出ROM指令,然后发送温度转换指令,最后向温度传感器发送读温度指令。当检测到温度的二进制值时,还需要将二进制的温度信息转化为ASCII码值,进行显示。

 2.2.2 血压检测模块方案确定

 方案一:采用水银台式血压计,采集人体的血压,再通过模数转换进行和单片机的数据传输。

 方案二:采用电容式的压力传感器SENSOR101,采集人体的血压信号,直接和单片机进行数据传输。

 方案确定:方案一虽然也可以测量出人体的血压,但是在和单片机进行数据传输显示时还需要进行模数转换,而且相对的价格昂贵不方便携带。而方案二电容式压力传感器中自带模数转换,不需要进行模数转换,价格便宜而且小巧轻便。

 血压测量目前主要是采用一些血压测量仪器进行测量,本设计中采用电容式压力传感器SENSOR101。传感器将袖带采集的人体血压信号转换为电信号,再传输给单片机进行处理。电容式压力传感器主要是由四个或非门组成。该传感器不需要进行模数转换,主要是将人体血压的频率值和基准压力频率作比,然后转化为电信号进行输出,从而得到人体的血压值。

 2.2.3 脉搏检测模块方案确定

 方案一:采用压电陶瓷式压力传感器对人体的脉搏进行测量,通过单片机的中断技术记录脉搏的次数。

 方案二:采用光电传感器ST188对人体脉搏信号进行检测采集,将采集到的信号经过芯片LM324后放大,然后传输到单片机利用中断进行脉搏次数的累计。

 方案确定:虽然方案一和方案儿都能够实现对人体脉搏的测量,但是由于人体的脉搏信号相对微弱,而且还存在着外界的干扰。所以本设计采用方案二,因为光电传感器先对于其他的传感器对于外界的抗干扰能力更强,测出来的脉搏也更加的准确。

 近几年来测脉搏的方法有不少,主要有压电式、光电式、液体耦合式、压阻式等。在该设计中主要采用光电式传感器进行测量,因为光电传感器简单易用而且还有较强的抗干扰能力。用光电传感器测量脉搏主要是利用血液对光的透射原理,光电传感器主要由发光二极管和光敏二极管组成。当手指的血液同过发光二极管的透射衰弱,再由光敏二极管接收,这样就可以反映出脉搏的周期性变化,但是由于测到的脉搏信号很微弱,而且在测量过程中还可能存在着外界的干扰,所以要对它进行线性放大和滤波。

 2.2.4 显示方案确定

 方案一:采用八段数码管,和单片机连接进行显示功能。

 方案二:采用集成的液晶显示和单片机连接进行显示功能。

 方案确定:方案一中八段数码管价格便宜,只需要简单的驱动芯片,但是显示的信息量少。方案二中液晶模块虽然价格稍贵需要占用的I/O口较多,但是显示的信息量多,能同时显示体温、血压、脉搏值,所以本设计采用方案二。

 2.2.5 按键方案确定

 方案一:采用独立式按键,与单片机的I/O口连接进行指令的发送。

 方案二:采用4x4矩阵式键盘,与单片机I/O连接进行指令的发送。

 方案确定:方案一中按键的特点是每个按键都会占用一个I/O口,每个按键之间都互不影响,而且全部采用端口的直接扫描方式,控制相对简单,编程容易。但是占用的I/O口会增多。方案二中采用行列式的扫描方式,对I/O口的占用较少。考虑到本设计中所需的按键少,所以本设计采用方案一。

 2.2.6 报警方案确定

 方案一:采用语音提示的报警电路,当检测值超限时进行语音报警。

 方案二:采用声光报警电路,当检测值超限时用蜂鸣器和发光二极管警醒报警。

 方案确定:方案一相对的更加适用于该设计系统,但是考虑到语音报警电路价格高,而且设计相对困难,所以本设计采用方案二。

 2.3 系统总体设计

 本系统以51系列单片机为主要控制核心,以体温模块、脉搏模块、血压模块、液晶显示模块、报警电路、键盘电路为主要的模块单元。

 本系统设定三种工作方式:脉搏检测,体温检测,血压检测。本设计中采用DS18B20数字温度传感器进行温度测量,测得的数据如果超过限定值则报警。脉搏测量采用光电传感器,将采集到的脉搏信号转换成单片机可以接受的电信号。脉搏每跳动一次就产生一个脉冲,让单片机产生一个中断,每中断一次就进行一次计数,每分钟进行一次采样进行统计脉搏数。血压利用电容式传感器SENSOR101进行测量,如果血压超限则报警。

 该方案可以有效的测量体温、血压、脉搏这些参数,能够达到系统设计的各项指标,设计方案是切实可行的。如下图2-1系统总方案框图所示。

 图2 -1 系统总体方案框图

 3

  便携式人体健康监测系统硬件设计

 3.1 单片机最小系统

 单片机最小系统主要包括AT89C52单片机,晶振电路,复位电路,电源电路。AT89C52单片机是核心部分,主要负责数据的运算,D/A或A/D的转换,寄存器的数据存储和交换等。复位电路起到复位重启的作用,当单片机运行出现问题时,按复位键可以使单片机重新运行工作。晶振电路为单片机提供运行时的时钟频率,频率越高单片机运行速度越快,所以晶振电路的作用非常重要[4-7]。如图3-1单片机最小系统图所示。

 图31 单片机最小系统图

 电源电路主要提供上电的作用,由一个电源插口和一个自锁开关组成。插口提供+5V电源,正端给单片机和所需的部分供电,两个接地端接地。

 自锁开关的识别方法:在按键的下方有一个小孔,以这样的排列为基准,小孔在1、4脚的中间。1、2和4、5是常开触点,2、3和5、6是常闭触点。开关按下1、2和4、5导通,2、3和5、6断开;开关弹起1、2和4、5断开,2、3和5、6导通。在电路中我们随意接一组就可以实现电路的控制。如图3-2电源电路接线图所示。

 图32 电源电路接线图

  3.2 体温测量模块设计

 体温模块主要是对人体的体温进行测量,测量的是非电量的模拟信号。数字温度传感器DS18B20能进行温度的采集,并且内部进行了模数转换,不需要外部进行处理,所以测量的温度可以直接传输到单片机。

 DSl8B20中有两个8位RAM存贮器,用于贮存温度值,编号为0号和 1号。1号存贮器存放温度值,如果温度为负,则1号存贮器 8位全为1,否则全为0。0号存贮器用于存放温度值的补码最低位。 将存贮器中的二进制数求补码再转换成十进制数并除以2就得到被测温度值(-550℃—125℃ )。测量的温度经过单线接口送入DSl8B20或从DSl8B20送出。

 DSl8B20数字温度计提供9位(二进制)温度读数。因此从主机CPU到DSl8B20仅需一条线(和地线)。每只DS18B20都可以设置成两种供电方式,即数据总线供电方式和外部供电方式。 采取数据总线供电方式可以节省一根导线,但完成温度测量的时间较长;采取外部供电方式需要多用一根导线,但测量速度较快[8-10]。如图3-3温度采集电路图所示。

 图33 温度采集电路图

 3.3 血压测量模块设计

 血压测量模块用来测量人体的血压值,系统采用电容式压力传感SENSOR101对人体血压进行测量,该压力传感器能检测到人体血压压力,然后将压力所对应的频率经过转换从而得到人体的血压值。

 SENSOR101是利用压力的比值从而进行测量的,用外部连接的袖带将人体的血压值进行采集,然后将血压的压力值传输给压力传感器SENSOR101。在SENSOR101内部有一个内部真空参比值(基准值),当检测到外部压力时,将基准值和该值作比,因此可直接输出一个与绝对压成比例的电信号。然后压力传感器将这一信号输送到单片机进行处理。

 SENSOR101共有8个外围引脚,其中5个为空脚。可用于测量绝对压、差力压和表力压,范围从1PSI到100PSI,工作电压为正5伏。由+VCC脚引入正5伏电压,DATA为数据输出脚,将所测量得到的数字电压信号传送到单片机的P3.4脚,SENSOR101的地脚为GND脚,接地。因此,只需要将传感器的输出脚DATA连接到单片机的P3.4脚上即可[11-12]。如图3-4血压采集电路图所示。

 图34 血压采集电路图

 3.4 脉搏测量模块设计

 3.4.1 光电传感器工作原理

 脉搏测量模块用来对人体的脉搏进行检测,该系统采用光电传感器ST188对人体的脉搏进行测量,它能将采集到的脉搏信号经过放大和比较后传输到单片机,然后单片机通过中断的方式进行计数,从而实现对人体脉搏次数的测量。

  ST188光电传感器由发光二级管和光敏二极管组成,其工作原理是:发光二极管发出的光透射过手指,经过手指组织的血液吸收和衰减,由光敏二极管接收。由于手指动脉血在血液循环过程中呈周期性的脉动变化,所以它对光的吸收和衰减也是周期性脉动的,于是光敏二极管输出信号的变化也就反映了动脉血的脉动变化[13]。

 3.4.2 脉搏信号采集电路

 脉搏信号的采集如图3-5脉搏信号的采集电路图所示。当手指放在光电传感器上时,会有两种情况:一是无脉搏。虽然手指遮挡了红外发射二极管发射的红外光,但是由于红外接收三极管中存在暗电流,会造成输出电压略低。二是有脉搏。当有跳动的脉搏时,血脉使手指透光性变差,红外接收三极管中的暗电流减小,输出电压上升。但该传感器输出信号的频率很低,因此采集的信号先经C4、R11滤除高频干扰,再由耦合电容C5、C6加到线性放大芯片LM324输入端。

 图35 脉搏信号采集电路图

 3.4.3 脉搏信号处理电路信号

 (1) 信号放大电路设计

 按人体脉搏在运动后跳动次数达200次/分钟的计算来设计低通放大器。R23、C6组成低通滤波器以进一步滤除残留的干扰,截止频率由R23、C6决定,运放U3将信号放大,放大倍数由R23和R27的比值决定[14-15]。如图3-6信号放大电路图所示。

 图36 信号放大电路图

 根据一阶有源滤波电路的传递函数,可得式(3-1)、(3-2)、(3-3)如下所示:

 (3-1)

 放大倍数为:

 (3-2)

 截止频率为:

 (3-3)

 按人体的脉搏跳动为200次/分钟时的频率是3.3 Hz考虑,低频特性是令人满意的。

 (2) 信号比较电路设计

 U2C是一个电压比较器,C11、R29构成一个微分器,U2A和C7、R32组成单稳态多谐振荡器,其脉宽由C7、R32决定。当有输入信号时,U2A在比较器输入信号的每个后沿到来时输出高电平,使C7通过R32充电。大约持续20ms之后,因C7充电电流减小而使U2A同相输入端的电位降低到低于反相输入端的电位(尖脉冲已过去很久)。于是U2A改变状态并再次输出低电平。脉冲是与脉搏同步的,并由红色发光二极管DS3的闪亮指示出来。即发光二极管作脉搏测量状态显示,脉搏每跳动一次发光二极管就亮一次。同时,该脉冲电平通过R24送到单片机INTO脚,进行对心率的计算和显示[16-17]。如图3-7信号比较电路图所示。

  图37 信号比较电路图

 3.5 显示电路设计

 显示电路是用来显示系统的状态,命令或采集的电压数据。本系统显示电路采用的是16×2的字符型LCD液晶模块SMC1602A。

 SMC1602A点阵图形式液晶由M行×N列个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1个字节的8个位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元和显示RAM区1024个字节相对应,每一字节的内容和屏上相应位置的亮暗对应。一个字符由6×8或8×8点阵组成,即要找到和屏上某几个位置对应的显示RAM区的8个字节,并且要使每个字节的不同的位为1,其它的为0,为1的点亮,为0的点暗,这样一来就组成某个字符。

 该液晶以HD44780为主控制器,是一个功能较强的指令集,能显示字符的移动,闪烁等功能,与单片机通讯可采用8位或4位并行传输两种方式本设计中管脚连接方式为D0-D7分别与单片机P1.0-P1.7连接[18]。如图3-8显示电路接线图所示。

 图38 显示电路接线图

 3.6 按键电路设计

 键盘是实现人机对话的设备,利用键盘可以对系统进行参数设定,发出指令等。按键电路主要有两种,一种是独立的按键方式,另一种是4×4的矩阵式键盘。本系统中因为只用到3个按键所以采用独立式的按键电路。

 独立按键采用的是端口的直接扫描方式,按键只起到简单的通断状态(0或1),扫描和识别由用户的按键程序实现。

 其中S1键是体温上限调节键,S2键为体温下限调节键,S3为上下限选择键。因键盘数目很少,所以采用按键与单片机的I/O口直接连线的方法连接。如图3-9按键电路接线图所示。

 图39 按键电路接线图

 3.7 报警电路设计

 报警电路主要起到提醒作用,如果测量的数值超出限定范围就报警,如果在限定范围内则不会报警。

 报警电路由二极管与电阻相连再加一个蜂鸣器,如果报警则二极管发光蜂鸣器发出蜂鸣声,蜂鸣器的报警主要由三极管控制,该三极管为PNP型,正常工作时电压差为Ue>Ub>Uc,当单片机给出一个低电平时三极管导通,存在电压差,蜂鸣器报警,当单片机给出高电平时,不存在电位差,三极管截至,蜂鸣器不报警。其中报警的时限可以编写程序进行控制,本设计中报警电路与单片机P1.4管脚相连[19-20]。如图3-10报警电路接线图所示。

  图320 报警电路接线图

 4

  便携式人体健康监测系统软件设计

 4.1 系统主程序设计

 主程序设计如图4-1主程序流程图所示,首先对系统和各个模块进行初始化,然后对键盘进行读取,如果有键按下,则进入相对应的模块进行处理。如果按下复位按键,那么对系统进行复位并重新进行初始化,如果没有复位按键按下,看看模块调整按键是否按下,如果按下就进入相应的模块进行参数上下限的调整,要是没有就继续执行,进行体温、血压、脉搏的测量然后显示,结果显示后就结束测量。

 图41主程序流程图

 4.2 系统子程序设计

 4.2.1 体温测量子程序设计

 体温检测子程序设计如图4-2体温检测流程图所示,由于单片机与DS18B20采用单总线模式,所以编程时严格按照DS18B20的读写时序。首先对DS18B20进行初始化,先发出ROM指令,再发出RAM指令,再发体温转化指令,单片机这时读取体温值,如果超限进行报警提醒,如果没有超限则将体温值显示出来。

 图42 体温检测流程图

 4.2.2 血压测量子程序设计

 血压检测子程序设计如图4-3血压检测流程图所示,首先对血压传感器进行初始化,然后电路工作给袖带打气,对人体的血压进行采集。采集到的血压值传输到传感器和基准值进行比较得出人体的血压值,再传送给单片机经过液晶显示出具体的数值。

 图43 血压检测流程图

 4.2.3 脉搏测量子程序设计

 脉搏子程序设计如图4-4检测流程图所示,检测脉搏采用中断完成,每次中断对脉搏数进行加1,完成对脉搏数的计数。脉搏检测子程序,利用单片机中的两个定时计数器进行1分钟延时,检查脉搏数为多少,如果超限则报警,提醒使用者注意脉搏数。没有超限的话,通过单片机内部的处理程序将脉搏数转换成BCD码,再通过液晶显示模块进行脉搏数的显示,并将脉搏数清0。

 图44 脉搏检测流程图

  4.2.4 按键模块子程序设计

 按键电路子程序设计如图4-5按键电路流程图所示:本系统采用按键组成的独立键盘。键盘程序的编写有查询方式和中断方式两种。采用查询方式时单片机一直在查询有没有键被按下,不能做其他的事情,如果单片机采用这种方法工作效率会很低。为提高单片机的工作效率,本系统采用外部中断的方式(扩展的外部中断)查询按键是否被按下。

 图 45 按键电路流程图

  5

  便携式健康监测系统调试与问题

 5.1 系统调试方案

 系统的调试在设计中是很重要的,有时候一个小小的错误就会导致整个设计都无法正常运行或烧坏器件。当焊接好整个实物后先不要急着通电去试,首先对照电路图检查所有的器件和借口是否有漏焊和虚焊。要是没有然后再进行通电,通电后检查各个器件会不会有发烧的症状,要是有那就是电路中有短路情况。等这些都检查完毕了,再对各个模块进行检查,用万用表先测各个模块是否都有电压,要是有那就都是正常的要是没有那就是电路的焊接有问题,就马上断电再仔细检查电路。

 5.1.1 体温模块调试

 检查完焊接问题后,进行通电。通电后单片机没有出现发烧情况,电路中没有虚焊、漏焊以及短路情况。用温度传感器对体温进行测量,液晶正常显示温度。然后调节温度的上下限,在超出限定值后看蜂鸣器是否报警。调试过程如图5-1体温模块调试所示。

 温度上限

 实测温度

 温度下限

 三极管

 自锁开关

 蜂鸣器

 LM324

 光电传感器

 图51 体温模块调试图

 5.1.2 血压模块调试

 血压模块焊接问题检查后,对模块进行通电,因为血压模块不在主板上,所以通电用到了排针,在通电后仔细检查排针的接口是否都接好,电是否通过。要是没有电

 流通过那么就可能是排针没有插好或者焊接没焊好。通电问题解决后用袖带检测血压,看气泵和电磁阀是否都正常工作,如果正常就进行血压的检测,如果液晶正常显示血压值则该模块正常。调试过程如图5-2血压模块调试图所示。

 收缩压

 舒张压

 图52 血压模块调试图

 5.1.3 脉搏模块调试

 检查完焊接问题后,进行通电。通电后传感器和单片机芯片等都没有出现发烧情况,证明没有短路出现,焊接是正确的。然后通过传感器对脉搏开始测量,看是否有脉搏值显示,要是有那么该模块就没有问题。具体调试过程如下图5-3脉搏模块调试图所示。

 脉搏

 图53 脉搏模块调试图

 5.2 系统调试中遇到的问题及解决方法

 在脉搏调试过程中,检查完电路通上电后,发现电源线有发热的情况,这属于短路引起的。所以断掉电之后又重新检查焊接情况,果然有焊点连接到一起了。修改后就没有问题了。在体温测量模块调试的时候,电路检查完通电后,出现了蜂鸣器一直报警的现象,因为蜂鸣器是三极管控制的,所以用万用表检查了三极管的各脚电压。但是三极管是正常工作的,所以应该是软件方面的问题,再查看程序时果然单片机给三极管的一直是高电平,所以蜂鸣器一直会报警,修改后问题就解决了。

 6

  便携式人体健康监测系统测试结果分析

 6.1 测试方案

 实物焊接完成,通电测试都没有问题后。对整体的功能进行测试,记录相应的数据。进行多次测量,对记录的数据进行数据分析和处理。看能否在允许的误差范围内测出人体的相关参数,如果误差太大就想办法进行改善。

 6.2 测试数据

 6.2.1 体温测量数据记录及分析

 体温数据测量取三个测试对象,分别进行三次测量。数据的记录如表6-1体温检测数据表所示。

 表61 体温检测数据表

 对象一

 对象二

 对象三

 次数

 实际

 测量

 实际

 测量

 实际

 测量

  1

  36.2℃

  36.4℃

 35.4℃

  35.4℃

 36.8℃

  36.6℃

  2

  36.2℃

  36.5℃

 35.4℃

  35.6℃

 36.8℃

  36.5℃

  3

  36.2℃

  36.4℃

 35.4℃

  35.3℃

 36.8℃

  36.6℃

 根据上表的测量数据,对象一、对象二和对象三的体温测量数据和实际的体温数据之间有一定的误差。但是都在可控的误差范围内,所以体温的检测正确率相对准确。

 6.2.2 血压测量数据记录及分析

 血压数据测量取三个测试对象,分别进行三次测量。数据的记录如表6-2血压检测数据表所示。

 表61 血压检测数据表

 对象一

  对象二

  对象三

 次数

  实际

 测量

  实际

 测量

  实际

  测量

 高

  低

 高

  低

 高

  低

 高

  低

  高

  低

 高

  低

 1

 144mmHg 68mmHg 145mmHg 70mmHg 146mmHg 70mmHg 147mmHg 71mmHg 152mmHg 74mmHg 151mmHg 75mmHg

 2

 144mmHg 68mmHg 144mmHg 69mmHg 146mmHg 70mmHg 145mmHg 72mmHg 152mmHg 74mmHg 153mmHg 73mmHg

 3

 144mmHg 68mmHg 145mmHg 70mmHg 146mmHg 70mmHg 146mmHg 72mmHg 152mmHg 74mmHg 152mmHg 72mmHg

 血压数据测量取三个测试对象,分别进行三次测量。根据上表的测量数据,对象一、对象二和对象三的血压数据和实际的血压值之间存在一定的误差。但是由于传感器和各器件都是非理想的,测量过程中有人为的误差,所以测量的误差在可控的范围内。

 6.2.3 脉搏测量数据记录及分析

 脉搏数据测量取三个测试对象,分别进行三次测量。数据的记录如表6-2脉搏检测数据表所示。

 表63 脉搏检测数据表

 对象一

 对象二

 对象三

 次数

  实际

  测量

 实际

 测量

  实际

  测量

 1

  85次/min

 84次/min

  78次/min

 79次/min

  82次/min

 81次/min

 2

  85次/min

  86次/min

  78次/min

 77次/min

  82次/min

 80次/min

 3

  85次/min

 83次/min

  78次/min

 76次/min

  82次/min

  83次/min

 根据上表的测量数据,对象一、对象二和对象三的脉搏数据和实际的脉搏值之间存在一定的误差。但是由于传感器和各器件都是非理想的,测量过程中有人为的误差,所以测量的误差在可控的范围内,测量的脉搏数据也相对准确。

 6.2.4 数据测试误差率记录分析

 对数据进行计算分析后,记录如表6-4数据误差率分析记录表所示。

 表6-4 数据误差率分析记录表

 次数

  对象一

  对象二

  对象三

  体温

 血压

 脉搏

 体温

 血压

 脉搏

 体温

 血压

 脉搏

  高

 低

  高

 低

  高

 低

 1

 0.55%

 0.6%

 2%

 1.2%

 0

 0.7%

 1.4%

  1.3%

  0.54%

  0.65%

 1.4%

  1.2%

 2

 0.82%

  0

  1.5%

  1.2%

  0.56%

  0.7%

 2.8%

  1.3%

 0.81%

  0.65%

 1.4%

  2.4%

  3

 0.55%

 0.6%

 2%

 2.3%

  0.28%

 0

  2.8%

  2.6%

 0.54%

 0

  2.7%

  1.2%

 本次测试对三个对象进行测试,每个对象分别测试三次。通过查阅相关资料,人体体温测量的误差率一般在1%以内,血压测量的误差率在3%以内,脉搏测量的误差率在5%以内。由表中的数据可以看出对象一、对象二和对象三分别进行三次测量的体温、血压、脉搏的误差率都在误差范围以内,所以整个设计的误差率较低,准确度良好。

 6.3 结果分析

 经过测试,各个模块都能测出相应的数据。体温测量误差值在0.1℃-0.5℃之间,血压误差值在5mmHg-10mmHg之间,脉搏误差值在1-3次之间。从上面各个记录表中可以看出三个对象分别进行的三次测量的体温值、血压值和脉搏值都在误差值的范围之内,经过计算得到的误差率也在误差率的范围之内。但是系统依旧是有误差存在的,这是因为系统各个器件都并非是理想的模型,器件本身存在一定的误差,而且在测量过程中都有一定的人为操作失误,所以测试的数据就存在着相对的误差。要想继续提高测量精度和准确率就需要进一步改善。

 7

  结论与展望

 7.1 总结

 本便携式人体健康监测系统采用单片机AT89C52为主要控制核心,以体温测量、血压测量、脉搏测量、显示电路、报警电路等为主要模块。该健康检测系统能方便的在任何场合帮助人们检测自己的健康参数指标。让人们能随时了解到自己的体温、血压和脉搏情况。当某个参数超出限定的值时能及时的提醒人们,让人们及时去医院就医,为医生提供初步的诊断依据。虽然该设计能实现帮人们检测健康参数的功能,但是它依旧不是很完善。因为系统器件并非完全理想化的加上人为测量时存在的操作失误,导致系统测出来的数据有一定的误差,而这些误差可能会给人们带来一些错误的判断。如果能给该系统加上一些调节的功能那就更加完美了,比如加上一些音乐调节等模块。让人们在心情不好脉搏和血压升高时,能播放一些轻音乐让人们能放松心情。

 7.2 展望

 随着人类生活脚步的加快和社会的快速进步,带来的问题也是越来越严重,尤其是人类自身的健康问题。所以这也不得不让人们更加的去关注自己的身体健康问题,可是这一系列的问题人们又不能全部通过去医院检查解决。如果这样,那带给医疗事业的负担也就会加重,所以这种便携式的健康检测仪器就受到人们的关注,这不仅可以让人们方便的了解自身健康问题,还给医疗事业解决了不小的问题。所以这种便携式的健康检测仪器也就越来越受到人们的青睐,目前好多科技界的巨头也开始涉入该领域,可是想要完全实现数字化健康也不是一件容易的事。目前的这些数字化的健康检测仪器由于功能的不齐全和价格方面的问题,仍然不能得到广泛的使用,所以便携式人体健康检测仪器的开发空间依旧很大。

 参考文献

 [1] 刘继光.人体脉搏信号的采集装置[D].沈阳:沈阳工业大学,2006:120-130.

 [2] 戴梅萼,史嘉权.微型计算机技术及应用[M].北京:清华大学出版社,2008:297-308.

 [3] 朱智章编.单片机控制的多功能诊治仪的设计[J].电子技术,1996年(6):198-200.

 [4] 周立功.单片机实验与实践[M].北京:北京航空航天大学出版社,2004,8.

 [5] ATMEL.8bit Mircocontroller with 4k Bytes Flash AT89C51[Z].2000:56-89.

 [6] Xue Shilong,Chen Yihui.The Marine Anchor And winch's Frequency-conversion And Speed modification System Based on MCU Control[J].IMECE,2003:15-20.

  [7] 张毅刚,彭喜元,等.单片机原理及应用[M].北京:高等教育出版社,2010:87-94.

 [8] 及力.Protel 99 SE原理图与PCB设计教程[M].北京:电子工业出版社,2007,8.

 [9] 金伟正,单线数字温度传感器的原理及应用[J].电子技术应用,2000.

 [10] 贾振国.DS1820 及高精度温度测量的实现[J].电子技术应用,2000(1):58-59.

 [11] 李全利.单片机原理及接口技术[M].北京:高等教育出版社,2008:8-13.

 [12] 赵负图.传感器集成电路手册[M]北京:化学工业出版社,2002,4.

  [13] 王兆安,刘进军等.电力电子技术[M].北京:机械工业出版社,2009:163-177.

 [14] 钟全刚.数据采集系统设计[M].大连:大连理工大学,2005:32-45.

 [15] 童诗白,华成英.模拟电子技术基础[M].北京:高等教育出版社,2001:85-88.

  [16] 康华光.电子技术基础数字部分[M].北京:高等教育出版社,2008.

 [17] 杨志忠.数字电子技术[M].北京:高等教育出版社,2003,12.

 [18] 孟庆龙.单片机与三种液晶显示器的设计与论述[J].信息化研究,2009,(06):57-61.

 [19] Yamato I,et al 1 New conversion system for UPS using high frequency link[J].1IEEE PESC ,1988 :210-320.

 [20] Yamato I,et al 1 High frequency link DC/AC converter for UPS with a new voltage clamper[J ] .1IEEE PESC,1990 :52-105.

 Equation Chapter (Next) Section 1

 附

 录

 总体原理图

 主程序

 #include <reg52.h>

 //调用单片机头文件

 #define uchar unsigned char

 //无符号字符型 宏定义 变量范围0~255

 #define uint

 unsigned int

 //无符号整型 宏定义 变量范围0~65535

 #include <intrins.h>

 bit flag_300ms ;

 uint temperature ;

 sbit dq

  = P1^5; //18b20 IO口的定义

 sbit beep = P1^4;

  //蜂鸣器IO口定义

 uchar code table_num[]="0123456789abcdefg";

 sbit rs=P1^0;

 //寄存器选择信号 H:数据寄存器

  L:指令寄存器

 sbit rw=P1^1;

 //寄存器选择信号 H:数据寄存器

  L:指令寄存器

 sbit e =P1^2;

 //片选信号

  下降沿触发

 bit flag_lj_en;

  //按键连加使能

 bit flag_lj_3_en;

 //按键连3次连加后使能

 加的数就越大了

  uchar key_time,key_value;

 //用做连加的中间变量

 bit key_500ms

 ;

 uchar menu_1;

 //菜单设计的变量

 uint t_high = 300,t_low = 100;

 unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;

 unsigned int time[6]={0};

 /***********************1ms延时函数*****************************/

 void delay_1ms(uint q)

 {

  uint i,j;

  for(i=0;i<q;i++)

 for(j=0;j<110;j++);

 }

 /********************************************************************

 * 名称 : delay_uint()

 * 功能 : 小延时。

 * 输入 : 无

 * 输出 : 无

 ********************************************************************/

 void delay_uint(uint q)

 {

  while(q--);

 }

 /********************************************************************

 * 名称 : write_com(uchar com)

 * 功能 : 1602命令函数

 * 输入 : 输入的命令值

 * 输出 : 无

 ********************************************************************/

 void write_com(uchar com)

 {

  e=0;

  rs=0;

  rw=0;

  P0=com;

  delay_uint(25);

  e=1;

  delay_uint(100);

  e=0;

 }

 /********************************************************************

 * 名称 : write_data(uchar dat)

 * 功能 : 1602写数据函数

 * 输入 : 需要写入1602的数据

 * 输出 : 无

 ********************************************************************/

 void write_data(uchar dat)

 {

  e=0;

  rs=1;

  rw=0;

  P0=dat;

  delay_uint(25);

  e=1;

  delay_uint(100);

  e=0;

  }

 /********************************************************************

 * 名称 : write_string(uchar hang,uchar add,uchar *p)

 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

 write_string(1,5,"ab cd ef;")

 * 输入 : 行,列,需要输入1602的数据

 * 输出 : 无

 *********************************************************************/

 void write_string(uchar hang,uchar add,uchar *p)

 {

  if(hang==1)

  write_com(0x80+add);

  else

 write_com(0x80+0x40+add);

  while(1)

  {

 if(*p == '\0')

 break;

 write_data(*p);

 p++;

  }

  }

 /*********************lcd1602上显示特定的字符************************/

 void write_zifu(uchar hang,uchar add,uchar date)

 {

  if(hang==1)

  write_com(0x80+add);

  else

 write_com(0x80+0x40+add);

  write_data(date);

  }

 /********************lcd1602上显示两位十进制数**********************/

 void write_sfm3_18B20(uchar hang,uchar add,uint date)

 {

  if(hang==1)

  write_com(0x80+add);

  else

  write_com(0x80+0x40+add);

  write_data(0x30+date/100%10);

  write_data(0x30+date/10%10);

  write_data('.');

  write_data(0x30+date%10);

  }

 /*********************lcd1602上显示两位十进制数*******************/

 void write_sfm3(uchar hang,uchar add,uint date)

 {

  if(hang==1)

  write_com(0x80+add);

  else

 write_com(0x80+0x40+add);

  write_data(0x30+date/100%10);

  write_data(0x30+date/10%10);

  write_data(0x30+date%10);

  }

 /***********************lcd1602初始化设置************************/

 void init_1602()

 {

  write_com(0x38); //

  write_com(0x0c);

  write_com(0x06);

  delay_uint(1000);

  write_string(1,0,"t

 . ");

 write_string(1,6,"

 . ");

  write_string(1,11,"

 . ");

  write_zifu(1,5,0xdf);

 //显示度

 write_zifu(1,10,0xdf);

 //显示度

  write_zifu(1,15,0xdf);

 //显示度

  write_string(2,0,"HeartRate");

 write_string(2,9,"000/min");

 }

 /***********************18b20初始化函数****************************/

 void init_18b20()

 {

  bit q;

  dq = 1;

 //把总线拿高

  delay_uint(1);

  //15us

  dq = 0;

 //给复位脉冲

  delay_uint(80);

 //750us

  dq = 1;

 //把总线拿高 等待

  delay_uint(10);

 //110us

  q = dq;

 //读取18b20初始化信号

  delay_uint(20);

 //200us

  dq = 1;

 //把总线拿高 释放总线

 }

 /*************写18b20内的数据***************/

 void write_18b20(uchar dat)

 {

  uchar i;

  for(i=0;i<8;i++)

  {

 //写数据是低位开始

 dq = 0;

 //把总线拿低写时间隙开始

  dq = dat & 0x01; //向18b20总线写数据了

 delay_uint(5);

 // 60us

 dq = 1;

 //释放总线

 dat >>= 1;

  }

  }

 /*************读取18b20内的数据***************/

 uchar read_18b20()

 {

  uchar i,value;

  for(i=0;i<8;i++)

  {

 dq = 0;

 //把总线拿低读时间隙开始

  value >>= 1;

 //读数据是低位开始

 dq = 1;

 //释放总线

 if(dq == 1)

  //开始读写数据

 value |= 0x80;

 delay_uint(5);

 //60us 读一个时间隙最少要保持60us的时间

  }

  return value;

  //返回数据

 }

 /*************读取温度的值 读出来的是小数***************/

 uint read_temp()

 {

  uchar value;

  uchar low;

 //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序

  init_18b20();

  //初始化18b20

  write_18b20(0xcc);

 //跳过64位ROM

  write_18b20(0x44);

 //启动一次温度转换命令

  delay_uint(50);

  //500us

  init_18b20();

  //初始化18b20

  write_18b20(0xcc);

 //跳过64位ROM

  write_18b20(0xbe);

 //发出读取暂存器命令

  low = read_18b20();

 //读温度低字节

  value = read_18b20();

 //读温度高字节

  value <<= 8;

  //把温度的高位左移8位

  value |= low;

  //把读出的温度低位放到value的低八位中

  value *= 0.625;

 //转换到温度值 小数

  return value;

  //返回读出的温度 带小数

 }

 /*************定时器0初始化程序***************/

 void time_init()

  {

  EA

  = 1;

  //开总中断

  TMOD = 0X01;

  //定时器0、定时器1工作方式1

  ET0

 = 1;

 //开定时器0中断

 TR0

 = 1;

 //允许定时器0定时

 }

 /***********外部中断0初始化程序****************/

 void init_int0()

  //外部中断0初始化程序

 {

  EX0=1;

  //允许外部中断0中断

  EX1=1;

  //允许外部中断1中断

  TMOD = 0X01;

  //定时器0、定时器1工作方式1

  EA=1;

 //开总中断

  IT0 = 1;

  //外部中断0负跳变中断

  IT1 = 1;

  //外部中断1负跳变中断

 }

 /********************独立按键程序*****************/

 uchar key_can;

 //按键值

 void key()

 //独立按键程序

 {

  static uchar key_new;

  key_can = 20;

  //按键值还原

  P3 |= 0xf0;

  if(key_500ms == 1) //连加

  {

 key_500ms = 0;

 key_new = 1;

  }

  if((P3 & 0xf0) != 0xf0)

 //按键按下

  {

 delay_1ms(1);

  //按键消抖动

 if(((P3 & 0xf0) != 0xf0) && (key_new == 1))

 {

 //确认是按键按下

  key_new = 0;

  switch(P3 & 0xf0)

  {

 case 0xd0: key_can = 3; break;

 //得到k1键值

 case 0xb0: key_can = 2; break;

 //得到K2键值

 case 0x70: key_can = 1; break;

 //得到k3键值

  }

  flag_lj_en = 1;

 //连加使能

 }

 }

  else

 {

 if(key_new == 0)

 {

  key_new = 1;

  flag_lj_en = 0;

 //关闭连加使能

  flag_lj_3_en = 0; //关闭3秒后使能

  key_value = 0;

 //清零

  key_time = 0;

 }

  }

  }

 /****************按键显示函数***************/

 void key_with()

 {

  if(key_can == 1)

 //设置键

  {

 menu_1 ++;

 if(menu_1 >= 3)

 {

  menu_1 = 0;

 }

 if(menu_1 == 0)

 {

  write_com(0x0c);

 //关闭光标

 }

  }

  if(menu_1 == 1)

  //设置高温报警

  {

 if(key_can == 2)

 {

  if(flag_lj_3_en == 0)

 t_high ++ ;

 //按键按下未松开自动加三次

 else

  t_high += 10; //按键按下未松开自动加三次之后每次自动加10

  if(t_high > 990)

 t_high = 990;

 }

 if(key_can == 3)

 {

  if(flag_lj_3_en == 0)

 t_high -- ;

 //按键按下未松开自动减三次

 else

  t_high -= 10; //按键按下未松开自动减三次之后每次自动减10

  if(t_high <= t_low)

 t_high = t_low + 1;

 }

 write_sfm3_18B20(1,6,t_high);

 write_com(0x80+6);

  //将光标移动到秒个位

 write_com(0x0f);

 //显示光标并且闪烁

 }

 if(menu_1 == 2)

  //设置低温报警

  {

 if(key_can == 2)

 {

  if(flag_lj_3_en == 0)

 t_low ++ ;

  //按键按下未松开自动加三次

 else

  t_low += 10;

 //按键按下未松开自动加三次之后每次自动加10

  if(t_low >= t_high)

 t_low = t_high - 1;

 }

 if(key_can == 3)

 {

  if(flag_lj_3_en == 0)

 t_low -- ;

  //按键按下未松开自动减三次

 else

  t_low -= 10;

 //按键按下未松开自动加三次之后每次自动加10

  if(t_low <= 10)

 t_low = 10;

 }

 write_sfm3_18B20(1,11,t_low);

 write_com(0x80+11);

 //将光标移动到秒个位

 write_com(0x0f);

 //显示光标并且闪烁

 }

  }

  /********************菜单对应的处理函数*********************/

 void menu_dispaly()

 {

  if((menu_1 == 1))

 //对光标不处理,要不然光标不会显示在正确的位置

  {

 write_com(0x80+6);

 //将光标移动到

 write_com(0x0f);

  //显示光标并且闪烁

  }else if((menu_1 == 2))

  {

 write_com(0x80+11);

 //将光标移动到

 write_com(0x0f);

 //显示光标并且闪烁

 }

 }

  /****************报警函数***************/

 void clock_h_l()

 {

  static uchar value;

  if((temperature <= t_low) || (temperature >= t_high))

  {

 value ++;

 //消除实际距离在设定距离左右变化时的干扰

 if(value >= 2)

 {

  beep = ~beep;

 //蜂鸣器报警

  }

 }

  else

  {

 beep = 1;

 }

  }

 /****************主函数***************/

 void main()

 {

 beep = 0;

 //开机叫一声

 delay_1ms(150);

  P0 = P1 = P2 = P3 = 0xff;

  init_1602();

 //1602初始化

  time_init();

 //初始化定时器

 init_int0();

  //外部中断0初始化程序

  while(1)

  {

  if(flag_300ms == 1)

  //300ms 处理一次温度程序

 {

 flag_300ms = 0;

 temperature = read_temp(); //先读出温度的值

  clock_h_l();

 //报警函数

  write_sfm3_18B20(1,1,temperature);

  menu_dispaly();

  //不同级的菜单对应显示1602对应显示不同

 }

 key();

  //按键程序

 if(key_can < 10)

 {

  key_with();

  //设置报警温度

  }

 if(displayOK==0)//如果显示关

 {

 rate = 0;

 }

 else//如果显示开

 {

  rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);

 }

 write_sfm3(2,9,rate);

 delay_1ms(300);

  }

 }

 void int0() interrupt 0

 {

  if(timecount<8)

  //当连续两次检测时间间隔小于8*50ms=400ms不处理

  {

  TR0=1;//开定时器

  }

  else

  {

 time[i]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间

 TH0 = 0x3c;

 TL0 = 0xb0;

  // 50ms

 12M

 timecount=0;//50ms计数清零

 i++;

 if(i==6)//记录到超过等于6次时间

 {

  i=1;//计数从1开始

  displayOK=1;

 //测得5次开始显示?

 }

  }

 }

 /*************定时器0中断服务程序***************/

 void time0_int() interrupt 1

 {

 TH0 = 0x3c;

  TL0 = 0xb0;

  // 50ms

 12M

  timecount++;//每50ms一次计数

  if(timecount>25)

  //当超过25*50ms=1.5s没有检测到信号停止显示

  {

  i=0;//数据个数清零

  timecount=0;//50ms计数清零

  displayOK=0;//显示关

  TR0=0;//定时器关

  TH0 = 0x3c;

  TL0 = 0xb0;

  // 50ms

 12M

  }

 }

 /*************定时器1中断服务程序***************/

 void time1_int() interrupt 3

 {

 static uchar value;

  TH0 = 0x3c;

  TL0 = 0xb0;

  // 50ms

  value ++;

  if(value % 6 == 0)

  {

 flag_300ms = 1;

 //300ms

 value = 0;

  }

  if(flag_lj_en == 1)

 //按下按键使能

  {

 key_time ++;

 if(key_time >= 10) //500ms

 {

  key_time = 0;

  key_500ms = 1; //500ms

  key_value ++;

  if(key_value > 3)

  {

 key_value = 10;

 flag_lj_3_en = 1;

 //3次后1.5秒连加大些

  }

 }

  }

 }

 致

 谢

 此次设计是在魏晓娟老师的悉心指导下完成的。导师为论文课题的研究提出了许多指导性的意见,为论文的撰写、修改提供了许多具体的指导和帮助。魏晓娟老师严谨治学的工作作风,孜孜不倦的敬业精神,给我留下了深刻的印象,使我受益良多在本文结束之际,特向我的导师说声感谢!

 通过此次设计,一方面使我认识到自己的不足,发现了学习中的错误之处;另一方面又巩固和积累了丰富的知识,吸取别人好的方法和经验,增强对复杂问题的解决方法和能力,为自己今后的工作和学习打下坚实的基础。

 经过这次努力,使我顺利的完成了毕业设计这份毕业设计既是对我过去四年知识的总结又是自己知识的积累也大大加深了对单片机的了解。

 也感谢西北民族大学所有教导过我的老师,谢谢你们四年来的悉心教导与关心爱护。

 最后,感谢我亲爱的同学,尤其是我的舍友们。感谢他们在生活及情感上的容忍及包容,在我完成论文的学习生活中,默默的支持着我。因为有了他们我才坚持到了最后,因为有了他们我才获得了成功。

Tags: 毕业设计   人体健康   监测系统  

搜索
网站分类
标签列表