为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

红外体温计的设计

2017-09-20 50页 doc 423KB 143阅读

用户头像

is_314871

暂无简介

举报
红外体温计的设计红外体温计的设计 JIANGSU UNIVERSITY OF TECHNOLOGY 本科毕业设计(论文) 基于单片机的非接触式体温计设计 学院名称: 电气信息工程学院 专 业: 电子信息工程 班 级: 10电子 1Z 学 号: 10311128 姓 名: 杨 艳 指导教师姓名: 黄金林 指导教师职称: 高级实验师 二〇一四 年 六 月 江苏理工学院毕业设计说明书(论文) 基于单片机的非接触式体温计设计 摘要:本次设计的是基于单片机的非接触式体温计。该体温计主要由单片机系统、 红外传感器、报警电路和...
红外体温计的设计
红外体温计的 JIANGSU UNIVERSITY OF TECHNOLOGY 本科毕业设计(论文) 基于单片机的非接触式体温计设计 学院名称: 电气信息工程学院 专 业: 电子信息工程 班 级: 10电子 1Z 学 号: 10311128 姓 名: 杨 艳 指导教师姓名: 黄金林 指导教师职称: 高级实验师 二〇一四 年 六 月 江苏理工学院毕业设计说明书(论文) 基于单片机的非接触式体温计设计 摘要:本次设计的是基于单片机的非接触式体温计。该体温计主要由单片机系统、 红外传感器、报警电路和温度显示电路等部分组成。以单片机为控制核心,通过红外传 感器距离人体3CM,5CM处采集人体温度,经A/D转换器转换成数字信号,由主控芯片 对采集数据进行处理,通过显示电路进行实时显示。如果实时数据不在设定的范围内, 则由报警电路报警。该体温计能够在机场、海关、车站、宾馆、商场、影院、写字楼、 学校等人流量较大的公共场所,有效地避免国内传统的体温测量的缺点,在快速,准确 无误,没有交叉感情的情况下测量出人体温度,应用十分广泛。 关键词:单片机;红外传感器;LCD显示 Abstract:The design of the non contact type temperature meter based on SCM.The thermometer is mainly composed of single chip microcomputer system,in- frared sensor,an alarm circuit and a temperature display circuit.With single chip micromputer as control core,through the infrared sensor from the body of 3CM,5CM of human body temperature acquisition,the A/D converter converter the digital signal,the collected data is processed by the main control chip,through the display circuit for real-time display.If the data is not in the set range,the alarm circuit alarm.The thermometer can be at the airport,the customs,station, hotel,shopping malls,theaters,offices,schools,large public places,effectively avoid the shortcomings of the traditional temperature measurementat,in the rapid,accutate,no cross feelings of the case measured body temperature,a wide range of applications. Keywords: Single chip microcomputer; Infrared sensor; The LCD display I 江苏理工学院毕业设计说明书(论文) 目录 序 言 ..................................................... 1 第1章 绪论 ................................................. 2 1.1课题研究背景 ....................................................... 2 1.1.1体温计的发展 ................................................. 2 1.1.2红外测温技术简介 ............................................. 3 1.2课题研究的目的意义 ................................................. 3 第2章 系统总体设计 ......................................... 5 2.1系统整机设计 ................................................... 5 2.1.1整体设计原理 ................................................. 5 2.2 系统方案的设计与比较 .............................................. 5 2.2.1方案的设计 ................................................... 5 2.2.2方案的比较 ................................................... 7 2.3元器件的选择 ....................................................... 7 2.3.1单片机的选择 ................................................. 7 2.3.2传感器的选择 ................................................. 8 2.4方案的最终选择 ..................................................... 8 2.5系统整机设计框图 ................................................... 8 第3章 硬件模块设计 ......................................... 9 3.1单片机系统设计 ..................................................... 9 [3]3.1.1单片机最小系统设计 .......................................... 9 3.1.2晶振电路 .................................................... 10 3.1.3复位电路 .................................................... 10 3.2 传感器电路设计 ................................................... 11 [1]3.2.1 MLX90615红外传感器的介绍 .................................. 11 3.2.2 MLX90615引脚及功能 ......................................... 12 3. 3液晶显示电路设计 ................................................. 13 3.3.1液晶显示屏的简介 ............................................ 13 3.3.2显示器各个引脚的作用 ........................................ 14 3.4报警电路设计 ...................................................... 14 3.4.1报警电路原理 ................................................ 14 3.5电源、按键电路设计 ................................................ 15 3.6硬件的总电路 ...................................................... 15 3.6.1 硬件总电路图 ................................................ 15 3.6.2硬件电路工作原理叙述 ........................................ 15 第4章 软件模块设计 ........................................ 17 4.1红外测温模块 ...................................................... 18 II 江苏理工学院毕业设计说明书(论文) 4.1.1红外测温模块分析 ............................................ 18 4.1.2软件程序 .................................................... 18 4.2显示模块设计 ...................................................... 28 4.2.1显示模块分析 ................................................ 28 4.2.2软件程序: .................................................. 28 4.3报警模块设计 ...................................................... 34 第5章 系统软件的仿真与误差处理 ............................. 35 5.1系统的仿真 ........................................................ 35 5.2 Keil软件应用 ..................................................... 36 5.3系统误差处理 ...................................................... 38 总结 ...................................................... 40 参考文献................................................... 41 致 谢.................................................... 42 附 录.................................................... 43 附录A 硬件原理图 ..................................................... 43 附录B 主程序: ....................................................... 44 附录C元器件清单: ................................................... 61 III 江苏理工学院毕业设计说明书(论文) 序 言 目前人们的生活水平不断的提高,人们对自身的身体健康问题也更加的关注,然而体温的测量则是鉴定身体健康好坏的之一,通过这一生理指标的要求可以更好的判断身体的健康程度,因此体温计在医学上有着一席之地同时也成为了人类生活的必备品。社会上有多种多样的体温计,如:水银体温计、电子体温计、激光体温计等,这些体温计在使用时需要进行一定的消毒,若不采取消毒措施则会产生交叉感染使测量数据存在很大的误差。然而现在有一种新型的体温计:非接触式电子体温计,这一体温计大大改善了这一缺陷,更好的提供人们健康程度以至于得到广泛的应用。与其他的体温计比较,利用红外传感器制作的体温计有效的避免了传统体温计存在的缺点,更快、更准并且在没有交叉的情况下测量出人体体温,由于这一特点非接触式体温计被广泛用于SARS预防检测工作、学校、火车站、机场等公共场合。 传统的传感器是将各种化学量、物理量、生物量的信号转换为电信号,用来检测并控制整个系统,其性能好坏直接影响测量结果。因此,必须掌握传感器的结构、性能指标、工作原理将其应用到实例中通过分析并完全掌握。为了不断的提高水平适用于各个领域,更多新型的体温计也涌现出来。本课题就是由于传统体温计存在一定的缺陷而设计出来的新型电子体温计。 本次设计以单片机为核心,利用红外传感原理而设计的基于单片机的非接触式电子体温计。单片机是整个电路的核心部分,外围电路由红外传感器、数据处理电路、数据显示电路组成。以STC89LE52单片机作为核心,MLX615数字红外传感器进行数据采集将采集到的信号转换为电信号再经过MLX615传感器内部的数据转换模块进行数据处理将电信号转换为数字信号,将转换后的数字信号送入单片机,将单片机经过一定的处理之后的信号送入液晶显示部分进行显示,从而使整个操作显得更为智能化。这次的设计希望能够为今后更好的拓展体温监测领域并能够提供更好的思路和方法,能够在更广大的领域中得到广泛的应用。 第 1 页 共61 页 江苏理工学院毕业设计说明书(论文) 第1章 绪论 由于科学技术发展越来越迅速,传统的体温计已经远远不能达到一些测量领域的要求,因此对非接触式体温计的需求量越来越大,所以本次非接触式电子体温计的设计就是为了能够提供更多的新的信息和方法,以至于更好的推广。 1.1课题研究背景 1.1.1体温计的发展 一个人身体状况是否健康通过测量其体温就可以判断出来,所以体温计在医学领域有着重要的作用。随着社会不断发展,科学技术的飞速提高,各种各样的体温计浮出社会在各自的领域中占有其重要的地位,每一种体温计总会有其不足之处,但是社会在进步,改进在所难免。目前社会上现有的体温计是:水银体温计、电子体温计、红外非接触式电子体温计。 原来在人们的生活中用的最多的则是水银体温计,所以对这一类的体温计也是比较熟悉的。水银体温计是由于汞受热之后膨胀的原理。当水银受到体温进行加热后,体温计中的水银体积慢慢膨胀使玻璃管内水银柱的长度发生变化。水银体温计的外侧是由玻璃构成因此比较密,而水银的性能比较稳定,所以这一类体温计的显示比较准确而且稳定性比较高,并且价格廉价方便实用、无需外加电源,因此水银体温计在医务工作者身边常常存在。但这一类体温计存在一定的弊端,正式由于外围是由玻璃构成易破碎而水银具有毒性,如是在实用过程中体温计破裂,人体肌肤就会接触到水银则会中毒产生不良反应。 电子体温计是将某些物质的物理参数与环境温度之间进行一定的关系确定,将测得的体温以数字的形式显示出来。目前很多的医院也采用了这类电子体温计。电子体温计是以数字的形式显示出来,非常快速并且不需要于测量者接触就可测量从而被广泛应用。但她也有其不足之处,它是由某些物质的物理参数与环境温度之间的关系来确定的,通过数字显示,其显示的数值受物理参数的影响, 第 2 页 共 61 页 江苏理工学院毕业设计说明书(论文) 使其准确度会不高,测量性能降低。 红外测温技术在产品的生产过程中,在对产品质量的控制和监测以及对设备在线故障诊断和对安全保护以及节约能源等方面都发挥着作用。红外体温计是 通过对身体自身辐射的红外信号进行的测量,准确的测量人身体的温度判断是否超过人体的正常温度。采用能够吸收人体辐射的红外线的传感器,通过非接触的方式感应测得人体的体温,所以这类传感器不会对人的身体产生危害。与前两种体温计相比较红外体温计更快、更安全、使用寿命更长并且具有较高的可靠性。 近几年,红外体温计技术不断发展,使用性能更完善,功能不断地增强,能够适用的范围越来越大。 1.1.2红外测温技术简介 红外测温是将物体发射出来的辐射能转换为电信号,将红外辐射能的大小与物体自身的温度相对,依据电信号的大小从而确定物体自身的温度。 在2003年的全国“非典”战争中,我国开始对红外技术进行深入的研究,欲将红外技术应用于非接触式测温器。因此在很短的时间中研发成功了新型体温计:非接触式红外测温仪。由于国外的技术很先进,国外对于这类技术已是非常先进,导致很多的国家对于这一技术进行研究,努力在不同的领域推广这一技术。 然而在红外技术的发展中,尤其需要指出的是:60年代激光的出现极大地影响了红外技术的发展,很多重要的激光器件都在红外波段内,其相干性便于移用电子技术中的外差接收技术,使雷达和通信都可以在红外波段实现,并可获得更高的分辨率和更大的信息容量。在此之前,红外技术仅仅能探测非相干红外辐射,外差接收技术用于红外探测,使探测性能比功率探测高好几个数量级。目前国内开发的红外体温计有很多,例如:“HW-05”人体温度红外热图像仪、“LHW-I”型红外测温仪、“BJ40”型非接触式红外体温计等,因此红外技术具有非常好的发展前景~ 1.2课题研究的目的意义 人体体温是表征人健康的重要条件。一般人体健康,人体的体温比较恒定,一般在37?左右,不会因为外界环境的变化而变化,当人体本身身体或身体的 第 3 页 共 61 页 江苏理工学院毕业设计说明书(论文) 某个部位发生病变时,人体的体温将会发生改变。在医学中,医生通过病人的身体体温来判断病人的生理状态,有时候通过人体体温还可以确定是否有其他疾病的发生,并且对一些疾病进行防患和预防的作用。 利用非接触式红外传体温计测量体温可以很快的测量出人体的体温并且准确度比较高,这种非接触式测量体温的方法存在这显示的意义,并且能够在很多非常时期起到重要作用。与传统的体温计相比,红外体温计更具有应用意义。 如:刚生下来的孩子,每个妈妈都希望孩子健康成长,随时都会注意孩子的体温,在不影响孩子休息的情况下测量孩子体温;医用方面使用的是水银体温计,这种体温计对于老年人来说较不方面,老人们眼力不好很容易读错,但是红外体温计通过显示屏直接显示数值,读书较方便;最主要的是水银体温计在破碎而且人们不知道的情况下使用,给人们的身体带来了很大的危害,而红外体温计通过红外线感应采集信号,这种红外线对人体没有伤害,而且测量更准确。 第 4 页 共 61 页 江苏理工学院毕业设计说明书(论文) 第2章 系统总体设计 2.1系统整机设计方案 2.1.1整体设计原理 本次课题设计是利用红外传感器来测量体温的非接触式体温计,红外测温的原理是:每一个测量物体本身的温度是不一样的,用红外传感器对物体发射红外辐射线,由于物体本身的不同反射的红外辐射线的波长是不同的,但是温度值确实恒定的。红外传感器是将发射的红外辐射线的能力转换为电信号,根据电信号的大小来确定物体本身的温度。本次设计正是利用这一个原理来实现的,利用红外传感器来测量人体体温,红外传感器对人体发射红外信号,将红外信号转换为电信号在传感器内部经过A/D转换成为数字信号,将数字信号发送到单片机中,单片机经过一定的操作后将数字信号经LCD液晶显示屏进行数字显示。本设计还存在报警功能,当人体的温度超过一定的温度之后则进行LED报警功能。 2.2 系统方案的设计与比较 2.2.1方案的设计 对于本次设计的原理,采用红外传感器、单片机系统、显示系统来实现红外测温,能够达到测量范围是35.5?~42?,测量距离为5~15cm,5s自动关机。现针对本次设计进行方案设计与选择。 方案一 在本方案的设计中,电路的组成模块为:模拟红外传感器、放大电路、A/D转换电路、单片机控制模块、数码显示电路、LED报警电路。其原理是通过模拟红外传感器采集信号并输出模拟信号,模拟信号经放大电路放大再经过A/D转换电路进行信号处理,将模拟信号转换为数字信号送入单片机中,单片机将信号送至数码管进行数值显示。在显示结果的处理上,当显示的人体温度没有超过人体 第 5 页 共 61 页 江苏理工学院毕业设计说明书(论文) 的正常体温报警电路不工作,不进行报警功能;当显示的人体温度超过人体正常体温的报警范围,报警电路工作,LED显示灯亮。如图2-1设计框图。 图2-1方案一设计框图 方案二 本方案的组成模块为:数字红外传感器、单片机控制系统、LCD显示电路、LED报警电路。该方案的工作原理是利用数字红外传感器进行信号采集,将采集到的电信号经过传感器内部的放大和转换功能转换为数字信号送入单片机,单片机将送来的数字信号送至LCD液晶显示屏进行数值显示。在显示结果的处理上,当显示的人体温度没有超过人体的正常体温报警电路不工作,不进行报警功能;当显示的人体温度超过人体正常体温的报警范围,报警电路工作,LED显示灯亮。。如图2-2设计框图。 图2-2 方案二设计框图 第 6 页 共 61 页 江苏理工学院毕业设计说明书(论文) 2.2.2方案的比较 ,传感器部分 传感器分为模拟传感器和数字传感器两种选择。方案一是模拟传感器,这类传感器的成本相对而言比较低,但是对于电路的设计来说比较复杂。模拟传感器采集到的信号只是模拟信号需要经过一定的电路进行放大和数据处理再转换为数字信号。方案二是数字传感器,这类传感器相对于模拟传感器而言成本较高,其内部存在放大和数据处理模块,无需外加电路对信号进行处理,使得电路更加的简单并且大大提高了集成度从而减小了功耗,因此采用方案二设计。 ,显示部分 显示通常有LED数码管显示和LCD液晶显示两种。本次的设计是进行体温的设计,需要显示的是体温,一般人体正常的体温是37?左右,采用方案一的设计加上传感器一些外在的影响需要采用5个数码管进行显示。在显示的数据较多的时候采用数码管不能很好的并且直观的显示出所测得的数据,还会存在一些客观的因素,但是LCD液晶显示就可以很好的直观的显示数据,所以方案二则考虑到这点采用LCD液晶显示屏进行数据的显示,因此采用方案二的设计。 2.3元器件的选择 2.3.1单片机的选择 在很多的课程设计中,一般采用的单片机为STC89C51/89C52单片机。这一类单片机的特点是内部存在8KB的FLASH ROM和256B的内RAM,提供电源为5V。而为了满足本次电路的设计需要提供的电源为3V,为了满足电源的需要则无法采用这类单片机,而需采用STC89LE52单片机。STC89LE52单片机与STC89C52单片机相比,STC89LE52单片机提供的电压范围为2.0V‐3.8V;STC89C52单片机提供电压范围为4.5V‐5.5V。所以为了电路提供的需要选择STC89LE52的单片机。 第 7 页 共 61 页 江苏理工学院毕业设计说明书(论文) 2.3.2传感器的选择 针对于这次设计,测量的是人体的体温,距离范围是3~5cm。将模拟传感器和数字传感器进行比较,数字传感器更方便,为了保证测量的准确度,采用MLX90615红外传感器进行人体体温的测量。MLX90615传感器的特点:测量的温度范围是-40‐85?;测量的范围是3‐5cm的距离;测量精度为0.5?;0.02?的分辨率;3V的提供电源。所以针对以上一些特点选择MLX90615传感器进行人体体温的测量。 2.4方案的最终选择 结合上面的方案简介,本次的设计采用方案二的比较合理。按键作为触发测量,用来提供3V的电源提供给单片机和液晶显示屏,使他们正常的供电。采用MLX90615数字红外传感器人体发射红外信号并进行信号的采集。采用STC89LE52单片机作为整体控制系统,对红外传感器的处理后的数字信号再次进行处理,将最终处理后的信号送至LCD5110液晶显示屏进行数值显示,显示正常的人体体温,当到达所设置的上限值时候进行报警,通过LED显示灯显示高温报警。硬件电路和软件电路相互配合,从而很好的完成本次的设计。具体在第二、第三章介绍。 2.5系统整机设计框图 本次设计是基于单片机的非接触式体温计设计,主要是由红外传感器、A/D转换电路、单片机系统、显示电路、报警电路模块组成。系统整体设计框架如图2-3所示。 第 8 页 共 61 页 江苏理工学院毕业设计说明书(论文) 图2-3总体设计框图 第3章 硬件模块设计 基于单片机的非接触式体温计设计的硬件电路利用目前较广泛自顶向下的原则,从局部到整体的设计思想,将整个设计分为以下几个模块:单片机控制模块、红外测温模块、电源电路模块、液晶显示模块、晶振模块、复位模块。这种从局部到整体的设计能够将复杂的问题简单,更有利于帮助理解。这样的设计方法也是我们最常用的方法,能够让我们的设计思路更加的清晰以便于软件的调试,为整个电路的设计减小了难度。这一章具体介绍了整体电路的硬件电路设计,一下针对各个模块的电路进行分析。 3.1单片机系统设计 [3]3.1.1单片机最小系统设计 这个设计是用STC89LE52单片机设计的,该单片机的提供电压是3V与常用的STC89C52/STC89C51单片机在电压的提供上有所不同,但是工作原理是相似的,工作原理为:将红外传感器部分程序加载到STC89LE52单片机中进行数据处理送至LCD5110液晶显示屏显示。要想使单片机能够正常的工作,需给它提供驱动电路:晶振电路、复位电路、电源电路。下面进行一一介绍。单片机最小系统如图3-1所示。 第 9 页 共 61 页 江苏理工学院毕业设计说明书(论文) 图3-1 单片机最小系统 3.1.2晶振电路 晶振电路的作用是为单片机提供脉冲信号的也就是为,单片机能够正常工作晶振电路是必不可少的一个提供信号模块。一般在设计晶振电路的时候通常在单片机的XTAL1和XTAL2两个引脚接一个石英晶体和两个补偿电容构成一个振荡电路,为单片机提供一定的时钟信号。晶振的种类很多有,在本次选择的是24MHz的石英晶体振荡器和22pf的补偿补偿电容构成的晶体振荡电路,竞争电路如图3-2所示。 图3-2 晶振电路 3.1.3复位电路 复位电路也是提供单片机正常工作不可缺少的条件。当单片机RST引脚上保持2个周期或2个周期以上的高电平那么就可以正常的进行复位电路的实现。一般复位分为上电复位、按键复位、内部复位。上电复位是单片机接通电源之后会进行自动复位操作;单片机正常通电的情况下,RST引脚上接通高电平,使得接在RST两端的补偿电容的充电电流不断减小,从而使引脚上的电压越来越小,如需进行复位,则可以按下复位按键使RST引脚上的电压重新恢复到高电平。本次设计中采用的是上电复位,如图3-3所示。 第 10 页 共 61 页 江苏理工学院毕业设计说明书(论文) 图3-3 复位电路 3.2 传感器电路设计 [1]3.2.1 MLX90615红外传感器的介绍 MLX90615传感器是由红外热垫堆传感器、低噪声放大器、16位模数转换器和DSP单元组成。具体工作原理热堆芯片采集信号将信号送至传感器内部进行内部的信号处理经过放大器滤波器之后由数字信号处理从而实现对温度的采集和处理。如图3-4具体组成图。 图3-4具体组成框图 其工作原理:红外传感器把在人体身上采集的红外辐射信号转变为电信号, 第 11 页 共 61 页 江苏理工学院毕业设计说明书(论文) 将电信号通过放大器进行噪声放大处理之后送至转换器中,将电信号转换为数字信号,将处理之后的信号放入内部存储器中,最后将信号送入单片机控制系统,给单片机提供数字信号。MLX90615具有较高的精度和分辨率,一般用在医学上。 如图3-5电路连接图。 图3-5 传感器电路 3.2.2 MLX90615引脚及功能 MLX90615是4个引脚的,引脚分布图如图3-6所示。: 图3-6 MLX90615引脚图 [4]各个引脚的功能: 1、1-PWM/SDA:当MLX90615为SDA模式时串行数据输入输出接口,当为PWM 模式时做为PWM波输出接口。 2、2-VDD:外部的电源输入 3、3-SCL:当MLX90615为SDA模式时SCL为串行输入,为PWM模式时Vz 第 12 页 共 61 页 江苏理工学院毕业设计说明书(论文) 为由外部电路置高电平。 4、4-VSS:地 3. 3液晶显示电路设计 3.3.1液晶显示屏的简介 本次课题采用的是LCD5110液晶显示屏,一般这类的显示屏用于NOKIA手机中,作为手机的显示屏,还可以作为一些简单的显示系统。该显示器有如下的特点:具有84×48的点阵能够显示4行汉字;通过串行接口与单片机进行数据传输,4Mbps的传输速率,能够很快的显示数据不需要进行时间的等待;液体体积比较的小有利于安装;低压供电,正常显示电流小于200uA。如下图3-7、3-8液晶引脚图及电路原理图。 图3-7 液晶引脚图 -8 液晶显示电路 图3 第 13 页 共 61 页 江苏理工学院毕业设计说明书(论文) 3.3.2显示器各个引脚的作用 1、GND:接地 2、BL:背光灯控制开关,当时低电平的时候打开背光 3、VCC:外部电源提供端 4、CLK:时钟引脚 5、DIN:数据输入端 6、DC:数据和命令切换脚 7、CS:进行信号的片选? 8、RST:复位信号 3.4报警电路设计 3.4.1报警电路原理 报警电路是针对人体体温超过人体正常体温而报警,此电路时为了让人民能够知道自己的体温,起到防范危害的效果。主要工作状态:正常的对人体体温进行检测,将检测的数值在显示屏上显示出来,当显示的体温在36~37?时表示体温正常,报警电路不工作LED显示灯不亮;当显示的体温超过37?时,报警电路开始工作,LED显示灯亮。如3-9所示电路图。 图3-9 报警电路图 第 14 页 共 61 页 江苏理工学院毕业设计说明书(论文) 3.5电源、按键电路设计 本次电路的提供电源为3V,所以为了提供3V电源设计了电路。电路中每个元器件都必须有电源提供,3V的电源为单片机、传感器、液晶提供,更有效的保障电路的正常工作。采用节电池来提供3V电源,推动开关来控制电源的提供情况,当推动开关时电源正常提供,但是此时单片机、传感器、液晶无法工作,也就是没有电源提供,所以此时利用一个按键来控制电源的提供,按键按下原件得电,电路开始采集并显示人体体温。如3-10、3-11电路所示。 图 图 3-10 电源电路 图3-11 按键电路 3.6硬件的总电路 3.6.1 硬件总电路图 前面对各个模块详细的叙述,其总体电路图见附录A 3.6.2硬件电路工作原理叙述 按下电源K开关, LED显示灯D2亮表示3V节电池组成的电源电路正常工作,将3V的电源提供给单片机,满足单片机正常工作的的一个条件,由C1和R1组成上点复位电路给单片机的9脚提供复位信号,两个22pf和24Mhz的晶振组成电路为单片机提供脉冲信号。按下SW1按键,单片机的12脚为低电平信号,当单片机的1脚为低电平信号时,由R6和PNP三极管组成的电路能够正常提供S3V的电源,给LCD5110液晶显示屏和MLX90615传感器提供电源信号。MLX90615 第 15 页 共 61 页 江苏理工学院毕业设计说明书(论文) 传感器将采集到的模拟信号经传感器内部放大、A/D之后,把模拟信号转换为数字信号,数字信号经传感器的1、3脚送至单片机的24、23脚,单片机再将传感器送来的信号经单片机的4,8脚送至LCD5110液晶显示屏的8,4脚并进行数值显示。当采集到的温度超过37?时,单片机的2脚为低电平,报警电路工作,LED显示灯D1亮。整个测量结束之后关闭K1开关,整个电路工作。 第 16 页 共 61 页 江苏理工学院毕业设计说明书(论文) 第4章 软件模块设计 本次设计的是基于单片机的非接触式体温计,秉承的是从局部到整体的设计方案,将复杂的问题简单化,将复杂的问题分别一一解决。本次设计采用KELL软件编程,接通电源单片机自动复位,程序进行工作,红外传感器进行红外测温,将测得的温度在液晶显示屏上显示采集到的数据。当采集到的温度大于所设置的温度值的时候则进行温度报警,LED显示灯亮则表示温度报警。主程序图如图4-1所示。 图4-1主程序流程图 第 17 页 共 61 页 江苏理工学院毕业设计说明书(论文) 4.1红外测温模块 4.1.1红外测温模块分析 MLX90615红外传感器的默认的地址为5BH,单片机能够通过从地址来访问MLX90615。MLX90615传感器的发送与接收数据都是以字节为单位,每当发送一个字节,系统做出判断,判断是否有回应,要是有回应则进行下一个字节,若是没有回应,重复的发送这个字节,一直到接收为止。MLX90615红外传感器与单片机通过SMBus进行数据传输。此时单片机为设备,MLX90615为从设备,主设备向从设备进行数据传输。MLX90615中有16个字长为16的存储单元,地址为0H,FH,6H和7H中分别储存了环境的温度和物体的温度,物体的温度可以通过T0=RAM×0.02-273.15来得出。 4.1.2软件程序 图4-3测温流程图。 图4-3 红外测温流程图 第 18 页 共 61 页 江苏理工学院毕业设计说明书(论文) 程序: #include "MLX90615.h" #include "intrins.h" #include "delay.h" #include "UART.h" #define _NOP() _nop_() // 5us void delay_Tbuf() { unsigned char a,b; for(b=1;b>0;b--) for(a=1;a>0;a--); } void delay_Thd() { //_nop_(); } void MLX90615_init(void) { mSDA_OUT; // Set SDA as Output mSCL_OUT; // Set SCL as Output mSDA_HIGH(); // bus free mSCL_HIGH(); } 第 19 页 共 61 页 江苏理工学院毕业设计说明书(论文) void START_bit(void) { mSDA_OUT; mSDA_HIGH(); // Set SDA line delay_Tbuf(); // Wait a few microseconds mSCL_HIGH(); // Set SCL line delay_Tbuf(); // Generate bus free time between Stop // and Start condition (Tbuf=4.7us min) mSDA_LOW(); // Clear SDA line delay_Tbuf(); // Hold time after (Repeated) Start // Condition. After this period, the first clock is generated. //(Thd:sta=4.0us min) mSCL_LOW(); // Clear SCL line delay_Tbuf(); // Wait a few microseconds } void STOP_bit(void) { mSDA_OUT; mSCL_LOW(); // Clear SCL line delay_Tbuf(); // Wait a few microseconds mSDA_LOW(); // Clear SDA line delay_Tbuf(); // Wait a few microseconds mSCL_HIGH(); // Set SCL line delay_Tbuf(); // Stop condition setup time(Tsu:sto=4.0us min) mSDA_HIGH(); // Set SDA line } unsigned char TX_byte(unsigned char Tx_buffer) 第 20 页 共 61 页 江苏理工学院毕业设计说明书(论文) { unsigned char Bit_counter; unsigned char Ack_bit; unsigned char bit_out; for(Bit_counter=8; Bit_counter; Bit_counter--) { if(Tx_buffer&0x80) bit_out=1; // If the current bit of Tx_buffer is 1 set bit_out else bit_out=0; // else clear bit_out send_bit(bit_out); // Send the current bit on SDA Tx_buffer<<=1; // Get next bit for checking } Ack_bit=Receive_bit(); // Get acknowledgment bit return Ack_bit; }// End of TX_bite() unsigned char RX_byte(unsigned char ack_nack) { unsigned char RX_buffer; unsigned char Bit_Counter; for(Bit_Counter=8; Bit_Counter; Bit_Counter--) { if(Receive_bit()) // Get a bit from the SDA line { 第 21 页 共 61 页 江苏理工学院毕业设计说明书(论文) RX_buffer <<= 1; // If the bit is HIGH save 1 in RX_buffer RX_buffer |=0x01; } else { RX_buffer <<= 1; // If the bit is LOW save 0 in RX_buffer RX_buffer &=0xfe; } } send_bit(ack_nack); // Sends acknowledgment bit return RX_buffer; } //--------------------------------------------------------------------------------------------- void send_bit(unsigned char bit_out) { mSDA_OUT; if(bit_out) mSDA_HIGH(); else mSDA_LOW(); delay_Thd(); // Tsu:dat = 250ns minimum mSCL_HIGH(); // Set SCL line delay_Tbuf(); // High Level of Clock Pulse------------------ 第 22 页 共 61 页 江苏理工学院毕业设计说明书(论文) mSCL_LOW(); // Clear SCL line delay_Tbuf(); // Low Level of Clock Pulse---------------------- // mSDA_HIGH(); // Master release SDA line , return; }//End of send_bit() //--------------------------------------------------------------------------------------------- unsigned char Receive_bit(void) { unsigned char Ack_bit; mSDA_IN; // SDA-input _NOP();_NOP();_NOP(); mSCL_HIGH(); // Set SCL line delay_Tbuf(); // High Level of Clock Pulse // if(P2Input(BIT2)) SDA=1; if(SDA) Ack_bit=1; // \ Read acknowledgment bit, save it in Ack_bit else Ack_bit=0; // / mSCL_LOW(); // Clear SCL line delay_Tbuf(); // Low Level of Clock Pulse return Ack_bit; }//End of Receive_bit unsigned int MemRead(unsigned char SlaveAddress,unsigned char command) { 第 23 页 共 61 页 江苏理工学院毕业设计说明书(论文) unsigned int tdata; // Data storage (DataH:DataL) unsigned char Pec; // PEC byte storage unsigned char DataL; // Low data byte storage unsigned char DataH; // High data byte storage unsigned char arr[6]; // Buffer for the sent bytes unsigned char PecReg; // Calculated PEC byte storage unsigned char ErrorCounter; // Defines the number of the attempts for communication with MLX90614 ErrorCounter=200; // Initialising of ErrorCounter do{ repeat: STOP_bit(); //If slave send NACK stop comunication --ErrorCounter; //Pre-decrement ErrorCounter if(!ErrorCounter){ //ErrorCounter=0? break; //Yes,go out from do-while{} } START_bit(); //Start condition if(TX_byte(SlaveAddress)){ //Send SlaveAddress goto repeat; //Repeat comunication again } if(TX_byte(command)){ //Send command goto repeat; //Repeat comunication again } START_bit(); //Repeated Start condition 第 24 页 共 61 页 江苏理工学院毕业设计说明书(论文) if(TX_byte(SlaveAddress)){ //Send SlaveAddress-------------------??? goto repeat; //Repeat comunication again } DataL=RX_byte(ACK); //Read low data,master must send ACK DataH=RX_byte(ACK); //Read high data,master must send ACK Pec=RX_byte(NACK); //Read PEC byte, master must send NACK STOP_bit(); //Stop condition arr[5]=SlaveAddress; // arr[4]=command; // arr[3]=SlaveAddress; //Load array arr arr[2]=DataL; // arr[1]=DataH; // arr[0]=0; // PecReg=PEC_calculation(arr);//Calculate CRC }while(PecReg != Pec); //If received and calculated CRC are equal go out from do-while{} *((unsigned char *)(&tdata))=DataH; // *((unsigned char *)(&tdata)+1)=DataL; //data=DataH:DataL return tdata; } unsigned char PEC_calculation(unsigned char pec[]) 第 25 页 共 61 页 江苏理工学院毕业设计说明书(论文) { unsigned char crc[6]; unsigned char BitPosition=47; unsigned char shift; unsigned char i; unsigned char j; unsigned char temp; do{ crc[5]=0; /* Load CRC value 0x000000000107 */ crc[4]=0; crc[3]=0; crc[2]=0; crc[1]=0x01; crc[0]=0x07; BitPosition=47; /* Set maximum bit position at 47 */ shift=0; //Find first 1 in the transmited message i=5; /* Set highest index */ j=0; while((pec[i]&(0x80>>j))==0 && i>0){ BitPosition--; if(j<7){ j++; } else{ j=0x00; i--; } 第 26 页 共 61 页 江苏理工学院毕业设计说明书(论文) }/*End of while */ shift=BitPosition-8; /*Get shift value for crc value*/ //Shift crc value while(shift){ for(i=5; i<0xFF; i--){ if((crc[i-1]&0x80) && (i>0)){ temp=1; } else{ temp=0; } crc[i]<<=1; crc[i]+=temp; }/*End of for*/ shift--; }/*End of while*/ //Exclusive OR between pec and crc for(i=0; i<=5; i++){ pec[i] ^=crc[i]; }/*End of for*/ }while(BitPosition>8);/*End of do-while*/ return pec[0]; }/*End of PEC_calculation*/ 第 27 页 共 61 页 江苏理工学院毕业设计说明书(论文) 4.2显示模块设计 4.2.1显示模块分析 本次设计采用的是LCD5110液晶显示屏进行数值的显示,单片机将接收到的数字信号进行内部处理之后送至LCD5110进行数值显示。LCD5110驱动指令如表4-1所示: 表4-1驱动指令 4.2.2软件程序: 图4-4软件程序流程图。 第 28 页 共 61 页 江苏理工学院毕业设计说明书(论文) 图4-4液晶显示流程图 程序: #include "LCD5110.h" #include "FontCode.h" #include "delay.h" /*--------------------------------------------------------------*/ //写入一个字节(数据或指令) //wbyte: 待写入的数据 //dat_cmd: 1-数据, 0-指令 void LCD_write_byte(unsigned char wbyte, unsigned char dat_cmd) { 第 29 页 共 61 页 江苏理工学院毕业设计说明书(论文) unsigned char i; LCD_CS = 0; //使能 LCD_DC = dat_cmd; //1-数据 //0-指令 for(i = 8; i; i--) //8位数据, 先高后低 { if(wbyte & 0x80) {LCD_DIN = 1;} else {LCD_DIN = 0;} LCD_CLK = 0; wbyte <<= 1; //移位(延时) LCD_CLK = 1; //上升沿写入 } LCD_CS = 1; //禁止 } /*--------------------------------------------------------------*/ //显示清屏(清DDRAM) void LCD_clr_scr(void) { unsigned int i; LCD_write_cmd(X_Col_Addr); LCD_write_cmd(Y_Page_Addr); for(i = 504; i; i--) LCD_write_dat(0x00); } 第 30 页 共 61 页 江苏理工学院毕业设计说明书(论文) /*--------------------------------------------------------------*/ //显示清行 //num: 0 - 5 void LCD_clr_row(unsigned char num) { unsigned char i; LCD_pos_byte(0, num); for(i = 84; i; i--) LCD_write_dat(0x00); } /*--------------------------------------------------------------*/ //液晶字节定位(1*1) //液晶规划: //x: 0 - 83 //y: 0 - 5 void LCD_pos_byte(unsigned char x, unsigned char y) { x |= X_Col_Addr; y |= Y_Page_Addr; LCD_write_cmd(x); //列地址 LCD_write_cmd(y); //页地址 } /*--------------------------------------------------------------*/ //液晶字符输出(6*8字体) //x: 0 - 13 //y: 0 - 5 void LCD_printc(unsigned char x, unsigned char y, unsigned char c_dat) 第 31 页 共 61 页 江苏理工学院毕业设计说明书(论文) { unsigned char i; c_dat -= 32; //查表 x *= 6; //宽6 LCD_pos_byte(x, y); //坐标 for(i = 0; i < 6; i++) LCD_write_dat(Font_code[c_dat][i]); } /*--------------------------------------------------------------*/ //液晶字符串输出(6*8字体) //x: 0 - 13 //y: 0 - 5 void LCD_prints(unsigned char x, unsigned char y, unsigned char *s_dat) { while(*s_dat && x < 14) {LCD_printc(x++, y, *s_dat); s_dat++;} } /*--------------------------------------------------------------*/ //液晶字符串输出,自动换行(6*8字体) //x: 0 - 13 //y: 0 - 5 void LCD_printsl(unsigned char x, unsigned char y, unsigned char *s_dat) { while(*s_dat) { LCD_printc(x++, y, *s_dat); s_dat++; if(x == 14) {x = 0; y++;} 第 32 页 共 61 页 江苏理工学院毕业设计说明书(论文) if(y == 6) {y = 0;} } } /*--------------------------------------------------------------*/ //初始化LCD5510 extern void LCD5510_Init(void) { LCD_RST = 0; delay_ms(10); LCD_RST = 1; //硬件复位 LCD_write_cmd(0x21); //工作模式, 水平寻址, 扩展指令 LCD_write_cmd(0x06); //VLCD温度系数2 LCD_write_cmd(0x13); //设置偏置系统(BSx) 1:48 LCD_write_cmd(0xA8); //设置电压VLCD = 3.06 + 0.06*Vop, 对比度调整 LCD_write_cmd(0x20); //工作模式, 水平寻址, 常规指令 LCD_write_cmd(0x0c); //普通模式 LCD_write_cmd(Y_Page_Addr); //起始页地址0 LCD_write_cmd(X_Col_Addr); //起始列地址0 LCD_clr_scr(); //清全屏 } /*--------------------------------------------------------------*/ 第 33 页 共 61 页 江苏理工学院毕业设计说明书(论文) 4.3报警模块设计 本次设计的设计理念就是问了测量人体的正常体温,并判断测得的温度是否超过人体正常的体温值,如果在人体正常的体温范围内不报警,不在人体的范围内,则进行报警。原理:人体正常测温,当温度在正常范围内,报警电路不工作LCD显示灯不亮;当温度超过37?时,报警电路工作LED显示灯亮。 第 34 页 共 61 页 江苏理工学院毕业设计说明书(论文) 第5章 系统软件的仿真与误差处理 5.1系统的仿真 Proteus软件是一款EDA软件,具有软件仿真功能和模拟硬件电路的功能,是一款目前使用最方便的仿真工具,相当的实用。双击Proteus 软件,打开该软件,点击主窗口界面上左端的Pick Devices按钮,在此界面中,,在左端一列元器件名中找到Microprocessor ICs点击这个元器件名,在右侧的方框中出现一系列的元器件,找到89C52单片机(用来替代STC89LE52单片机),找到这个元件之后,出现下图5-1所示的界面,再点击OK按钮,则将元器件添在Proteus主窗口界面上,那么单片机就画好了,可以用同样方法找到红外传感器、液晶显示屏、LED显示灯。 图5-1 Pick Devices窗口 第 35 页 共 61 页 江苏理工学院毕业设计说明书(论文) 将所有元器件找到之后都画在主窗口中,进行合理的布局并用连接线进行连接,连线完成之后最后添加电源和接地,将整个电路原理图完整的画完。电路原理图画完之后双击原理图中的单片机器件,选择对应的.HEX文件,将程序导入到单片机系统中,然后点击左下角的play按钮,模拟的系统开始运作,进行软件的监测。软件测试完整之后,点击主窗口中的File菜单,选择Save按钮进行保存从而生成.DSN文件。 5.2 Keil软件应用 Keil软件是一款对于程序进行编译处理的一款软件。具体操作步骤:双击打开Keil软件,则进入Keil的编辑界面,首先需要建立一个新的工程,选择project中的New project选项,选择需要保存的途径,创建一个工程文件名(文件名可随意的创建),文件名创建好之后,点击保存按钮,此时会弹出一个对话框,要求对所需的单片机进行选择,在本次的设计中用STC89C52单片机来替代STC89LE52单片机,在对话框中找到STC89C52单片机,然后点击确定按钮,则会出现下图5-2所示的对话框。 图5-2 单片机选择 第 36 页 共 61 页 江苏理工学院毕业设计说明书(论文) 然后进行写程序的铺垫,点击File然后点击New选项,会出现一个Text的空文本,继续点击File中的Save as选项,进行文件的保存,注意此时的扩展名必须为.c,完成之后点击保存按钮,则出现下图5-3所示的对话框。 图5-3 保存对话框 前面的保存完成之后,会出现新的对话框,在左边会有一个对话框中有一个Target文件夹,在这个文件夹的前面有个“+”,用鼠标点击那个“+”号会出来一个新的文件夹叫Source Group 1,右击这个文件夹,点击其中的Aid Files to Group‘Source Group 1’出现新的对话框,如图5-4所示。 第 37 页 共 61 页 江苏理工学院毕业设计说明书(论文) 图5-4 Source Group 1 对话框 选择Text.c,然后点击Add键则出现新的对话框,在此对话框中就可以进行软件程序的编写。如图5-5所示。 图5-5 程序对话框 当整个程序书写完成之后,点击project菜单中的Built Target选项,实现编译,然后点击project菜单中的Start/Stop Debug Session选项,进行执行功能。如果发现编译的时候存在错误,只要在对话框中的下面找到错误的地方,立刻进行改正,重新进行编译执行就可以了。以上就是整个Keil软件的使用过程,在简单的文字表述中,能够正确的认识和理解Keil软件,并且熟练的运用也是需要一定的时间的,本次设计就是利用这一软件进行软件编程的,ptotues软件进行硬件的原理图的模拟,两个非常具有使用性的软件相互很好的结合从而完成此次的设计。 5.3系统误差处理 红外体温计进行测温与其他的测温相比较起来,有一定的条件,传统的体温计是直接和人体接触测得人体体温,而红外体温计则是不是通过和人体接触测得的,存在环境温度的影响,所以进行人体测温时应将体温计放在环境中,满足环境温度的条件,才可以使用。以上只是环境对测体温的影响,对于人体而言,不 第 38 页 共 61 页 江苏理工学院毕业设计说明书(论文) 同时候测得的体温也是会有偏差的,一般人体早上的体温比其他时刻的温度低,在测量人体体温的时候也需要选择合适的时间来测量,这样测得的体温值比较准确。 通过非接触式的方法测量体温,测量距离也是很重要的一个影响因素,当传感器离测得物体之间的距离越大,测量的结果误差比较到,大大影响了测量的精度,下面就是对于不同距离的时候测得的人体的体温,并分析其精度。 采用水银体温计测得的人体体温是36.8?,本次设计所设计的体温计测出的体温是36.4?,两者相比较: ,,,CXX0 (5-1) 计算分析: ,,,,,C36.436.80.4 (5-2) 精度计算公式: C,,100% ,, (5-3) X0 计算分析: ,0.4, ,,,,100%1.08% (5-4) 36.8 ,1.08%经计算分析本次设计的体温计测温误差为。 第 39 页 共 61 页 江苏理工学院毕业设计说明书(论文) 总结 本次设计的是基于单片机的非接触式体温计,运用到的是红外传感的原理,基本的组成是STC89CLE52单片机、MLX90615红外传感器、LCD5110液晶显示屏、LED报警灯,通过从局部到整体的设计思想,显得整个设计更加合理和准确。在这次的设计中采用的元件都是在以前的课程设计中没有用到过的元器件,所以在做这个设计的时候对每一个器件进行了整体的分析研究,对软件和硬件的部分进行了更加深的研究,两者相互有效的结合,达到理想的结果。通过Proteus绘图软件进行硬件电路的绘制,用Keil软件进行程序的编译,两个软件相互结合完成整个仿真的过程。经过毕业设计让我更加的熟悉Proteus和Keil软件,更加完善了自己,让我更加的认识自己的不足,但是同时也提高了自己的独立性,和解决问题的能力性。让我更加的知道了书本上的知识知识起到辅助的作用,最主要的还是要靠自己的学习,在理论的基础上加上实践的操作才能整个设计任务,这个的经历让我今后的工作打下了基础,更加的锻炼了自己,提升自己。 本设计只能正常的测量人体的体温并进行报警功能,在现在的情况下还是存在很大的问题,使用性不高,而且对于一些年龄大的些的老人来说无法正常的使用,因此在现有的基础上还是得不断的提高不断的完善,尽量能够让设计的产品能够更加的符合实用性。在以后的生活和工作中,还是需要不断的充实自己,不断的提高自己,掌握更多的技能,有助于帮助自己在以后的设计中能够有更大的设计空间,设计的产品更加的完善。 第 40 页 共 61 页 江苏理工学院毕业设计说明书(论文) 参考文献 [1]周书栓.红外辐射测量基础[M].上海:上海交通大学出版社,1991. [2]刘君华.现代检测技术与测试系统设计[M].西安:西安交通大学出版社,1999. [3]皮红梅,李英顺.单片机开发中的定时方法[J].辽阳石油化工高等专科学校学 报,2002,18(4):33-34 [4]韩芝侠,淡涛,黄庆华等.热释电红外传感器的应用[J].陕西工学院学报(自然 科学版),2003,19(3):39-41 [5]戴义保.高精密温度测量的研究与实现[J].上海:自动化仪表, 2003,24(3):24-27 [6]沈国彦,宋平.红外温度计测量体温方法探讨[J].仪表技术, 2003,10(3):21-23 [7]陈杰,黄鸿.传感器与检测技术[M].北京:北京高等教育出版社,2004. [8]苏波,黄新.基于多红外传感器的智能温度测试装置设计[J].传感器与微系 统,2012,31(12):117-11 [9]郁有文.传感器原理及工程应用[M].西安:西安电子科技大学出版社,2013 [10]史永基,武新,邹红文等.液晶红外传感器系统[J].激光杂 志,1999,20(1):23-25 [11]欧星,周凌宏,曾斯坚等.一种用于激光治疗仪的红外传感器温度检测和报警 装置[J].医疗卫生装备,2010,31(8):37-38 [12]刘加峰,石宏理,李海云等.基于HMS红外传感器的体温测量仪设计[J].医疗 卫生装备,2011,32(7):11-13 [13]Mark1.Montrose.PRINTED Circuit Board Design Techniques for EMC compliance[J].IEE Press series.2000. [14]Meehan Joanne,Muir Lindsey.SCM in Merseyside SMEs:Benefits and barriers[J].TQM Journal.2008(1):40. 第 41 页 共 61 页 江苏理工学院毕业设计说明书(论文) 致 谢 为期几个月的毕业设计终于完成了,在完成的时刻,心情异常的复杂。设计的过程中指导老师给了很大的帮助,由于有了老师的帮助,才能够让我的毕业设计成功的成功。现在在自己能力有限的情况下基本能够实现所需的要求,不过还是存在很大的不足,出现的问题还是挺多的,但是还是进过自己的努力一步一步的改进,尽量的弥补不足。在设计的过程中,还是得感谢指导老师和帮助过我的一些同学们,在他们的帮助下,我才能够一步一步的坚持下来,克服一个又一个问题,从而完成这个设计。 我要对我的指导老师致以感谢。在我遇到问题的时候,老师总是细心的帮我分析问题,帮我认识到设计中的不足,让我不断的提升自己,也提升自己的设计,让设计的产品更具有实用性。黄老师从课题的制定直到设计的完成都帮助着我们,只要我们有问题,他总会第一时刻帮我们解决,我们在他的帮助下一个一个的完成着自己的任务,大家都非常的信任老师,以至于都非常的感谢老师。在这,我对黄老师致以无法言喻的感谢之情。不仅是老师,同学也给了我很大的帮助,在他们的帮助下,找到设计所需要的一系列的资料,帮助我更好的完成设计任务,所以在这,我想他们表达我真诚的感谢。 论文即将完成,接下来就是论文的答辩,刚刚开始做毕业设计的时候感觉还是挺远的,可是现在论文都要写好了,心里有种波动,在这过程中,经历过很多的挫折,但是在大家的帮助下,还是一步一步的完成坚持下来,还是很激动的,这次的经历给我留下很深的印象,对此,再次的感谢那些帮助给我的老师和朋友,非常的感谢! 第 42 页 共 61 页 江苏理工学院毕业设计说明书(论文) 附 录 附录A 硬件原理图 第 43 页 共 61 页 江苏理工学院毕业设计说明书(论文) 附录B 主程序: #include "LCD5110.h" #include "reg52.h" #include "MLX90615.h" #include "delay.h" #include "stdio.h" sbit KEY=P3^2; // 定义按键 sbit PWOER=P1^0; sbit LED=P1^1; unsigned char s[20]; // 待显示的字符串 float temp; // 温度值 unsigned char i; void main() { unsigned char RunStatus=0; // 是否测量标志 unsigned char SlaveAddress; // Contains device address unsigned char command; // Contains the access command unsigned int tdata; // Contains data value SlaveAddress=SA<<1; // Set device address command=RAM_Access|RAM_To; // Form RAM access command + RAM address RunStatus = 0; 第 44 页 共 61 页 江苏理工学院毕业设计说明书(论文) while(1) { if(!KEY) { delay_ms(20); if(!KEY) { RunStatus=1; while(!KEY); } } if(RunStatus) { PWOER=0; delay_ms(20); MLX90615_init(); LCD5510_Init(); for(i=0;i<14;i++) { tdata=MemRead(SlaveAddress,command); //Read memory temp = ((float)tdata*0.02-273.15)*1.088; sprintf(s,"%.1f C",temp); LCD_clr_scr(); LCD_prints(2,0,"Measuring"); LCD_prints(3,2,s); if(temp>37.0) { LED=0; LCD_prints(2,4,"Abnormal"); 第 45 页 共 61 页 江苏理工学院毕业设计说明书(论文) } else { LED=1; LCD_prints(2,4," Normal "); } delay_ms(500); } PWOER=1; RunStatus=0; } } } #include "MLX90615.h" #include "intrins.h" #include "delay.h" #include "UART.h" #define _NOP() _nop_() // 5us void delay_Tbuf() { unsigned char a,b; for(b=1;b>0;b--) for(a=1;a>0;a--); } 第 46 页 共 61 页 江苏理工学院毕业设计说明书(论文) void delay_Thd() { //_nop_(); } void MLX90615_init(void) { mSDA_OUT; // Set SDA as Output mSCL_OUT; // Set SCL as Output mSDA_HIGH(); // bus free mSCL_HIGH(); } void START_bit(void) { mSDA_OUT; mSDA_HIGH(); // Set SDA line delay_Tbuf(); // Wait a few microseconds mSCL_HIGH(); // Set SCL line delay_Tbuf(); // Generate bus free time between Stop // and Start condition (Tbuf=4.7us min) mSDA_LOW(); // Clear SDA line delay_Tbuf(); // Hold time after (Repeated) Start // Condition. After this period, the first clock is generated. //(Thd:sta=4.0us min) mSCL_LOW(); // Clear SCL line delay_Tbuf(); // Wait a few microseconds } 第 47 页 共 61 页 江苏理工学院毕业设计说明书(论文) void STOP_bit(void) { mSDA_OUT; mSCL_LOW(); // Clear SCL line delay_Tbuf(); // Wait a few microseconds mSDA_LOW(); // Clear SDA line delay_Tbuf(); // Wait a few microseconds mSCL_HIGH(); // Set SCL line delay_Tbuf(); // Stop condition setup time(Tsu:sto=4.0us min) mSDA_HIGH(); // Set SDA line } unsigned char TX_byte(unsigned char Tx_buffer) { unsigned char Bit_counter; unsigned char Ack_bit; unsigned char bit_out; for(Bit_counter=8; Bit_counter; Bit_counter--) { if(Tx_buffer&0x80) bit_out=1; // If the current bit of Tx_buffer is 1 set bit_out else bit_out=0; // else clear bit_out send_bit(bit_out); // Send the current bit on SDA Tx_buffer<<=1; // Get next bit for checking } Ack_bit=Receive_bit(); // Get acknowledgment bit 第 48 页 共 61 页 江苏理工学院毕业设计说明书(论文) return Ack_bit; }// End of TX_bite() unsigned char RX_byte(unsigned char ack_nack) { unsigned char RX_buffer; unsigned char Bit_Counter; for(Bit_Counter=8; Bit_Counter; Bit_Counter--) { if(Receive_bit()) // Get a bit from the SDA line { RX_buffer <<= 1; // If the bit is HIGH save 1 in RX_buffer RX_buffer |=0x01; } else { RX_buffer <<= 1; // If the bit is LOW save 0 in RX_buffer RX_buffer &=0xfe; } } send_bit(ack_nack); // Sends acknowledgment bit return RX_buffer; } 第 49 页 共 61 页 江苏理工学院毕业设计说明书(论文) //--------------------------------------------------------------------------------------------- void send_bit(unsigned char bit_out) { mSDA_OUT; if(bit_out) mSDA_HIGH(); else mSDA_LOW(); delay_Thd(); // Tsu:dat = 250ns minimum mSCL_HIGH(); // Set SCL line delay_Tbuf(); // High Level of Clock Pulse------------------ mSCL_LOW(); // Clear SCL line delay_Tbuf(); // Low Level of Clock Pulse---------------------- // mSDA_HIGH(); // Master release SDA line , return; }//End of send_bit() //--------------------------------------------------------------------------------------------- unsigned char Receive_bit(void) { unsigned char Ack_bit; mSDA_IN; // SDA-input _NOP();_NOP();_NOP(); mSCL_HIGH(); // Set SCL line delay_Tbuf(); // High Level of Clock Pulse // if(P2Input(BIT2)) 第 50 页 共 61 页 江苏理工学院毕业设计说明书(论文) SDA=1; if(SDA) Ack_bit=1; // \ Read acknowledgment bit, save it in Ack_bit else Ack_bit=0; // / mSCL_LOW(); // Clear SCL line delay_Tbuf(); // Low Level of Clock Pulse return Ack_bit; }//End of Receive_bit unsigned int MemRead(unsigned char SlaveAddress,unsigned char command) { unsigned int tdata; // Data storage (DataH:DataL) unsigned char Pec; // PEC byte storage unsigned char DataL; // Low data byte storage unsigned char DataH; // High data byte storage unsigned char arr[6]; // Buffer for the sent bytes unsigned char PecReg; // Calculated PEC byte storage unsigned char ErrorCounter; // Defines the number of the attempts for communication with MLX90614 ErrorCounter=200; // Initialising of ErrorCounter do{ repeat: STOP_bit(); //If slave send NACK stop comunication --ErrorCounter; //Pre-decrement ErrorCounter if(!ErrorCounter){ //ErrorCounter=0? 第 51 页 共 61 页 江苏理工学院毕业设计说明书(论文) break; //Yes,go out from do-while{} } START_bit(); //Start condition if(TX_byte(SlaveAddress)){ //Send SlaveAddress goto repeat; //Repeat comunication again } if(TX_byte(command)){ //Send command goto repeat; //Repeat comunication again } START_bit(); //Repeated Start condition if(TX_byte(SlaveAddress)){ //Send SlaveAddress-------------------??? goto repeat; //Repeat comunication again } DataL=RX_byte(ACK); //Read low data,master must send ACK DataH=RX_byte(ACK); //Read high data,master must send ACK Pec=RX_byte(NACK); //Read PEC byte, master must send NACK STOP_bit(); //Stop condition arr[5]=SlaveAddress; // arr[4]=command; // arr[3]=SlaveAddress; //Load array arr arr[2]=DataL; // arr[1]=DataH; // 第 52 页 共 61 页 江苏理工学院毕业设计说明书(论文) arr[0]=0; // PecReg=PEC_calculation(arr);//Calculate CRC }while(PecReg != Pec); //If received and calculated CRC are equal go out from do-while{} *((unsigned char *)(&tdata))=DataH; // *((unsigned char *)(&tdata)+1)=DataL; //data=DataH:DataL return tdata; } unsigned char PEC_calculation(unsigned char pec[]) { unsigned char crc[6]; unsigned char BitPosition=47; unsigned char shift; unsigned char i; unsigned char j; unsigned char temp; do{ crc[5]=0; /* Load CRC value 0x000000000107 */ crc[4]=0; crc[3]=0; crc[2]=0; crc[1]=0x01; crc[0]=0x07; BitPosition=47; /* Set maximum bit position at 47 */ shift=0; 第 53 页 共 61 页 江苏理工学院毕业设计说明书(论文) //Find first 1 in the transmited message i=5; /* Set highest index */ j=0; while((pec[i]&(0x80>>j))==0 && i>0){ BitPosition--; if(j<7){ j++; } else{ j=0x00; i--; } }/*End of while */ shift=BitPosition-8; /*Get shift value for crc value*/ //Shift crc value while(shift){ for(i=5; i<0xFF; i--){ if((crc[i-1]&0x80) && (i>0)){ temp=1; } else{ temp=0; } crc[i]<<=1; crc[i]+=temp; }/*End of for*/ 第 54 页 共 61 页 江苏理工学院毕业设计说明书(论文) shift--; }/*End of while*/ //Exclusive OR between pec and crc for(i=0; i<=5; i++){ pec[i] ^=crc[i]; }/*End of for*/ }while(BitPosition>8);/*End of do-while*/ return pec[0]; }/*End of PEC_calculation*/ #include "LCD5110.h" #include "FontCode.h" #include "delay.h" /*--------------------------------------------------------------*/ //写入一个字节(数据或指令) //wbyte: 待写入的数据 //dat_cmd: 1-数据, 0-指令 void LCD_write_byte(unsigned char wbyte, unsigned char dat_cmd) { unsigned char i; LCD_CS = 0; //使能 LCD_DC = dat_cmd; //1-数据 //0-指令 for(i = 8; i; i--) //8位数据, 先高后低 { if(wbyte & 0x80) {LCD_DIN = 1;} 第 55 页 共 61 页 江苏理工学院毕业设计说明书(论文) else {LCD_DIN = 0;} LCD_CLK = 0; wbyte <<= 1; //移位(延时) LCD_CLK = 1; //上升沿写入 } LCD_CS = 1; //禁止 } /*--------------------------------------------------------------*/ //显示清屏(清DDRAM) void LCD_clr_scr(void) { unsigned int i; LCD_write_cmd(X_Col_Addr); LCD_write_cmd(Y_Page_Addr); for(i = 504; i; i--) LCD_write_dat(0x00); } /*--------------------------------------------------------------*/ //显示清行 //num: 0 - 5 void LCD_clr_row(unsigned char num) { unsigned char i; 第 56 页 共 61 页 江苏理工学院毕业设计说明书(论文) LCD_pos_byte(0, num); for(i = 84; i; i--) LCD_write_dat(0x00); } /*--------------------------------------------------------------*/ //液晶字节定位(1*1) //液晶规划: //x: 0 - 83 //y: 0 - 5 void LCD_pos_byte(unsigned char x, unsigned char y) { x |= X_Col_Addr; y |= Y_Page_Addr; LCD_write_cmd(x); //列地址 LCD_write_cmd(y); //页地址 } /*--------------------------------------------------------------*/ //液晶字符输出(6*8字体) //x: 0 - 13 //y: 0 - 5 void LCD_printc(unsigned char x, unsigned char y, unsigned char c_dat) { unsigned char i; c_dat -= 32; //查表 x *= 6; //宽6 LCD_pos_byte(x, y); //坐标 for(i = 0; i < 6; i++) LCD_write_dat(Font_code[c_dat][i]); 第 57 页 共 61 页 江苏理工学院毕业设计说明书(论文) } /*--------------------------------------------------------------*/ //液晶字符串输出(6*8字体) //x: 0 - 13 //y: 0 - 5 void LCD_prints(unsigned char x, unsigned char y, unsigned char *s_dat) { while(*s_dat && x < 14) {LCD_printc(x++, y, *s_dat); s_dat++;} } /*--------------------------------------------------------------*/ //液晶字符串输出,自动换行(6*8字体) //x: 0 - 13 //y: 0 - 5 void LCD_printsl(unsigned char x, unsigned char y, unsigned char *s_dat) { while(*s_dat) { LCD_printc(x++, y, *s_dat); s_dat++; if(x == 14) {x = 0; y++;} if(y == 6) {y = 0;} } } /*--------------------------------------------------------------*/ //初始化LCD5510 extern void LCD5510_Init(void) 第 58 页 共 61 页 江苏理工学院毕业设计说明书(论文) { LCD_RST = 0; delay_ms(10); LCD_RST = 1; //硬件复位 LCD_write_cmd(0x21); //工作模式, 水平寻址, 扩展指令 LCD_write_cmd(0x06); //VLCD温度系数2 LCD_write_cmd(0x13); //设置偏置系统(BSx) 1:48 LCD_write_cmd(0xA8); //设置电压VLCD = 3.06 + 0.06*Vop, 对比度调整 LCD_write_cmd(0x20); //工作模式, 水平寻址, 常规指令 LCD_write_cmd(0x0c); //普通模式 LCD_write_cmd(Y_Page_Addr); //起始页地址0 LCD_write_cmd(X_Col_Addr); //起始列地址0 LCD_clr_scr(); //清全屏 } /*--------------------------------------------------------------*/ #include "delay.h" #include "intrins.h" void delay_ms(unsigned int n) { unsigned char a,b; while(n--) { for(b=133;b>0;b--) for(a=6;a>0;a--); } 第 59 页 共 61 页 江苏理工学院毕业设计说明书(论文) } #include "UART.h" void UART1_init(void) { SCON=0x50; TMOD|=0x20; TMOD&=0x2F; TH1=0xFA; TL1=0xFA; //9600 TR1=1; ES=1; } void UART1_Send_Byte(unsigned char ddata) { SBUF = ddata; //写入要发送的字符 while(!TI); //等待发送完毕 TI = 0; //清发送标志 } void UART1_Send_String(unsigned char *str) { while(*str!='\0') { UART1_Send_Byte(*str++); } } 第 60 页 共 61 页 江苏理工学院毕业设计说明书(论文) 附录C元器件清单: 元器件名 型号 个数 单片机 STC89LE52 1 传感器 MLX90615 1 液晶显示 LCD5110 1 电阻 10K 1 电阻 4.7K 3 电阻 1K 2 电容 0.1uF 2 电容 22p 2 节电池 3V 1 晶振 22K 1 排阻 10K*8 1 三极管 S9012 1 液晶插座 1 按钮 1 推动开关 1 LED显示灯 2 第 61 页 共 61 页
/
本文档为【红外体温计的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索