• 683.50 KB
  • 2022-04-22 11:22:17 发布

数字式温湿度传感器的应用设计毕业设计.doc

  • 61页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'本科毕业设计数字式温湿度传感器的应用设计系别专业班级学生姓名指导教师提交日期V 摘要本文介绍了基于单片机系统的数字式温湿度传感器在社会生产和生活中的应用。随着社会发展的日新月异,传感器在人们的生产和生活中的运用也越来越广泛。由于许多场合需要同时使用温度传感器和湿度传感器,因此,作为复合传感器的数字式温湿度传感器被广泛运用于各个领域和行业。本设计主要介绍以AT89C52单片机和SHT71温湿度传感器为基础所组成的系统,实现对温湿度的测量,并且通过制冷片的使用实现对温度的控制,完成各个部件的电路搭设,以及对各组成部分的编程工作。本设计使用了键盘控制和LED数码管显示,体现对应的测控系统的设计方法和手段。针对许多场合都要求对温湿度的控制,本设计以使用制冷片实现对温度的控制为例,体现控制系统的设计方法及应用。软件部分采用的并不是传统的汇编语言编程,而是较为容易和快捷的C语言完成软件编程。关键词:单片机系统,数字式温湿度传感器,AT89C52,SHT71.V AbstractThesubjectofthisarticleistheapplicationofsingle-chipmicrocomputerinproductionandpeople’sdailylife.Asthequickdevelopmentofoursociety,Sensorplaysamoreandmoreimportantroleinourdailylife.AstemperaturesensorandHumiditysensorarebothrequiredonmanyoccasions,Humidity&TemperatureSensor,asacompoundsensor,arenowbeingusedinvariousfieldsandindustries.ThedesignismainlyfocusedonintroductionofthesystemwhichisbasedonAT89C52single-chipmicrocomputerandSHT71Humidity&TemperatureSensor.Thesystemcouldmeasurethetemperatureandhumidity,controltemperaturebytheusageoffilmcooling,finishtheelectriccircuitconnectionandtheprogrammingofeachcomponent.ThedesignmakesadvantageofkeyboardcontrolandLEDdigitalpipetoshowit.Atthesametime,itreflectsthedesignmethodandmeansofrelativecontrolsystem.Tosatisfytheneedforcontrollingtemperatureandhumidity,thedesignusesfilmcoolingtocompleteit,meanwhile,thedesignmethodofthecontrollingsystemanditsapplicationcanbeembodied.Asforthesoftwarepart,itdoesn’tusethetraditionalcompilationlanguageprogramming,butuseCLanguagetofinishthesoftwareprogramming,whichismucheasierandquicker.Keyword:single-chipmicrocomputer,HumidityandTemperatureSensor,AT89C52,SHT71.V 目录摘要IAbstractII目录III第一章绪论11.1选题的背景和意义11.2本设计的内容与任务2第二章单片机的选型32.1单片机系统32.1.1MCS-51单片机32.1.2MCS-51单片机特点、功能简介32.1.3扩展部分42.2AT89C52单片机特点、功能介绍5第三章温湿度传感器73.1传感器的作用和前景73.1.1传感器的作用73.1.2传感器技术的发展前景73.2温湿度传感器83.3温湿度一体化传感器83.4SHT71温湿度传感器93.4.1SHT71简介93.4.2SHT71的性能指标93.4.3SHT71接口说明103.4.4SHT71与微控制器数据通讯的校验方法11第四章硬件设计134.1硬件设计系统框图134.2稳压电源134.3单片机与SHT71传感器的接口设计144.3.1SHT71的引脚和内部构成144.3.2SHT71与微处理器的接口设计154.3.3AT89C52单片机与SHT71传感器的接口设计164.3.4时钟电路174.3.5复位电路184.4单片机键盘和显示部分194.4.1键盘部分194.4.2单片机显示部分204.5单片机控制接口部分224.5.1报警灯和蜂鸣器224.5.2制冷片23第五章软件设计275.1SHT71传感器的控制27V 5.1.1SHT71传感器的基本工作原理275.1.2SHT71传感器数据测量过程275.1.3数据处理295.2扩展模块315.2.1键盘控制315.2.2LED数码管显示335.3控制部分34结束语36参考文献37附录I38附录II52致谢55V 第一章绪论第一章绪论1.1选题的背景和意义随着人类社会的进步和科技的发展,对自动化的要求也越来越高。在生产和生活中对于温湿度的控制要求也越来越严格。由于温度与湿度不管是从物理量本身还是在实际人们的生活中都有着密切的关系,所以温湿度一体的传感器就会相应产生。温湿度传感器是指能将温度量和湿度量转换成容易被测量处理的电信号的设备或装置。市场上的温湿度传感器一般是测量温度量和相对湿度量。市场上常见的温度,湿度传感器以电压输出为主要表现形式,温度湿度与所表现出来的电压信号呈非线性的关系,且因为材料本身的差异,不同的传感器其非线性曲线也各不相同,缺乏一个产品应具备的通用性和互换性。实际中的应用的温湿度传感器要具备以下特点:1、敏感材料的特性随温湿度的变化有较大的变化,而且该变化易于测量;2、材料对温湿度的变化有较好一一对应关系,即对除温湿度外其它物理量的变化不敏感。3、性能误差及老化小,重复性好,尺寸小;4、有较强的耐机械、化学及热作用等特点;5、与被检测的温湿度范围和精度相适应。温湿度的测量在仓储管理、工业生产制造、智能化建筑、科学研究及日常生活中被广泛应用,传统的模拟式湿度传感器需设计信号调理电路并需要经过复杂的校准、标定过程,测量精度难以得到保证,且在线性度、重复性、互换性、一致性等方面往往不尽人意。SHT71是瑞士Sensirion公司推出的基于CMOSns技术的新型温湿度传感器。该传感器将CMOS芯片技术与传感器技术结合起来,发挥出强大的优势互补作用。SHT71智能化数字传感器内部集成了相对湿度传感器、温度传感器、放大器、14位A/D转换器、校准存储器(E2PROM)、随机存取存储器(RAM)、状态寄存器、循环冗余校验码(CRC)寄存器、二线串行接口、控制单元、加热器及低电压检测电路。这样就免去了传感器外围电路,保证了高可靠性和高稳定性,提高了看干扰能力。而且不需要经过复杂的校准、标定过程,测量精度得到保证,且在线性度、重复性、互换性、一致性等方面都不错。在未来的大型温湿测控系统中将得到广泛的应用。55 第一章绪论1.2本设计的内容与任务目前温湿度传感器大多使用传统的模拟式传感器,传统的模拟式湿度传感器一般不仅要设计信号调理电路,还要经过复杂的校准和标定过程,其测量精度难以保证。而数字式传感器由于具有强抗干扰性,高可靠性和便于计算机接口等特点,已经被越来越广泛的应用。比较多人使用的是瑞士HOPEMICROELECTRONICS公司生产的FOST02/FOST02A温湿度传感器和瑞士SENSIRION公司的SHT7X/SHT1X系列温湿度传感器单片机方面主要是由51系列单片机和AVR单片机多让人们采用。本设计是利用SHT71传感器设计出一个可用到环境监测和控制的温湿度的控系统。利用SHT71温湿度传感器对环境温度和湿度进行采集和处理,从而实现对环境温湿度的实时检测和控制。本设计主要由SHT71温湿度传感器、AT89C52单片机、命令键盘、显示模块和控制模块组成。主要任务是完成上述各个部分的电路搭设以及程序编写。55 第二章单片机的选型第二章单片机的选型2.1单片机系统单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。目前多为使用的是AVR单片机和51单片机,两者相对而言,51单片机技术发展成熟,一直以来都有很多采用,大众对51单片机更为熟悉。而近年来越来越多人选用AVR单片机,其原因是AVR单片机的性能更好,而且C语言编程方面比51单片机更容易。由于我本人所熟悉的是51单片机,所以本设计选用的是51单片机,下面就介绍一下51单片机的性能和特点。2.1.1MCS-51单片机51单片机是对目前所有兼容Intel8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。当前常用的51系列单片机主要产品有:  Intel的:80C31、80C51、87C51,80C32、80C52、87C52等;  ATMEL的:89C51、89C52、89C2051等;  Philips、华邦、Dallas、Siemens(Infineon)等公司的许多产品2.1.2MCS-51单片机特点、功能简介MCS-51系列单片机是Intel公司1980年推出的高性能的8位单片机,MCS-51的典型产品为8051.与8048系列相比,MCS-51系列单片机无论是在片内RAM/ROM容量、I/O功能、种类和数量,还是在系统扩展能力方面都有很大的加强。55 第二章单片机的选型MCS-51系列单片机采用模块化实际,各种类型的单片机都是在8051(基本型)的基础上通过增、减部件的方式获得的。8051是片内ROM型单片机,内部具有4KB掩膜ROM。在此基础上将掩膜ROM模块换成EPROM模块衍生出了8751(EPROM型),去除掩膜ROM模块衍生出了8031(无ROM型)。上面三种类型称为MCS-51系列中的51子系列。MCS-51的存储器MCS-51单片机的存储器机构与常规的微型计算机的配置不同,它把程序存储器和数据存储器分开,各有自己的寻址系统、控制信号和功能。系统的存储器用来存放程序和始终保留的常数,数据存储器常用来存放程序运行中所需的常数或变量。MCS-51的存储器除了有程序存储器ROM和数据存储器RAM之分外,还有片内和片外之分。片内存储器集成在芯片内部,是MCS-51的主要组成部分;片外存储器是外接的专用存储芯片,MCS-51只提供地址和控制命令,需要通过印刷电路板上的三总线才能联机工作。(2)I/O接口现在的单片机系列中普遍都有多种I/O口的型号,在I/O口的使用应从其功能和驱动能力上加以考虑,对于仅需增加少量的I/O口,最好是选用廉价的TTL或CMOS电路扩展,这样可提高单片机口线的利用率。对于需扩展更多的I/O口,则可选用标准的I/O口扩展芯片8155、8255和8279等芯片,这些芯片的接口电路简单,编程比较方便,使用相对灵活,而且价格适中。[5]2.1.3扩展部分MCS-51系列单片机具有较强的功能,其芯片内部集成了计算机的基本功能部件,如CPU、RAM、程序存储器、并行和串行I/O口以及定时/计时器等等。使用非常方便。通常情况下,对于小型的控制系统及检测系统,利用一片单片机就足够。但是在许多情况下,对于一些特殊要求的应用系统,要考虑到传感器、伺候控制接口以及人机对话接口等的需要,最小应用系统常常不能满足要求。往往还需要扩展一些外围芯片,以补充片内硬件资源的不足。系统扩展是单片机应用系统硬件设计中最常遇到的问题。系统扩展就是实现相应芯片的接口和编程。MCS-51系统扩展有程序存储器(ROM)扩展、数据存储器(RAM)扩展、I/O口扩展、中断系统扩展以及其他特殊功能扩展。(1)键盘部分本设计需要通过键盘控制来实现对量的控制。键盘是十分重要的人机对话的组成部分,是人向机器发出指令、输入信息的必需设备。55 第二章单片机的选型键盘分编码和非编码键盘。键盘上闭合键的识别由专用的硬件译码器实现并产生键编号或键值的称为编码键盘,如BCD码键盘,ASCII码键盘等;靠软件识别的称为非编码键盘。(a)独立式键盘每一个按键的电路是独立的,占用一条数据线。这种键盘占用硬件资源多,适合少量按键的情况。独立式按键接口有中断方式的独立式按键工作状态和查询方式的独立式按键工作状态,都是按键直接与微处理器连接,通过读I/O口,判定个I/O口的电平状态,即可识别按下的按键。(b)矩阵式键盘相对于独立式键盘而言,矩阵式键盘的应用可节省I/O端口。矩阵式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上。一个3*3的行、列结构可以构成一个由9个按键的键盘。同理一个4*4的行、列可以构成一个含有16个按键的键盘等等。很明显,在按键数量较多的场合,矩阵键盘与独立按键键盘相比,要节省很多的I/O口。矩阵键盘的按键设置在行、列线的交点上,行、列线分别连接到按键开关的两端。列线通过上拉电阻接到+5V。 平时无按键动作时,列线处于高电平状态,而当由按键按下时,列线电平状态将由与此列线相连的行线电平决定。行线电平如果为低,则列线电平为低;行线电平如果为高,则列线电平亦为高。这一点是识别矩阵键盘按键是否被按下的关键所在。该电路中还有一个与门,这个与门用来产生中断信号,当键盘中没有键按下时,所有行线的输出都应为低电平,以区别于列线状态,当矩阵键盘中任何一只键按下时,与门输出由高电平变为低电平,向CPU申请中断,由于矩阵键盘中行、列线为多键共用,各按键均影响该键所在行和列的电平。因此各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。[3]2.2AT89C52单片机特点、功能介绍AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元。55 第二章单片机的选型图2-1AT89C52的引脚结构AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。AT89C52提供以下标准功能:8K字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两极中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。[8]AT89C52作为51单片机的一个经典款型,使用面很广,许多设计都采用这款单片机。本设计采用AT89C52,从性能上考虑,AT89C52的技术成熟,稳定性好。而且存储器容量足够满足本设计要求。还有一点就是价格低廉。55 第三章温湿度传感器第三章温湿度传感器3.1传感器的作用和前景人们通常将能把被测物理量或化学量转化为与之有确定对应关系的电量输出的装置称为传感器,这种技术称为传感技术。传感器输出的信号有不同的形式,有电压、电流、频率、脉冲等,以满足信息的传输、处理、记录、显示和控制等要求。3.1.1传感器的作用传感器是测量装置和控制系统的首要环节。如果没有传感器对原始参数进行精确可靠的测量,那么无论是信号转换或信息处理,或者最佳数据的显示和控制,都将称为一句空话。可以说,没有精确可靠的传感器,就没有精确可靠的自动检测和控制系统。现代电子技术和电子计算机为信息转换和处理提供了及其完善的手段,使检测和控制技术发展到崭新的阶段。但是如果没有各种精确可靠的传感器去检测各种原始数据并提供真实的信息,那么,电子计算机也无法发挥其应有的作用。如果把计算机比喻成人的大脑,那么传感器就是人的五官。3.1.2传感器技术的发展前景传感器技术所涉及的知识非常广泛,渗透到各个学科领域。但是它们的共性是利用物理定律和物质的物理、化学和生物特性,将非电量转换成电量。所以如何采用新技术、新工艺、新材料以及探索新理论,以达到高质量的转换效能,使总的发展途径。由于科学技术迅猛发展,工艺过程自动化程度越来越高,因此对测控系统的精度提出更高的要求。近年来,微型计算机组成的测控系统已经在许多领域得到应用,而传感器作为微型机的接口必须解决相容技术,根据这些时代特点,传感器将向以下几个方向发展。(1)高精度:为了提高测控精度,必须使传感器的精度尽可能的高。(2)小型化:很多测试场合要求传感器具有尽可能小的尺寸。(3)集成化:集成化传感器有两种类型。一种是将传感器与放大器、温度补偿电路等集成在同一芯片上,既减小体积,又增加抗干扰能力;另外一种是将同一类的传感器集成在同一芯片上构成二维阵列式传感器,或称面型固态图像传感器,它可以测量物体的表面状况。55 第三章温湿度传感器(4)数字化:为了使传感器与计算机直接联机,致力于数字式传感器研究是很重要的。(5)智能化:智能化传感器是传感器与微型计算机结合的产物,它兼有检测与信息处理功能。与传统传感器相比它有很多特点,它的出现时传感器技术发展中的一个飞跃。国外已经有商业化的智能传感器,我国也开始了智能传感器的研究工作。3.2温湿度传感器温湿度传感器是指能将温度量和湿度量转换成容易被测量处理的电信号的设备或装置。市场上的温湿度传感器一般是测量温度量和相对湿度量。热电式传感技术是将温度变化转换成电量变化的一种技术。在各种传感器中,热电式传感器是应用最为广泛的一种,如家电、医疗、国防、科研、航空技术、工业生产等领域,凡是需要调温、控温、测温的地方都要用到它。一般热电式传感器有热敏电阻、热电偶、铜电阻、热点开关、铂电阻、温敏二极管、温敏三极管、温敏晶闸管、集成温度传感器。湿度是指大气中的水蒸气含量,通常采用相对湿度和绝对湿度两种表示方法绝对湿度是指单位空间中所含水蒸气的绝对含量、浓度或者密度,一般用符号AH表示。相对湿度是指被测气体中蒸气压和该气体在相同温度下饱和水蒸气压的百分比,一般用符号RH表示。相对湿度给出大气的潮湿程度,它是一个无量纲的量,在实际使用中多使用相对湿度这一概念。一般多使用的湿敏传感器是氯化锂湿敏电阻和半导体陶瓷湿敏电阻。3.3温湿度一体化传感器由于温湿度是人们日常接触的两个最重要的参数,而且一般彼此不可分离。因此,分成两个各自独立的传感器和仪表往往给工作带来不便,而一体化的温湿度传感器与配套仪表甚受用户欢迎。曾有人企图设计制造一种既能测温度,又能测湿度的单一敏感元件,但至今仍未见到有一个能上市的,可见难度之大,问题的关键是如何把两种功能参数区分开来。所以全世界都在同一传感器内分别采用测温、测湿两种敏感元件。这样温湿度一体化传感器的发展方向首先就是选用优质热敏、湿敏元件,这点前已论及,于此不再重复。其次是需要有先进的电路和测量、控制、显示等配套仪表。在市场上这类商品很多,比较多人使用的是瑞士HOPEMICROELECTRONICS公司生产的FOST02/FOST02A温湿度传感器和瑞士SENSIRION公司的SHT7X/SHT1X系列温湿度传感器。55 第三章温湿度传感器3.4SHT71温湿度传感器3.4.1SHT71简介SHT71是瑞士Sensirion公司推出的基于CMOSens技术的新型温湿度复合传感器。它是一种全新的基于智能传感器设计理念的新型传感器,该传感器将温度、湿度传感器、信号调理、数字变换、串行数字通信接口、数字校准全部集成到一个高集成度、体积极小的芯片当中,利用它可以同时测量目标对象的温度和湿度,并实现数字式输出。在现代工业中,利用微控制器进行数据通讯的工业控制越来越广泛。特别是由于传输距离、现场状况等诸多可能出现的因素的影响,微控制器与传感器之间的通讯数据常会发生无法预测的错误。为了防止错误所带来的影响,在数据的接收端必须进行差错校验。本文基于温湿度内漏检测系统而编写的传感器SHT71和微控制器之间的串行通讯系统,介绍了一种软件差错校验方案—循环冗余校验法,克服了传统差错检验法对数据行或列的偶数个错误不敏感、漏判概率高等缺点,使校验过程既简单实用又成本低廉。它应用专利的工业COMS过程微加工技术(CMOSens®),确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式聚合体测湿元件和一个能隙式测温元件,并与一个14位的A/D转换器以及串行接口电路在同一芯片上实现无缝连接。因此,该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。内部结构主要包括了相对湿度传感器、温度传感器、放大器、14位A/D转换器、校准存储器(E2PROM)、随机存取存储器(RAM)、状态寄存器、循环冗余校验码(CRC)寄存器、二线串行接口、控制单元、加热器及低电压检测电路。工作原理:首先利用两只传感器分别产生相对湿度或温度的信号,然后经过放大,分别送至A/D转换器进行转换、校准和纠错,最后通过二线串行接口将相对湿度或温度的数据输送至微控器。3.4.2SHT71的性能指标温湿度传感器、信号放大调理、A/D转换、I2C总线接口全部集成于一个芯片上(CMOSens技术);全校准相对湿度及温度值输出;工业标准I2C总线数字输出接口;具有露点值计算输出功能;免外围元件;55 第三章温湿度传感器卓越的长期稳定性;湿度值输出分辨率为14位,温度值输出分辨率为12位,可编程降至12位和8位;可靠的CRC数据传输校验功能;片内装载的校准系数,保证100%的互换性。电源电压:2.4V~5.5V;电流消耗:测量0.55mA,平均0.28mA,睡眠0.3mA。型号测湿精度[%RH]测温精度[℃]在25℃封装SHT71±3.0±0.44-pin单排直插表3-1SHT71封装信息3.4.3SHT71接口说明图3-1典型应用电路SHT71的封装形式为小体积4脚单线封装,其引脚说明如下:a)SCK:串行时钟输入;b)VDD:2.4~5.5V电源端;c)GND:接地端;d)DATA:双向串行数据线。传感器通过串行数字通信接口(SCK和DATA)可与任何种类微处理器、微控制器系统连接,减少了传感器接口开发时间及降低了硬件成本。电源引脚:SHT71的供电电压为2.4~5.5V。传感器上电后,要等待11ms以越过“休眠”状态。在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。串行接口(两线双向):SHT71的串行接口,在传感器信号的读取及电源损耗方面,都做了优化处理;但与I2C接口不兼容,详情参见FAQ。串行时钟输入(SCK):SCK用于微处理器与SHTxx之间的通讯同步。由于接口包含了完全静态逻辑,因而不存在最小SCK频率。55 第三章温湿度传感器串行数据(DATA):DATA三态门用于数据的读取。DATA在SCK时钟下降沿之后改变状态,并仅在SCK时钟上升沿有效。数据传输期间,在SCK时钟高电平时,DATA必须保持稳定。为避免信号冲突,微处理器应驱动DATA在低电平。需要一个外部的上拉电阻(例如:10kΩ)将信号提拉至高电频。上拉电阻通常已包含在微处理器的I/O电路中。发送命令:用一组“启动传输”时序,来表示数据传输的初始化。它包括:当SCK时钟高电平时DATA翻转为低电平,紧接着SCK变为低电平,随后是在SCK时钟高电平时DATA翻转为高电平。图3-2“启动传输”时序后续命令包含三个地址位(目前只支持“000”),和五个命令位。SHT71会以下述方式表示已正确地接收到指令:在第8个SCK时钟的下降沿之后,将DATA下拉为低电频(ACK位)。在第9个SCK时钟的下降沿之后,释放DATA(恢复高电平)。[1]命令代码预留0000x温度测量00011湿度测量00101读状态寄存器00111写状态寄存器00110预留0101x-1110x软复位,复位接口,清空状态寄存器,即清空为默认值下一次命令前等待至少11ms11110表3-2SHT71命令集3.4.4SHT71与微控制器数据通讯的校验方法由于现场工作环境一般较恶劣,存在各种干扰源,为了保证数据传输的可靠性,在SHT71内部集成了循环冗余校验(CRC2CyclicRedundancyCheck)硬件电路。CRC是一种强有力的错误检测技术,在传送信息时,发送方根据所发送的信息的具体内容计算出一个称为CRC的值,并连同信息串一起发送;而接收方则根据接收到的信息串用同样的方法生成一个CRC值,若与收到的CRC值一致,则可以认为信息传送正确。使用55 第三章温湿度传感器CRC不能保证100%检测到错误,但它可以极大地增加发现错误的机会,而且它要求极少的硬件消耗就能实现,所以CRC被广泛作为校验手段。SHT71采用的是CRC码(又称为多项式码),它能检测出下列错误:所有的双错、奇数位错、突发长度小于等于8的突发错、绝大部分突发长度较长的突发错。测量完温度(或湿度)后,根据测量的信息生成一个CRC值,然后一同发送到微控制器中去。微控制器根据接收到的信息按照同样的方法生成一个CRC值,若与接收到的CRC值一致,则可以认为信息传送正确;否则要求传感器重新测量数据然后再按同样的方式发送。计算算法如下:a)初始化CRC寄存器中的值为00H;b)将传输或接收的数据位与bit7比较;c)如果该数据位与bit7相同,将CRC寄存器中的值向右移位,bit0=‘0’。否则将CRC寄存器中的值向右移位,然后将bit4和bit5反相,bit0=‘1’;d)传输或接收新的数据位,然后重复(b);SHT71生成的CRC值被完全倒转(bit0=bit7,bit1=bit6,...,bit7=bit0)。根据SHT71的CRC值生成算法原理,在微控制器中用软件来实现CRC校验。55 第四章硬件设计第四章硬件设计4.1硬件设计系统框图SHT71传感器与单片机的连接只需两条线。则本系统框图如下:图4-1硬件设计框图4.2稳压电源在整个单片机系统设计中,电源设计是需要首先考虑的,这决定系统是采用单电源方案还是多电源方案,系统的消耗有无特殊规定等。不同的电源方案决定整个系统的方案选择。本设计采用AMS1117稳压器。AMS1117是一个正向低压降稳压器,在1A电流下压降为1.2V。AMS1117有两个版本:固定输出版本和可调版本,固定输出电压为1.5V、1.8V、2.5V、2.85V、3.0V、3.3V、5.0V,具有1%的精度;固定输出电压为1.2V的精度为2%。AMS1117内部集成过热保护和限流电路,是电池供电和便携式计算机的最佳选择。AMS1117的特点:1)固定输出电压为1.5V、1.8V、2.5V、2.85V、3.0V、3.3V、5.0V和可调版本,具有1%的精度;2)固定输出电压为1.2V的精度为2%;3)低漏失电压:1A输出电流时仅为1.2V;4)限流功能;55 第四章硬件设计5)过热切断;6)温度范围:-40°C~125°C。稳压电源电路图:图4-2稳压电源电路图AMS1117是一个低漏失电压调整器,它的稳压调整管是由一个PNP驱动的NPN管组成的,漏失电压定义为:VDROP=VBE+VSAT。AMS1117有固定和可调两个版本可用,输出电压可以是:1.2V,1.5V,1.8V,2.5V,2.85V,3.0V,3.3V,和5.0V。片内过热切断电路提供了过载和过热保护,以防环境温度造成过高的结温。为了确保AMS1117的稳定性,对可调电压版本,输出需要连接一个至少22μF的钽电容。对于固定电压版本,可采用更小的电容,具体可以根据实际应用确定。通常,线性调整器的稳定性随着输出电流增加而降低。[11]本设计采用的电源是5V的稳压电源,所以稳压电源输出端VOUT选择输出的电压为5V。由于AMS1117的输入电压是15V以下,所以输入电压VIN为15V以下。稳压电源的输出端VOUT将接到单片机系统的输入端,即图4-5的输入端Vcc。4.3单片机与SHT71传感器的接口设计4.3.1SHT71的引脚和内部构成SHT71传感器是一款由多个传感器模块组成的单片全校准数字输出相对湿度和温度传感器。SHT71的内部结构如图4-3所示,主要包括了相对湿度传感器、温度传感器、放大器、14位A/D转换器、校准存储器(E2PROM)、随机存取存储器(RAM)、状态寄存器、循环冗余校验码(CRC)寄存器、二线串行接口、控制单元、加热器及低电压检测电路等。SCK是传感器和微处理器之间同步传输时钟输入端。DATA55 第四章硬件设计三态门用于数据的读取。DATA在SCK时钟下降沿之后改变状态,并仅在SCK时钟上升沿有效。数据传输期间,在SCK时钟高电平时,DATA必须保持稳定。为避免信号冲突,微处理器应驱动DATA在低电频。需要一个外部的上拉电阻(10kΩ)将信号提拉至高电频。图4-3SHT71内部结构框图图4-4SHT71的引脚SHT71传感器需要一个2.4至5.5V的供电电压。加电后,需要一个11ms的睡眠延迟时间,在这之前,不应该向传感器发送命令,电源(VDD和GND)间接一个100nF的电容。4.3.2SHT71与微处理器的接口设计55 第四章硬件设计图4-5SHT71与微处理器的接口电路由于SHT71的集成化设计,使得其与微控制器的接口电路及其简单。只需2个处理器端口就能实现传感器控制,占微处理器的端口少,可节省大量的引线和逻辑电路。4.3.3AT89C52单片机与SHT71传感器的接口设计AT89C52可作为SHT71的控制核心,而且接口电路也十分简单。图4-6AT89C52与SHT71的接口电路P3.0口作为时钟脉冲的输出口P3.1口作为与SHT71的数据交换口由于AT89C52不具备I2C总线接口,所以使用单片机通用I/O口线来虚拟I2C总线,利用P3.0来虚拟时钟线,利用P3.1口线来虚拟数据线DATA,并在DATA端接入一只4.7K的上拉电阻,同时在VDD及GND端接入一只100nF的去耦电容。AT89C52是高性能的CMOS8位单片机,有丰富的引脚和功能,可完全满足SHT71的控制需求。它有8K的EEPROM,无需扩展外部存储器,掉电依然可保持数据,方便测量数据的保存,提高了其安全性。SHT71是采用CMOSENS技术的智能化温湿度传感器,将传感器元件、信号放大器、模/数转换器、校准数据存储器、I2C55 第四章硬件设计总线等外围调理电路,全部与温湿度传感器集成在了一个只有几平方毫米的芯片上,这样就免去了许多的外围电路的设计,也使得总体抗干扰性能增强。4.3.4时钟电路MCS-51内部有一个高效益的反向放大器,但是要形成时钟,外部还需附加电路。MCS-51的时钟产生有两种方式。在电子学上,通常将含有晶体管元件的电路称作“有源电路”(如有源音箱、有源滤波器等),而仅由阻容元件组成的电路称作“无源电路”。电脑中的晶体振荡器也分为无源晶振和有源晶振两种类型。无源晶振与有源晶振的英文名称不同,无源晶振为crystal(晶体),而有源晶振则叫做oscillator(振荡器)。无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来,所以“无源晶振”这个说法并不准确;有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。(1)内部时钟方式利用芯片内部的振荡器,然后再引脚XTAL1和XTAL2两端跨接晶体振荡器和微调电容,就构成一个稳定的自激振荡器,其发出的脉冲直接输入单片机得内部时钟电路。外接晶振时,电容C1和C2一般为30pF左右。晶体的震荡频率范围是1.2MHz~12MHz。晶体的震荡频率高,则系统的时钟频率也高,单片机运行速度也很快。但反过来运行速度快对存储器的速度要求就高,对印刷电路板的工艺要求也高(线间寄生电容要小)。MCS-51在通常情况下,使用震荡频率为6MHz的石英晶体,而12HMz主要是在高速串行通讯的情况下使用。内部时钟方式也称无源晶振方式,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来无源晶振需要用单片机片内的振荡器,在datasheet上有建议的连接方法。无源晶振没有电压的问题,信号电平是可变的,也就是说是根据起振电路来决定的,同样的晶振可以适用于多种电压,可用于多种不同时钟信号电压要求的单片机,而且价格通常也较低,因此对于一般的应用如果条件许可建议用晶体,这尤其适合于产品线丰富批量大的生产者。无源晶振相对于晶振而言其缺陷是信号质量较差,通常需要精确匹配外围电路(用于信号匹配的电容、电感、电阻等),更换不同频率的晶体时周边配置电路需要做相应的调整。使用时建议采用精度较高的石英晶体,尽可能不要采用精度低的陶瓷晶体。使用时,对于电容的选择有一定的要求:a)当外接晶体振荡器的时候,接地电容一般选择。b)当外接陶瓷振荡器的时候,接地电容一般选择。55 第四章硬件设计在实际的硬件电路板设计时,应该保证外接的振荡器和电容尽可能靠近单片机的XTAL1和XTAL2引脚。这样可以减少寄生电容的影响,是振荡器稳定可靠地为单片机CPU提供时钟信号。如果振荡器连接不当,会导致电路不起振,没有时钟信号产生。(2)外部时钟方式在由多单片机组成的系统中,为了个单片机之间时钟信号的同步,应当引入唯一的共用外部脉冲信号作为个=各单片机的震荡脉冲,这时,外部的脉冲信号时经XTAL2引脚注入。外部时钟信号通过一个二分频的触发器而成为内部时钟信号,要求高、低电平的持续时间都大于20ms,且脉冲频率应低于12MHz。对于MCS-51单片机,情况有些不同,外引脉冲信号需从XTAL1引脚注入,而XTAL2引脚悬空。外部时钟方式也称有源晶振方式,是一个完整的振荡器,里面除了石英晶体外,还有晶体管和阻容元件。有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,价格相对较高。对于时序要求敏感的应用,还是有源的晶振好,因为可以选用比较精密的晶振,甚至是高档的温度补偿晶振。图4-7振荡电路无论采用内部振荡电路还是外部振荡电路,振荡电路的频率应该满足单片机的工作频率要求,AT89C52单片机的工作频率为0~33MHz。相对有源晶振,采用无源晶振的成本低廉,体积小,结构简单。而且本设计对于起振电路的要求不高,所以适合采用无源晶振。在起振电路设计中所采用的的电容为103电容,可满足起振要求。4.3.5复位电路55 第四章硬件设计复位是单片机的初始化操作,其主要功能是吧PC初始化为0000H,使单片机从0000H单元开始执行程序。出了进入系统的正常初始化意外,当由于程序运行出错或者操作错误使系统处于死锁状态时,为了摆脱困境,也需按复位键以重新启动。MCS-51单片机的RST引脚是复位信号的输入端,复位信号时高电平有效,其有效时间应持续24个振荡周期(即两个机器周期以上)。若使用频率为6MHz的晶振,则复位信号持续时间应超过4μs才能完成复位操作。图4-8复位电路在上电瞬间,RC电路充电,RST引脚端出现正脉冲。只要RST引脚端保持10ms以上高电平,就能使单片机有效的复位。4.4单片机键盘和显示部分4.4.1键盘部分键盘实现向计算机输入数据,传送命令等功能,是人工干预计算机的主要手段。单片机系统中的键盘接口电路有编码式键盘和非编码式键盘两种,实现方法通常采用如下四种方式:通过并行接口芯片(8255、8155)与键盘接口;通过串行口与键盘接口;通过单片机并行口直接与键盘接口;通过8279芯片与键盘接口。独立式按键接口:独立式按键就是各按键相互独立,每个键各接一根输入线,一根输入线上的按键工作状态不会影响其他输入线上的工作状态,直接通过检测输入线的电平状态就可以很容易判断哪个按键被按下了。独立式按键接口有中断方式的独立式按键工作状态和查询方式的独立式按键工作状态,都是按键直接与微处理器连接,通过读I/O口,判定个I/O口的电平状态,即可识别按下的按键。55 第四章硬件设计此外,也可以用扩展I/O口搭接独立式按键接口电路。采用8255扩展的I/O口和用三态缓冲器扩展的I/O口两种典型的方式。这两种配接方式,都是把按键作为外部RAM某一工作单元来对待,通过读片外RAM的方法,识别按键的工作状态。上述独立式按键电路中,各按键开关均采用了上拉电阻,这是为了保证在按键开关断开时,各I/O口线有确定的高电平,当然如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。现在对图所示独立按键盘进行编程,采用软件消抖的方法,以查询工作方式检测各按键的状态。当有且仅有一键按下时才予以识别,两个或多个键同时按下将不予以处理。独立式按键的特点:独立式按键键盘由于按键的数目较少,可根据实际需要编码。而且独立式键盘的效应速度快,效率高,稳定性好。本设计需要用到的按键不多,独立式键盘就能满足要求,而且独立式键盘相对于矩阵式键盘来说更为简单,编程也十分容易,所以本设计采用独立式键盘。图4-9键盘接线图键盘接线如图4-9所示,本设计只需用到6个按键即可,各个按键的功能在第五章中有所定义。4.4.2单片机显示部分55 第四章硬件设计在单片机系统中,常用的显示器有:发光二极管显示器,简称LED;液晶显示器,简称LCD;荧光管显示器。近年来也开始使用简易的CRT接口,显示一些汉字及图形。前三种显示器都有两种显示结构:段显示和点显示。而发光二极管显示又分为固定段显示和可以拼装的大型字段显示,此外还有共阳极和共阴极之分等。三种显示器中,以荧光管显示器亮度极高,发光二极管次之,而液晶显示器最弱,为被动显示器,必须有外光源。LED显示块是由发光二极管显示字段组成的显示器,有7段和“米”字段之分。这种显示块有共阳极和共阴极两种。共阴极LED显示块的发光二极管的阴极连接在一起,通常此公共阴极接地,当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。同样,共阳极LED显示块的发光二极管的阳极连接在一起,通常此公共阳极接正电压。当某个发光二极管的阴极接低电平时,发光二极管点亮,相应的段被显示。LED的显示方式:有LED静态显示方式和LED动态显示方式。a)LED静态显示方式LED显示器工作于静态显示方式时,各位的共阴极(或共阳极)连接在一起并接地(或+5V)每位的段选端分别与一8位的锁存输出相连。之所以称为静态显示,使由于显示器中的各位相互独立,而且各位的显示字符一经确定,相应的锁存器的输出将维持不变,直到显示为另一个字符为止。静态显示器的亮度较高。静态LED显示电路各位可独立显示,只要在该位的段选上保持段选码电平,该位就能保持相应得显示字符。由于每位分别由一个输出口控制段选码,所以在某一时间里,每位显示的字符可以各不相同。这种显示方式接口,编程容易,管理简单。但占用的口线资源较多。如果显示位数增多,静态显示无法时应,一般都采用动态显示方式。b)LED动态显示方式在多位LED显示时,为了简化电路,通常将所有位的段选线相应得并联在一起,由一个或两个8位I/O口控制,形成段选线的多路复用。而各位的共阳极或共阴极分别由相应的I/O口线控制,实现各位的分时选通。55 第四章硬件设计图4-10LED动态显示器电路如图4-10所示是本设计的LED动态显示器的电路原理图。本设计采用两个4位的数码管组成的显示模块。一个4位数码管温度显示,另一个则湿度显示。是若要各位LED能够显示出与本位相应得显示字符,就必须采用扫描显示方式,即在某一时刻,只让某一位的位选线处于选通状态,而其它各位的位选线处于关闭状态,同时,段选线上输出相应位要显示字符的字形码,这样同一时刻,4位LED中只有选通的那一位显示出字符,而其它三位则是熄灭的。同样,在下一时刻,只让下一位的位选线处于选通状态,而其它各位的位选线处于关闭状态。同时,在段选线上输出相应位将要显示字符的字形码,则同一时刻,只有选通位显示出相应的字符,而其它各位则是熄灭的。如此循环下去,就可以使各位显示出将要显示的字符,虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于人眼有视觉暂留现象,只要每位显示间隔时间足够短,则可造成多位同时亮的假象,达到显示的目的。在软件设计中有改善显示效果的程序设计。LED不同位显示的时间间隔可以通过定时中断完成。如对8位LED显示器,扫描显示频率为50HZ,假若显示一位保持1ms时间,则显示完所有8位之后,只需8ms,于是另外12msCPU完全可以处理其它工作。上述保持1ms的时间应根据实际情况而定。不能太小,因为发光二极管从导通道发光有一定的延时,导通时间太小,发光太弱人眼无法看清。但也不能太大,因为毕竟要受限于临界闪烁频率,而且此时间越长,占用CPU时间也越多。另外,显示位增多,也将占用大量的CPU时间,因此动态显示实质是以牺牲CPU时间换取远见和耗能的减少。4.5单片机控制接口部分4.5.1报警灯和蜂鸣器单片机不但实现对温湿度传感器SHT71数据的采集和处理,并且LED显示,而且承担着对环境温湿度进行实时监测和控制的任务。在温湿度控制中,我们期望环境的温度和湿度都在一个合适的范围当中,在这个范围中,我们的设备能正常工作,我们的产品的合格率是最高的。所以设置一个合适的温湿度范围,并且利用单片机进行编成控制,如果温度或湿度超出这个范围,那么单片机会控制蜂鸣器来报警。55 第四章硬件设计控制部分原理就是通过利用SHT71已经测的并处理过的数据返回到单片机处理系统中在对其进行与设定值的比较。在与设定值比较过程中,如果传送值与设定值相比起来在其范围之内则视为正常,如果传送值超出其设定范围之外,则视为不正常。因此单片机系统对其进行发光灯和报警显示出异常。单片机给通信口产生高电平使发光二极管接通,从而使发光二极管闪烁而达到显示的目的。使我们作出相应的温湿度减弱和增强的措施使达到适合条件,以满足环境需要的要求保证工作的顺利进行。图4-11发光控制接口图4-12蜂鸣器控制接口4.5.2制冷片制冷片也叫热电半导体制冷组件,帕尔贴等。因为制冷片分为两面,一面吸热,一面散热,只是起到导热作用,本身不会产生冷,所以又叫致冷片55 第四章硬件设计,或者说应该是叫致冷片。a)珀尔帖效应应用  半导体致冷器是由半导体所组成的一种冷却装置,于1960左右才出现,然而其理论基础Peltiereffect可追溯到19世纪。是由X及Y两种不同的金属导线所组成的封闭线路。  通上电源之後,冷端的热量被移到热端,导致冷端温度降低,热端温度升高,这就是著名的Peltiereffect。这现象最早是在1821年,由一位德国科学家ThomasSeeback首先发现,不过他当时做了错误的推论,并没有领悟到背後真正的科学原理。到了1834年,一位法国表匠,同时也是兼职研究这现象的物理学家JeanPeltier,才发现背後真正的原因,这个现象直到近代随著半导体的发展才有了实际的应用,也就是[致冷器]的发明。b)半导体致冷法的原理以及结构:  半导体热电偶由N型半导体和P型半导体组成。N型材料有多余的电子,有负温差电势。P型材料电子不足,有正温差电势;当电子从P型穿过结点至N型时,结点的温度降低,其能量必然增加,而且增加的能量相当于结点所消耗的能量。相反,当电子从N型流至P型材料时,结点的温度就会升高。  直接接触的热电偶电路在实际应用中不可用,所以用下图的连接方法来代替,实验证明,在温差电路中引入第三种材料(铜连接片和导线)不会改变电路的特性。  这样,半导体元件可以用各种不同的连接方法来满足使用者的要求。把一个P型半导体元件和一个N型半导体元件联结成一对热电偶,接上直流电源后,在接头处就会产生温差和热量的转移。  在上面的接头处,电流方向是从N至P,温度下降并且吸热,这就是冷端;而在下面的一个接头处,电流方向是从P至N,温度上升并且放热,因此是热端。  因此是半导体致冷片由许多N型和P型半导体之颗粒互相排列而成,而N/P之间以一般的导体相连接而成一完整线路,通常是铜、铝或其他金属导体,最後由两片陶瓷片夹起来,陶瓷片必须绝缘且导热良好。半导体制冷片作为特种冷源,在技术应用上具有以下的优点和特点:1、不需要任何制冷剂,可连续工作,没有污染源没有旋转部件,不会产生回转效应,没有滑动部件是一种固体片件,工作时没有震动、噪音、寿命长,安装容易。2、半导体制冷片具有两种功能,既能制冷,又能加热,制冷效率一般不高,但制热效率很高,永远大于1。因此使用一个片件就可以代替分立的加热系统和制冷系统。55 第四章硬件设计3、半导体制冷片是电流换能型片件,通过输入电流的控制,可实现高精度的温度控制,再加上温度检测和控制手段,很容易实现遥控、程控、计算机控制,便于组成自动控制系统。4、半导体制冷片热惯性非常小,制冷制热时间很快,在热端散热良好冷端空载的情况下,通电不到一分钟,制冷片就能达到最大温差。5、半导体制冷片的反向使用就是温差发电,半导体制冷片一般适用于中低温区发电。6、半导体制冷片的单个制冷元件对的功率很小,但组合成电堆,用同类型的电堆串、并联的方法组合成制冷系统的话,功率就可以做的很大,因此制冷功率可以做到几毫瓦到上万瓦的范围。7、半导体制冷片的温差范围,从正温90℃到负温度130℃都可以实现。通过以上分析,半导体温差电片件应用范围有:制冷、加热、发电,制冷和加热应用比较普遍,有以下几个方面:1、军事方面:导弹、雷达、潜艇等方面的红外线探测、导行系统。2、医疗方面:冷力、冷合、白内障摘除片、血液分析仪等。3、实验室装置方面:冷阱、冷箱、冷槽、电子低温测试装置、各种恒温、高低温实验仪片。4、专用装置方面:石油产品低温测试仪、生化产品低温测试仪、细菌培养箱、恒温显影槽、电脑等。5、日常生活方面:空调、冷热两用箱、饮水机、电子信箱等。此外,还有其它方面的应用,这里就不一一提了。本设计所选用的冷却片参数如下:型号电堆数最大工作电压(V)最大电流(A)最大温差ΔTmax(℃)最大产冷功率Qm外形尺寸(mm)(L×W×H)电阻范围R(Ω)TEC1-12703T12512715.236729.740×40×4.53.30-4.30表4-1冷却片参数表由于制冷片所需要的工作电流达3A,单片机的供电电源不足以满足供电要求,所以在这里使用独立的电源VCC2。所选用的VCC2的电压为9V,符合冷却片的工作要求,在电路设计中加入继电器放大电流。55 第四章硬件设计图4-13继电器接线图如图4-9所示,制冷片的两个接线端口分别接到两个继电器上的JD1和JD2上。在设计中通过程序控制两个继电器的开关,从而达到控制供给制冷片的电流方向,随而让制冷片选择启动加热或降温的功能。55 第五章软件设计第五章软件设计5.1SHT71传感器的控制5.1.1SHT71传感器的基本工作原理SHT71的基本工作原理是单片机向SHT71发出命令,SHT71利用两只传感器分别产生相对湿度、温度的信号,然后经过放大,分别送至其内部的A/D转换器进行模/数转换、校准和纠错,最后通过二线串行接口将相对湿度及温度的数据送至单片机处理。单片机处理数据后进行数字显示并作相应的控制。5.1.2SHT71传感器数据测量过程a)发送一个命令:在发送命令之前,应先发送一个“传输开始”序列,该序列组成如图所示。之后发送命令,命令由三位地址位(只支持000)和5位命令组成。其5条命令即是上面已经提到过的:测量湿度(00101)、测量温度(00011)、写状态寄存器(00110)、读状态寄存器(00111)和软件复位(11110)命令。须指出的是在8个SCK时钟之后,如果命令接收正确将DATA端拉低(ACK位)。在第9个SCK时钟结束后DATA恢复高电平。发送命令的时序如图所示。图5-1传输开始序列图5-2命令时序启动传输指令的程序如下,时序图如图5-1//启动传输指令55 第五章软件设计//_____________//DATA:|_______|//______//SCK:___||___||______{DATA=1;SCK=0;//开始状态_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;}b)测量时序:在AT89C52发出一个测量命令(00000101为湿度测量命令,00000011为温度测量命令)后,微处理器等待SHT71测量,大约需要210ms,这个时间由SHT71内部的振荡器确定。测量完毕后,SHT71将下拉DATA至低电平;接着SHT71和微处理器进行数据传送,当传输完每个字节的测量数据后,由控制器拉低数据线,表示承认接收的每个字节;接收全部数据是MSB在第一位(对12位的结果,数据第一个字节的第5个是SCK是MSB位;对8位数据结果,第一字节是无效的)。如果8位CRC校验和不用,控制器可爱测量数据的LSB位后将ACK变高。如果8位校验和使用,控制器可在测量数据的LSB位后面将ACK变低。在CRC数据的回答位传输结束后,SHT71自动返回空闲状态,等待下次开始。c)复位时序:如果传感器传输失败,下一SCK信号将复位串行接口,当使DATA处于高电平时,触发SCK9次以上并随后发出一个前述的“传输开始”序列,此时时序只复位接口,状态寄存器保持它的内容。复位时序如图5-3所示55 第五章软件设计图5-3复位时序程序如下://软复位传感器{unsignedcharerror=0;ConnectionReset();//复位通讯error+=Write_Byte(RESET);//发送复位指令到传感器returnerror;//当传感器没有应答的时候error=1}d)状态寄存器与读写时序:SHT71的状态寄存器是一个8位的寄存器,其中5位是有用的,三位未用。具体情况如下:D6:电池低压检测位。当D6=0时,表示VCC大于2.47V。当D6=1时,表示VCC小于2.47V。D2:加热控制位。当D2=0是关断加热器,当D2=1时,接通加热器。D1:再装校准存储器控制位。当D1=0时,表示不再装。当D1=1时,表示再装。D0:精确控制位。当D0=0时,表示12位湿度/14位温度测量。当D0=1时表示8位湿度/12位温度测量。5.1.3数据处理为了将SHT71输出的数字量转换成实际物理量需进行相应的数据处理。a)湿度变换SHT71的输出特性呈一定的非线性,为了补偿湿度传感器的非线性以获取准确数据,可按如下公式修正湿度值:RHlinear=c1+c2·SORH+c3·SORH2(5-1)式中SORH为传感器相对湿度测量值,系数取值如下:12位SORH:c1=-4;c2=0.0405;c3=-2.8·10-68位SORH:c1=-4;c2=0.648;c3=-7.2·10-455 第五章软件设计b)温度补偿上述湿度计算公式是按环境温度为25℃进行计算的,而实际的测量温度则在一定范围内变化,所以应考虑湿度传感器的温度系数,按如下公式对环境温度进行补偿。RHtrue=(T℃-25)·(t1+t2·SORH)+RHlinear(5-2)当SORH为12位时t1=0.01;t2=0.00008,当SORH为8位时,t2=0.00128c)温度变换由设计决定的SHT71温度传感器的线性非常好,故可用下列公式将温度数字输出转换成实际温度值:温度=d1+d2·SOT(5-3)当电源电压为5V、温度传感器的分辨率为14位时,d1=-40,d2=0.01,当温度传感器的分辨率为12位时,d1=-40,d2=0.04。以上几点的程序如下://计算温度[摄氏度]和湿度[%RH]//输入:湿度[数字输出](12位)//温度[数字输出](14位)//输出:湿度[%RH]//温度[摄氏度]{constfloatC1=-4.0;//for12BitconstfloatC2=+0.0405;//for12BitconstfloatC3=-0.0000028;//for12BitconstfloatT1=+0.01;//for14Bit@5VconstfloatT2=+0.00008;//for14Bit@5Vfloatrh=*p_humidity;//rh:湿度[数字输出]12Bitfloatt=*p_temperature;//t:温度[数字输出]14Bitfloatrh_lin;//rh_lin:线性化的湿度floatrh_true;//rh_true:进行温度补偿过的湿度floatt_C;//t_C:温度[摄氏度]t_C=t*0.01-40;//把数字输出转换成温度值(摄氏度)rh_lin=C3*rh*rh+C2*rh+C1;//把数字输出转换成相对湿度[%RH]rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;//计算温度补偿后的相对湿度值[%RH]if(rh_true>100)rh_true=100;//砍掉超过物理可能范围的值if(rh_true<0.1)rh_true=0.1;55 第五章软件设计*p_temperature=t_C;//返回的温度(摄氏度)*p_humidity=rh_true;//返回的相对湿度}d)露点值计算空气的露点值可根据相对湿度和温度值由下面的公式计算:(5-4)(5-5)露点计算程序如下://计算露点//输入:湿度[%RH],温度[摄氏度]//输出:露点[摄氏度]{floatlogEx,dew_point;logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);dew_point=(logEx-0.66077)*237.3/(0.66077+7.5-logEx);returndew_point;5.2扩展模块5.2.1键盘控制键盘部分的使用,首先要定义各个按键,本设计中定义了6个按键,分别的功能是:a、进入设置模式;b、退出设置模式;c、设置位左移一位;d、设置位右移一位;e、设置温度值加一;f、设置温度值减一。定义键盘功能程序如下:sbitStartSet=P0^0;//进入设置模式sbitLeft=P0^1;//设置位左移一位sbitPlus=P0^2;//设置温度值加一sbitMinus=P0^3;//设置温度值减一sbitRight=P0^4;//设置位右移一位sbitFinishSet=P0^5;//退出设置模式键盘操作流程图如下:55 第五章软件设计图5-4键盘操作流程图图中的其他操作为执行按键的功能,下面我就举一个例子来说明一下。在进入设置模式以后,如果需要把设置为左移一位时,程序如下:}if(Left==0){Delay(5000);//左移按键按下if(Left==0){n--;//设置的位向移左一位n&=0x03;//移到最左时,再移一次从最右开始左移for(i=0;i<4;i++)DispBuffer[i]=SetTemp_bit[i];//把“设定温度”值放到显示缓冲区while(StartSet==0)Display();//当按键没释放时显示设定的温度}其他按键的操作步骤也类似,程序在这里不一一列出,在附录I中有详细源代码。55 第五章软件设计5.2.2LED数码管显示数码管显示的程序如下:#defineLEDP2#defineLED_SectionP1unsignedcharDispBuffer[8]={0,0,0,0,0,0,0,0};//显示缓冲区voidDelay(unsignedintv)//延时函数{while(v!=0)v--;}voidDisplay(){unsignedchari=0;unsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管码表unsignedcharaddr[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff};//数码管位选表for(i=0;i<8;i++){LED=addr[8];Delay(20);//消除重影if(i!=2|i!=6){LED_Section=tab[DispBuffer[i]];//显示数字}else{LED_Section=tab[DispBuffer[i]]-0x08;//显示数字(带小数点)}LED=addr[i];//打开数码管对应的位Delay(400);//延时}}在这段程序中,位选表是为码表和缓冲区之间建立对应关系。程序中有一个公共显示缓冲区,数据由缓冲区发送至码表。消除重影是为了改善显示效果。55 第五章软件设计5.3控制部分控制接口部分的程序:sbitHeatA=P3^5;sbitHeatB=P3^6;sbitBeeper=P3^4;sbitSignalLED=P3^3;以上为设置控制端口函数voidHeatUp(){//制冷片加热HeatA=1;HeatB=0;}以上为制冷片加热函数voidCoolDown(){//制冷片制冷HeatA=0;HeatB=1;}以上为制冷片制冷函数voidInit_Timer0(){TMOD=0x01;TH0=(65536-50000)/256;//定时器隔50毫秒进一次中断TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;}unsignedcharTcount=0;voidTimer0()interrupt1{TH0=(65536-50000)/256;//定时器隔50毫秒进一次中断TL0=(65536-50000)%256;Tcount++;if(Tcount==20)//定时器第20次进中断(1s){55 第五章软件设计MeasureFlag=1;//控制传感器隔1秒测量一下。Tcount=0;}}定时器设置,目的是为了使传感器每秒使用不超过两次,确保传感器的温漂不影响使用精度。还有就是为了恒温,确保温度不超过设定值允许超过的范围,有以下一段程序:Display();//显示“显示缓冲区”的内容SetTemp=SetTemp_bit[0]*100+SetTemp_bit[1]*10+SetTemp_bit[3]+SetTemp_bit[4]*0.1;//转换设定温度为一个浮点数。if(temp_val.f-SetTemp>0.5)//当前温度比设定温度高0.5度以上{if(Tcount%5==0){SignalLED=~SignalLED;//LED灯隔250ms闪一次Beeper=~Beeper;//蜂鸣器每隔250ms响一次}CoolDown();//制冷片制冷}elseif(temp_val.f-SetTemp<-0.5){if(Tcount%5==0)//当前温度比设定温度低0.5度以上{SignalLED=~SignalLED;//LED灯隔250ms闪一次Beeper=~Beeper;//蜂鸣器每隔250ms响一次}HeatUp();//制冷片加热}}}转换设定温度为一个浮点数以后,把设定温度值于显示温度值相比较,当显示值超过设定值的0.5度时,LED灯和蜂鸣器会动作,发出报警,同时制冷片会动作,进行对温度的调节。55 第五章(标题)结束语历时三个月的毕业设计终于完成了,为了让本设计尽可能完美,在这段时间里我努力的学习了许多单片机的知识。虽然完成了,但是还是决定不太满意,感觉设计中还有很多地方可以做得更好的,但是由于时间太紧凑,以及本人自身所掌握的知识不够深入的原因没有能做出来,为此略感遗憾。设计的内容不多,主要是单片机和传感器主体部分的电路设计和软件编程,除此以外还有键盘和显示部分,以及蜂鸣器、报警灯和制冷片这些外部控制部分。每个部分都是作为典型例子来在设计中体现。虽然内容不多,但是本设计适用于很多场合,使用的时候只需按要求做适当调整即可。在软件设计部分,我所使用的是C语言编程,由于之前没有学习过C编程,为了完成本设计,我花了很多时间和精力去学习这方面的知识。在完成软件设计后,本设计也接近完成,反观整个设计,感到自己三个月以来的付出还是值得的。55 参考文献参考文献[1]数字式温湿度传感器SHT1x/SHT7x使用指南[2]零基础学单片机C语言程序设计,机械工业出版社,2009.4[3]单片机典型模块设计实例导航,人民邮电出版社,2008.6[4]传感技术与应用教程,清华大学出版社,2005.4[5]单片机原理与接口技术,化学工业出版社,2006.2[6]基于AT89C2051的温湿度控制仪,电子技术,2004[7]李华.MCS-51系列单片机实用接口技术[M].电子工业出版社,1999:21-46[8]AT89C52单片机资料手册[9]魏俊奇,数字式温湿度传感器的应用,电子产品世界,1999.5[10]钟晓伟,宋蛰存.基于单片机的实验室温湿度控制系统设计[J].林业机械与木工设备,1001—4462(2010)01-0039-04[11]AMS1117稳压器资料手册[12]何立民,单片机应用技术选编(4)[M].北京航空航天大学出版社,1999:20-30.55 附录I附录I程序源代码:#include#include#include//----------------------------------------------------------------------------------//SHT传感器模型变量//----------------------------------------------------------------------------------enum{TEMP,HUMI};sbitDATA=P3^1;sbitSCK=P3^0;#definenoACK0#defineACK1//地址指令读/写#defineSTATUS_REG_W0x06//00000110#defineSTATUS_REG_R0x07//00000111#defineMEASURE_TEMP0x03//00000011#defineMEASURE_HUMI0x05//00000101#defineRESET0x1e//00011110typedefunion{unsignedinti;floatf;}value;bitSetFlag=0;//进入设置模式的标志bitMeasureFlag=1;//允许测量的标志(控制传感器一秒内只能工作1次)//----------------------------------------------------------------------------------55 附录IcharWrite_Byte(unsignedcharvalue)//----------------------------------------------------------------------------------//写一字节数据到串行接口{unsignedchari,error=0;for(i=0x80;i>0;i/=2){//8位数据,按从高位到低位的顺序写入数据线if(i&value){DATA=1;}else{DATA=0;}SCK=1;//时钟线输入下降沿信号_nop_();_nop_();_nop_();//数据在时钟线下降沿载入SHT传感器SCK=0;}DATA=1;//释放数据线,SCK=1;//等待SHT传感器在数据线输入ACK信号error=DATA;//接收应答信号SCK=0;returnerror;//没有收到传感器的应答时error=1}//----------------------------------------------------------------------------------charRead_Byte(unsignedcharack)//----------------------------------------------------------------------------------//从传感器读一字节数据,并当ACK=1是传送一个应答信号。{unsignedchari,val=0;DATA=1;//释放数据线for(i=0x80;i>0;i/=2){SCK=1;55 附录Iif(DATA)val=(val|i);//读一位SCK=0;}DATA=!ack;//当"ack==1"拉低数据线SCK=1;//准备发送应答信号_nop_();_nop_();_nop_();SCK=0;DATA=1;//释放数据线returnval;}//----------------------------------------------------------------------------------voidTransStart(void)//----------------------------------------------------------------------------------//启动传输指令//_____________//DATA:|_______|//______//SCK:___||___||______{DATA=1;SCK=0;//开始状态_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;}55 附录I//----------------------------------------------------------------------------------voidConnectionReset(void)//----------------------------------------------------------------------------------//复位通讯:数据线保持9个时钟的高电平,然后跟着启动传输时序//____________________________________________//DATA:G|_______|//_______________//SCK:__||__||__||__||__||__||__||__||__||______||___||______{unsignedchari;DATA=1;SCK=0;//数据线高电平for(i=0;i<9;i++)//持续9个时钟信号{SCK=1;SCK=0;}TransStart();//启动传输命令}//----------------------------------------------------------------------------------charSoftReset(void)//----------------------------------------------------------------------------------//软复位传感器{unsignedcharerror=0;ConnectionReset();//复位通讯error+=Write_Byte(RESET);//发送复位指令到传感器returnerror;//当传感器没有应答的时候error=1}//----------------------------------------------------------------------------------charRead_StatusReg(unsignedchar*p_value,unsignedchar*p_checksum)//----------------------------------------------------------------------------------//读状态寄存器,带校验和(8位)55 附录I{unsignedcharerror=0;TransStart();//开始传输error=Write_Byte(STATUS_REG_R);//发送指令到传感器*p_value=Read_Byte(ACK);//读状态寄存器(8位)*p_checksum=Read_Byte(noACK);//读校验和(8位)returnerror;//传感器无应答的时候error=1}//----------------------------------------------------------------------------------charWrite_StatusReg(unsignedchar*p_value)//----------------------------------------------------------------------------------//写状态寄存器,带校验和(8位){unsignedcharerror=0;TransStart();//开始传输error+=Write_Byte(STATUS_REG_W);//发送指令到传感器error+=Write_Byte(*p_value);//发送数据到状态寄存器returnerror;//传感器没应答的时候error>=1}//----------------------------------------------------------------------------------charMeasure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode)//----------------------------------------------------------------------------------//测量(湿度/温度),带校验和{unsignederror=0;unsignedinti;TransStart();//开始传输switch(mode){//发送指令到传感器caseTEMP:error+=Write_Byte(MEASURE_TEMP);break;caseHUMI:error+=Write_Byte(MEASURE_HUMI);break;default:break;55 附录I}for(i=0;i<65535;i++)if(DATA==0)break;//等待传感器结束测量if(DATA)error+=1;//或者超时(大约2秒无响应则超时)*(p_value)=Read_Byte(ACK);//读第一字节(MSB)*(p_value+1)=Read_Byte(ACK);//读第二字节(LSB)*p_checksum=Read_Byte(noACK);//读校验和returnerror;}//----------------------------------------------------------------------------------------voidCalc_SHT11(float*p_humidity,float*p_temperature)//----------------------------------------------------------------------------------------//计算温度[摄氏度]和湿度[%RH]//输入:湿度[数字输出](12位)//温度[数字输出](14位)//输出:湿度[%RH]//温度[摄氏度]{constfloatC1=-4.0;//for12BitconstfloatC2=+0.0405;//for12BitconstfloatC3=-0.0000028;//for12BitconstfloatT1=+0.01;//for14Bit@5VconstfloatT2=+0.00008;//for14Bit@5Vfloatrh=*p_humidity;//rh:湿度[数字输出]12Bitfloatt=*p_temperature;//t:温度[数字输出]14Bitfloatrh_lin;//rh_lin:线性化的湿度floatrh_true;//rh_true:进行温度补偿过的湿度floatt_C;//t_C:温度[摄氏度]t_C=t*0.01-40;//把数字输出转换成温度值(摄氏度)rh_lin=C3*rh*rh+C2*rh+C1;//把数字输出转换成相对湿度[%RH]rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;//计算温度补偿后的相对湿度值[%RH]if(rh_true>100)rh_true=100;//砍掉超过物理可能范围的值if(rh_true<0.1)rh_true=0.1;55 附录I*p_temperature=t_C;//返回的温度(摄氏度)*p_humidity=rh_true;//返回的相对湿度}//--------------------------------------------------------------------floatCalc_DewPoint(floath,floatt)//--------------------------------------------------------------------//计算露点//输入:湿度[%RH],温度[摄氏度]//输出:露点[摄氏度]{floatlogEx,dew_point;logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);dew_point=(logEx-0.66077)*237.3/(0.66077+7.5-logEx);returndew_point;}//----------------------------------------------------------------------------------//按键功能定义//----------------------------------------------------------------------------------sbitStartSet=P0^0;sbitLeft=P0^1;sbitPlus=P0^2;sbitMinus=P0^3;sbitRight=P0^4;sbitFinishSet=P0^5;//----------------------------------------------------------------------------------//控制接口//----------------------------------------------------------------------------------sbitHeatA=P3^5;sbitHeatB=P3^6;sbitBeeper=P3^4;sbitSignalLED=P3^3;55 附录IvoidHeatUp(){//制冷片加热HeatA=1;HeatB=0;}voidCoolDown(){//制冷片制冷HeatA=0;HeatB=1;}voidInit_Timer0(){TMOD=0x01;TH0=(65536-50000)/256;//定时器隔50毫秒进一次中断TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;}unsignedcharTcount=0;voidTimer0()interrupt1{Tcount++;if(Tcount==20)//定时器第20次进中断(1s){MeasureFlag=1;//控制传感器隔1秒测量一下。Tcount=0;}}//----------------------------------------------------------------------------------//显示接口//----------------------------------------------------------------------------------#defineLEDP2#defineLED_SectionP155 附录IunsignedcharDispBuffer[8]={0,0,0,0,0,0,0,0};//显示缓冲区voidDelay(unsignedintv)//延时函数{while(v!=0)v--;}voidDisplay(){unsignedchari=0;unsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管码表unsignedcharaddr[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff};//数码管位选表for(i=0;i<8;i++){LED=addr[8];Delay(20);//消除重影if(i!=2|i!=6){LED_Section=tab[DispBuffer[i]];//显示数字}else{LED_Section=tab[DispBuffer[i]]-0x08;//显示数字(带小数点)}LED=addr[i];//打开数码管对应的位Delay(400);//延时}}//----------------------------------------------------------------------------------voidmain()//主程序{valuehumi_val,temp_val;unsignedcharerror,checksum;55 附录Iunsignedchari,n;unsignedcharSetTemp_bit[4]={4,0,0,0};//存储设定温度的各位(百位-十分位)floatSetTemp;Init_Timer0();//初始化定时器ConnectionReset();while(1){if(MeasureFlag){error=0;error+=Measure((unsignedchar*)&humi_val.i,&checksum,HUMI);//测量湿度error+=Measure((unsignedchar*)&temp_val.i,&checksum,TEMP);//测量温度if(error!=0){ConnectionReset();//出现故障时重置通讯连接}else{humi_val.f=(float)humi_val.i;//把湿度由整形转换成浮点型temp_val.f=(float)temp_val.i;//把温度由整形转换成浮点型Calc_SHT11(&humi_val.f,&temp_val.f);//计算温度和湿度}MeasureFlag=0;//关闭测量标志,1秒后定时器置位测量标志,才允许再次测量}if(!SetFlag){//不在设置模式DispBuffer[0]=(unsignedchar)temp_val.f%1000/100;//把温度的百位存到显示缓冲区55 附录IDispBuffer[1]=(unsignedchar)temp_val.f%100/10;//把温度的十位存到显示缓冲区DispBuffer[2]=(unsignedchar)temp_val.f%10;//把温度的个位存到显示缓冲区DispBuffer[3]=(unsignedchar)(temp_val.f*10)%10;//把温度的十分位存到显示缓冲区DispBuffer[4]=(unsignedchar)humi_val.f%1000/100;//把湿度的百位存到显示缓冲区DispBuffer[5]=(unsignedchar)humi_val.f/10;//把湿度的十位存到显示缓冲区DispBuffer[6]=(unsignedchar)humi_val.f%10;//把湿度的个位存到显示缓冲区DispBuffer[7]=(unsignedchar)(humi_val.f*10)%10;//把湿度的十分位存到显示缓冲区}else{//处于设置模式if(Left==0){Delay(5000);//左移按键按下if(Left==0){n--;//设置的位向移左一位n&=0x03;//移到最左时,再移一次从最右开始左移for(i=0;i<4;i++)DispBuffer[i]=SetTemp_bit[i];//把“设定温度”值放到显示缓冲区while(StartSet==0)Display();//当按键没释放时显示设定的温度}}if(Right==0){55 附录IDelay(5000);if(Right==0)//右移按键按下{n++;//设置的位向右移一位n&=0x03;for(i=0;i<4;i++)DispBuffer[i]=SetTemp_bit[i];while(StartSet==0)Display();}}if(Plus==0){Delay(5000);//增加按键按下if(Plus==0){SetTemp_bit[n]++;//“设定温度”值加一for(i=0;i<4;i++)DispBuffer[i]=SetTemp_bit[i];while(StartSet==0)Display();}}if(Minus==0){Delay(5000);if(Minus==0)//减少按键按下{DispBuffer[n]--;for(i=0;i<4;i++)DispBuffer[i]=SetTemp_bit[i];//“设定温度”值减一while(StartSet==0)Display();}}if(FinishSet==0){Delay(5000);if(FinishSet==0){55 附录ISetFlag=0;//退出设置模式n=0;for(i=0;i<4;i++)DispBuffer[i]=SetTemp_bit[i];//按键释放前仍显示“设定温度”值while(StartSet==0)Display();}}}if(StartSet==0){Delay(5000);if(StartSet==0)//进入设置模式{SetFlag=1;//设置按键使能n=0;for(i=0;i<4;i++)DispBuffer[i]=SetTemp_bit[i];while(StartSet==0)Display();}}Display();//显示“显示缓冲区”的内容SetTemp=SetTemp_bit[0]*100+SetTemp_bit[1]*10+SetTemp_bit[3]+SetTemp_bit[4]*0.1;//转换设定温度为一个浮点数。if(temp_val.f-SetTemp>0.5)//当前温度比设定温度高0.5度以上{if(Tcount%5==0){SignalLED=~SignalLED;//LED灯隔250ms闪一次Beeper=~Beeper;//蜂鸣器每隔250ms响一次}CoolDown();//制冷片制冷}elseif(temp_val.f-SetTemp<-0.5){if(Tcount%5==0)//当前温度比设定温度低0.5度以上{SignalLED=~SignalLED;//LED灯隔250ms闪一次55 附录IBeeper=~Beeper;//蜂鸣器每隔250ms响一次}HeatUp();//制冷片加热}}}55 致谢附录II设计电路图55 致谢55 致谢55 第五章(标题)致谢毕业设计已经完成,回首这三个月时间,我感慨万千。本设计不仅仅有我的努力和汗水,同时也包含了各个方面给予的支持和指导。在此我对他们表示发自内心深深的感谢。首先我要感谢曾教导我单片机课程的老师,同时也是我的指导老师,王克英老师。谢谢他一直以来给予的支持和指导,特别是在这三个月以来,为我解决了很多关于本设计遇到的难题和疑惑。其次我要感谢我的舍友许垂晓同学,谢谢他在我设计程序部分给予的帮助和指导。在他的帮助下我完成了令我满意的软件编程部分。再次,我要感谢大学的图书馆,让我找到足够的相关书籍,有机会学习到有关的的知识完成本设计。最后,我要感谢我的亲人对我精神的支持,还有关心和帮助我的各位老师同学们。谢谢你们给予我的鼓励和支持。55'