基于AT89C51单片机温湿度显示报警系统设计 1 引言
1.1 选题背景
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快[1]。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势[2]。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法[3]。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命[4]。
单片机模块中最常见之一的是传感器,温湿度显示报警系统是一种基于单片机的用数字电路技术实现温湿度控制的装置,在实践社会生产当中拥有广泛的应用。
1.2 目的和意义
随着社会的发展,人们对时间和环境中的温度及湿度的要求越来越高,尤其在日
常的生活中和人们的生活和健康有着紧密的联系,特别是当人们乘坐公共交通工具时,温湿度以及实时时间和人们的出行都有着密切的联系。温湿度控制在日常生活中使用比较普遍, 如各种仪器控制箱、温室或生产车间的温度湿度控制、空调列车车厢空气环境的控制等[5]。常见的低端产品多采用机械指针式或水银柱式温湿度计, 体积小、质量轻、价格低、安装简便。但是, 此类产品测量精度低, 没有LED 显示屏, 不能向智能化方向发展, 不利于进行功能扩展,如不能自动报警[6]。
目前,虽然在工业生产中和科研实验中通过对温湿度测量来进行自动控制的设备越来越普及,应用场合也越来越多。但是,随之而来的问题是如何能够测得精确的温湿度以保证自动控制设备能够正确地发出控制指令来控制生产过程。另一方面,如果温度或者湿度过高过低可能会对一些设备中的一些半导体元器件造成损坏[7]。因此,对于自动
第1页(共43页)
基于单片机温湿度显示报警系统设计
温湿度报警的需求也在逐渐增加。本文基于以上方面的考虑,研究并设计了一种基于单片机的自动温湿度显示与报警系统。
一般温湿度控制系统中的温湿度测量均采用热敏电阻与湿敏电容,这种传统的模拟式温湿度传感器一般都需要设计信号调理电路并经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复性、互换性等方面也存在一定问题[8]。这种传感器只适合那些测量点数较少,对精度要求不高的场合。因此设计出一款基于单片机的精度高、稳定性好、成本低的温湿度显示报警系统具有重要实际意义。
1.3 技术要求和设计范围
现代社会越来越多的实验都要求在严格的环境条件下完成,而温度和湿度是实验室最基本的环境条件,也是对实验影响较大的因素。一般温湿度控制系统中的温湿度测量均采用热敏电阻与湿 敏电容[9],这种传统的模拟式温湿度传感器一般都需要设计信号调理电路并经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复性、互换性等方面也存在一定问题。这种传感器只适合那些测量点数较少,对精度要求不高的场合。因此设计出一款精度高、稳定性好、成本低的温湿度检测控制系统将具有一定的市场。本系统采用具有高精度[10]、防干扰等优点的数字式传感器 SHT11,不需要外部元件,可适配各种单片机。这为开发新一代的温湿度测控系统提供了有利条件,同时也有助于将温湿度测控技术提高到新的水平。
1.4 发展现状
单片机诞生于20世纪70年代末,经历了SCM、MCU、SOC三大阶段[11]。(1)SCM即单片微型计算机阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。―创新模式‖获得成功,奠定了SCM与通用计算机完全不同的发展道路。(2)MCU即微控制器阶段[12],主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。(3)单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素[13],就是寻求应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SOC化趋势。随着微电子技术、IC设计、EDA工具的发展[14],基于SOC的单片机应用系统设计会有较大的发展。
第2页(共43页)
方案论证
智能温度传感器在20世纪90年代中期问世。它是微电子技术、计算机技术和自动测试技术的结晶。目前,国际上已开发出多种智能温度传感器系列产品。智能温度传感器内部包含温度传感器、A/D传感器[15]、信号处理器、存储器和接口电路。有的产品还带多路选择器、中央控制器、随机存取存储和只读存储器。智能温度传感器能输出温度数据及相关的温度控制量,适配各种微控制器,并且可通过软件来实现测试功能,温度计也越来越智能化。
跟电子温度计一样湿度计随着湿度传感器的发展趋于成熟。随着智能检测系统的飞速发展,基于单片机的温湿度检测系统将多传感器系统结合在一起。如何把多传感器集中于一个检测控制系统,综合利用来自多传感器的信息,获得对被测对象的可靠了解和解释,以利于系统做出正确的响应、决策和控制以及报警,是智能检测控制统中需要解决的重要问题。
2 方案论证
2.1 方案设计思路
温湿度报警系统的设计以单片机AT89C51为核心,通过控制单片机的P1口的一些端口来调节当前温湿度的显示,完成了温湿度的显示报警功能,在程序中设置温湿度范围后,达到指定范围后让LED灯的闪亮来实现温湿度控制的效果,让LED1602液晶屏接到单片机的串口上,赋值来控制1602的显示。因此,整个方案设计包含四个部分,即:单片机最小系统部分、显示部分、温湿度数据采集部分、报警部分。
2.2 方案选择
方案:单片机编程,用单片机设计电路,充分利用好AT89C51单片机的I/O口,使用软硬件结合的方式,具体的基本框图如图[16]1所示:
被测对温 湿度 传感 器 图1 单片机设计电路的基本框图
第3页(共43页)
单片机 AT89S51 显示部分 象
报警部分 基于单片机温湿度显示报警系统设计
方案选择:从上述原理图看来,这种设计方案电路结构简单,条理清晰,调试也相对方便,易于实现。
2.3 设计流程
对于温湿度显示报警系统的设计,先用PROTEUS做电路仿真,再在KEIL软件中编写程序生成源代码,最后将PROTEUS和KEIL连接起来进行在线仿真。设计流程如图[17]2所示。
基于proteus仿真 源程序设计生成目标代码 Proteus电路设计 图2 系统设计流程图
2.4 软件环境
2.4.1 PROTEUS软件
本设计主要用Proteus7.5电子设计软件进行电子线路的设计和仿真。Proteus软件的功能很强大,它不仅可以在线仿真模拟电子,数字电子和单片机,还可以将设计直接转换成PCB版图[18],因此,受到众多电子工程师的喜爱。电路原理图的设计是仿真中的第一步,也是非常重要的一步。电路原理图设计得好坏将直接影响到后面的工作。首先,原理图的正确性是最基本的要求,因为在一个错误的基础上所进行的工作是没有意义的;其次,原理图应该布局合理,这样不仅可以尽量避免出错,也便于读图、便于查找和纠正错误;最后,在满足正确性和布局合理的前提下应力求原理图的美观。电路原理图的设计过程可分为以下几个步骤:
(1)置电路图纸参数及相关信息
根据电路图的复杂程度设置图纸的格式、尺寸、方向等参数以及与设计有关的信息,为以后的设计工作建立一个合适的工作平面。
(2)装入所需要的元件
第4页(共43页)
方案论证
将所需的元件装入设计系统中,以便从中查找和选定所需的元器件。 (3)设置元件
将选定的元件放置到已建立好的工作平面上,并对元件在工作平面上的位置进行调整,对元件的序号、参数、显示状态等进行定义和设置,以便为下一步的仿真工作打好基础。
(4)连线电路图
利用Proteus所提供的各种工具、命令进行画图工作,将事先放置好的元器件用具有电气意义的导线、网络标号等连接起来,布线结束后,一张完整的电路原理图基本完成。
(5)调整、检查和修改
利用Proteus所提供的各种工具对前面所绘制的原理图做进一步的调整和修改。 (6)补充完善
对原理图做一些相应的说明、标注和修饰,增加可读性和可观性。 (7)仿真
这部分工作主要是对设计完成的原理图结合KEIL在线仿真,调试并修改程序。 2.4.2 Keil C51软件
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种Keil软件图标是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂
第5页(共43页)
基于单片机温湿度显示报警系统设计
商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
下面详细介绍Keil C51开发系统各部分功能和使用。
(1)Keil C51单片机软件开发系统的整体结构:C51工具包的整体结构,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
(2)使用独立的Keil仿真器时,注意事项:仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。 仿真器上的复位按钮只复位仿真芯片,不复位目标系统。 仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。
3 过程论述
3.1 AT89C51单片机最小系统
3.1.1 AT89C51单片机最小系统原理图
最小系统包括晶体振荡电路、复位开关和电源部分[19]。下面图3为AT89C51单片机的最小系统电路图。
第6页(共43页)
过程论述
图3 单片机最小系统电路图
3.1.2 电源引脚
Vcc 40 电源端 GND 20 接地端
工作电压为5V,另有AT89LV51工作电压则是2.7-6V, 引脚功能一样。 3.1.3 外接晶体引脚
XTAL1 19 XTAL2 18
第7页(共43页)
基于单片机温湿度显示报警系统设计
图4 晶振连接的内部、外部方式图
晶振连接的内部、外部方式如上图4所示。XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。AT89单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22μF。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。 3.1.4 复位
RST 9
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。复位是由外部的
第8页(共43页)
过程论述
复位电路来实现的。片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路。当时钟频率选用6MHz时,C取22μF,Rs约为200Ω,Rk约为1K。复位操作不会对内部RAM有所影响。
常用的复位电路如下图6所示:
图5 常用复位电路图
3.1.5 输入输出引脚
(1) P0端口[P0.0-P0.7] P0是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端。作为输出口时能驱动8个TTL。
对内部Flash程序存储器编程时,接收指令字节;校验程序时输出指令字节,要求外接上拉电阻。
在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,访问期间内部的上拉电阻起作用。
(2) P1端口[P1.0-P1.7] P1是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接收低8位地址信息。
第9页(共43页)
基于单片机温湿度显示报警系统设计
(3) P2端口[P2.0-P2.7] P2是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收高8位地址和控制信息。
在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
(4) P3端口[P3.0-P3.7] P2是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接控制信息。除此之外P3端口还用于一些专门功能,具体如下表1。
表1 P3端口引脚兼用功能表
P3引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 兼用功能 串行通讯输入(RXD) 串行通讯输出(TXD) 外部中断0( INT0) 外部中断1(INT1) 定时器0输入(T0) 定时器1输入(T1) 外部数据存储器写选通WR 外部数据存储器写选通RD 3.2 LCD1602显示系统
3.2.1 LCD1602显示系统
液晶显示器普遍地用于直观地显示数字系统或字符的运行状态和工作数据,按照材料及产品工艺[20],单片机应用系统中常用的显示器有: 发光二极管LED显示器、液晶LCD显示器、CRT显示器等。LCD显示器是现在最常用的显示器之一,其仿真电路图如下所示。
第10页(共43页)
过程论述
图6 LED1602显示器的符号
3.2.2 液晶显示器简介
(1) 在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器有以下几个优点:
显示质量高——由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,
恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。
数字式接口——液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作
更加方便。
体积小、重量轻——液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的
目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低——相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因
而耗电量比其它显示器要少得多。
第11页(共43页)
基于单片机温湿度显示报警系统设计
(2)液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 (3)液晶显示器的分类:液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。 (4) 一般1602字符型液晶显示器实物如图所示[21]: 图7 型液晶显示器实物图
3.2.3 LCD1602引脚功能说明
1602LCD 采用标准的14 脚(无背光)或16 脚(带背光)接口,各引脚接口,编号符号引脚说明如下所示:
第1 脚:VSS 为地电源。 第2 脚:VDD 接5V 正电源。
第3 脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生―鬼影‖,使用时可以通过一个10K 的电位器调整对比度。
第4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和R/W共同为低电平时可以写入指令或者显示地址,当RS 为低电平R/W 为高电平时可以读忙信号,当RS 为高电平R/W 为低电平时可以写入数据。
第6 脚:E 端为使能端,当E 端由高电平跳变成低电平时,液晶模块执行命令。
第12页(共43页)
过程论述
第7~14 脚:D0~D7 为8 位双向数据线。 第15 脚:背光源正极。 第16 脚:背光源负极。 3.2.4 LCD1602的指令说明及时序
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平) 指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏上所有文字是否左移或者右移。高电平表示有效,低电平则无效。 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。 1602液晶模块内部的控制器共有11条控制指令,如表2所示。 表2 1602液晶模块内部的控制器的11条控制指令 序号 1 2 指令 清显示 光标返回 RS R/W D7 0 0 0 0 0 0 D6 0 0 D5 0 0 D4 0 0 D3 0 0 D2 0 0 D1 0 1 D0 1 * 第13页(共43页)
基于单片机温湿度显示报警系统设计
3 4 5 6 7 8 9 10 11 置输入模式 显示开/关控制 光标或字符移位 置功能 置字符发生存贮器地址 置数据存贮器地址 读忙标志或地址 写数到CGRAM或DDRAM) 从CGRAM或DDRAM读数 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 BF 0 0 0 0 1 0 0 0 1 0 0 1 DL 0 1 1 D I/D C * * S B * * S/C R/L N F 字符发生存贮器地址 显示数据存贮器地址 计数器地址 要写的数据内容 读出的数据内容 基本操作时序表与读写操作时序如表3和图8,9所示。
表3 基本操作时序表 读状态 写指令 读数据 写数据 输入 输入 输入 输入 RS=L,R/W=H,E=H RS=L,R/W=L,D0—D7=指令码,E=高脉冲 RS=H,R/W=H,E=H RS=H,R/W=L,D0—D7=数据,E=高脉冲 输出 输出 输出 输出 D0—D7=状态字 无 D0—D7=数据 无 第14页(共43页)
过程论述
图8 读操作时序
图9 写操作时序
3.2.5 程序流程图(详细程序见附录)
第15页(共43页)
基于单片机温湿度显示报警系统设计
开始 LCD初始化 延时 显示第二 行内容 图10 程序流程图
设第二行 显示位置 显示第一 行内容 设第一行 显示位置 3.3 SHT10传感器
3.3.1 温湿度传感器电路图
图11 温湿度传感器电路图
第16页(共43页)
过程论述
3.3.2 产品简介
SHT10属于Sensirion温湿度传感器家族中的贴片封装系列[22]。传感器将传感元件和信号处理电路集成在一块微型电路板上,输出完全标定的数字信号。传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上,与14 位的A/D 转换器以及串行接口电路实现无缝连接。因此,该产品具有品质卓越、响应迅速、抗干扰能力强、性价比高等优点。传感器芯片此说明书适用于SHT1x-V4。SHT1x-V4 是第四代硅传感芯片,除了湿度、温度敏感元件以外,还包括一个放大器,A/D 转换器,OTP 内存和数字接口。材质传感器的核心为CMOS芯片,外围材料顶层采用环氧LCP ,底层为FR4。传感器符合ROHS 和WEEE 标准,因此不含Pb, Cd, Hg, Cr(6+), PBB,PBDE。 3.3.3 SHT10引脚
图12 SHT10引脚图
(1)电源引脚VDD、GND
SHT10的供电电压范围为2.4-5.5V, 建议供电电压为3.3V。在电源引脚(VDD,GND)之间须加一个100nF的电容,用以去耦滤波。SHT10 的串行接口,在传感器信号的读取及电源损耗方面,都做了优化处理;传感器不能按照I2C协议编址,但是,如果I2C 总线上没有挂接别的元件,传感器可以连接到I2C 总线上,但单片机必须按照传感器的协议工作。
(2)串行时钟输入SCK
SCK 用于微处理器与SHT10 之间的通讯同步。由于接口包含了完全静态逻辑,
第17页(共43页)
基于单片机温湿度显示报警系统设计
因而不存在最小SCK频率。
(3)串行数据 DATA
DATA 引脚为三态结构,用于读取传感器数据 . 当向传感器发送命令时, DATA 在SCK 上升沿有效且在SCK 高电平时必须保持稳定。DATA 在SCK 下降沿之后改变。为确保通讯安全,DATA 的有效时间在SCK 上升沿之前和下降沿之后应该分别延长至 TSU and THO – 参见图 11。 当从传感器读取数据时, DATA TV 在 SCK 变低以后有效,且维持到下一个SCK 的下降沿 。为避免信号冲突,微处理器应驱动DATA 在低电平。需要一个外部的上拉电阻(例如:10kΩ)将信号提拉至高电平。上拉电阻通常已包含在微处理器的I/O 电路中加重的DATA线由传感器控制,普通的DATA 线 由单片机控制. 有效时间依据SCK 的时序.
图13 时序图
图14 启动传输时序图
后续命令包含三个地址位(目前只支持000‖),和五个命令位。SHT1x 会以下
第18页(共43页)
过程论述
述方式表示已正确地接收到指令:在第8 个SCK 时钟的下降沿之后,将DATA 下拉为低电平(ACK 位)。在第9 个SCK时钟的下降沿之后,释放DATA(恢复高电平)。 3.3.4 传感器的通讯
(1)启动传感器
首先,选择供电电压后将传感器通电,上电速率不能低于1V/ms。通传感器需要11ms 进入休眠状态,在此之前不允许对传感器发送任何命令。 (2 )发送命令
用一组― 启动传输‖时序,来完成数据传输的初始化。它包括:当SCK 时钟高电平时DATA 翻转为低电平,紧接着SCK 变为低电平,随后是在SCK时钟高电平时DATA 翻转为高电平。参见图12。\"启动传输\" 时序后续命令包含三个地址位(目前只支持000‖),和五个命令位。SHT1x 会以下述方式表示已正确地接收到指令:在第8 个SCK 时钟的下降沿之后,将DATA 下拉为低电平(ACK 位)。在第9 个SCK时钟的下降沿之后,释放DATA(恢复高电平)。命令 代码预留 0000x温度测量00011湿度测量00101读状态寄存器 00111写状态寄存器 00110预留 0101x-1110x软复位, 接口复位, 状态寄存器复位即恢复为默认状态.在要发送下一个命令前,至少等待11ms.
(3)温湿度测量[23]
发布一组测量命令(‗00000101‘表示相对湿度RH,‗00000011‘表示温度T)后,控制器要等待测量结束。这个过程需要大约20/80/320ms,分别对应8/12/14bit 测量。确切的时间随内部晶振速度,最多可能有-30%的变化。SHT1x 通过下拉DATA 至低电平并进入空闲模式,表示测量的结束。控制器在再次触发SCK 时钟前,必须等待这个―数据备妥‖信号来读出数据。检测数据可以先被存储,这样控制器可以继续执行其它任务在需要时再读出数据。接着传输2 个字节的测量数据和1 个字节的CRC 奇偶校验(可选择读取)。uC 需要通过下拉DATA为低电平,以确认每个字节。所有的数据从MSB开始,右值有效(例如:对于12bit 数据,从第5 个SCK 时钟起算作MSB;而对于8bit 数据,首字节则无意义)。在收到CRC 的确认位之后,表明通讯结束。如果不使用CRC-8 校验,控制器可以在测量值LSB后,通过保在测量和通讯结束后,SHT1x 自动转休眠模式。
(4)通讯复位时序
第19页(共43页)
基于单片机温湿度显示报警系统设计
如果与SHT1x 通讯中断,可通过下列信号时序复位:当DATA 保持高电平时,触发SCK 时钟9 次或更多,参阅图13。接着发送一个―传输启动‖时序。这些时序只复位串口,状态寄存器内容仍然保留。
图15 复位时序
(5)CRC-8 Checksum 计算
数据传输的可靠性由CRC-8 的校验来保证. 它确保可以检测并去除所有错误数据。状态寄存器SHT1x 的某些高级功能可以通过给状态寄存器发送指令来实现,如选择测量分辨率,电量不足提醒或启动加热功能等。在读状态寄存器或写状态寄存器之后,8 位状态寄存器的内容将被读出或写入,如图所示。
图16 8位状态寄存器的内容
3.3.5 信号转换
(1)相对湿度
第20页(共43页)
过程论述
湿度的非线性补偿请参阅下图 ,为获得精确的测量数据,建议用以下公式进行信号转换。
linear 1 2 RH 3 RH RH = c + c ⋅SO + c ⋅SO (%RH)
图17 从SORH 到相对湿度的转化
(2)湿度信号的温度补偿
由于实际温度与测试参考温度25℃ (~77℉)的显著不同, 湿度信号需要温度补偿。温度校正粗略对应于0.12%RH/℃@50%RH。
true C 1 2 RH linear RH = T − 25 ⋅ t + t ⋅SO + RH °
温度由能隙材料PTAT (正比于绝对温度) 研发的温度传感器具有极好的线性。可用如下公式将数字输出(SOT)转换为温度值,温度转换系数如下图所示。
1 2 T T = d + d ⋅SO
图18 温度转换系数1
(3)露点
SHT1x 并不直接进行露点测量,,但露点可以通过温度和湿度读数计算得到.。由于温度和湿度在同一块集成电路上测量,SHT1x 可测量露点。露点的计算方法很多,
第21页(共43页)
基于单片机温湿度显示报警系统设计
绝大多数都很复杂。 对于-40 – 50°C 温度范围的测量,通过下面的的公式可得到较好的精度,参数见下图所示。
图19 露点(Td)计算参数
3.3.6 环境稳定性
如果传感器用于装备或机械中,要确保用于测量的传感器与用于参考的传感器感知的是同一条件的温度和湿度。如果传感器被放置于装备中,反应时间会延长,因此在程序设计中要保证预留足够的测量时间。传感器在其它测试条件下的性能,我们不予保证,尤其是在用户需要的特定场合。 3.3.7 传感器原理流程图如下
开始 温湿度采集 温湿度转换 数据处理 温湿度判断 否 是否异常? 是 报警输出 图20 传感器原理流程图
第22页(共43页)
仿真与调试
3.4 报警系统
3.4.1 报警电路图
当启动仿真程序时,用手调节传感器上的按键时,可以调节温度与湿度的数据转换和相应的温湿度显示数据的递增或递减。(详细编写程序见附录)
图21 报警电路图
4 仿真与调试
4.1 实验目的与原理
在此介绍一下我设计温湿度控制系统的工作原理:
论文目标:温度范围18-27度, 湿度40%-70%。 超范围报警 具体要求:(1)传感器采用SHT10集成传感器 (2)LED温湿度显示,精确到一位小数 (3)超范围发光二极管报警
第一步:实现将sht10中的数据读入到单片机中然后显示到1602上
第二步:调节sht10上的数据为n,若n在温度18-27范围内则正常显示到1602上,若超出范围则报警,二极管点亮(红);同理,若n在湿度40%-70%范围内则正常显示到1602上,若超出范围则报警,二极管点亮(绿).
4.2 仿真原理图
用PROTUES软件,根据要求画出温湿度显示报警系统的的原理图如下图
第23页(共43页)
基于单片机温湿度显示报警系统设计
图22 温湿度显示报警系统的的原理图
4.3 系统仿真以及显示结果
用protues和keil软件联调,运行期间仿真软件调试程序结果如图23所示,当调节传感器使湿度在87%时,1602显示湿度为91.88%,中间产生了部分误差,在误差允许范围之内,湿度超出设置范围,红灯亮,开始报警,运行结果如图24,25,26所示;当调节传感器使温度在29度时,1602显示温度为28.84度,中间产生了部分误差,在误差允许范围之内,温度超出设置范围,绿灯亮,开始报警,运行结果如图24,25,26所示;
第24页(共43页)
仿真与调试
图23 仿真运行结果图
图24 SHT10运行结果图
图25 报警运行结果图 第25页(共43页)
基于单片机温湿度显示报警系统设计
图26 LCD1602运行结果图
4.4 结果分析及测试总结
采用PROTEUS进行单片机仿真,可以大大缩短单片机的开发周期。它不仅能仿真单片机CPU 的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。本系统很好的完成了本次毕业设计的各项任务和要求,通过温湿度显示报警系统程序,成功的完成了温湿度采集功能、显示功能、报警功能。通过控制P1.0、P1.1、P1.2来调节当前温湿度数据的显示,很好的完成了显示功能。设置温湿报警范围后,LED灯也能很好的体现报警的效果,在超出设置的正常显示范围后,LED灯亮,很好的体现了报警功能。连接电路图后,通过编译程序来控制液晶显示屏的显示,通过仿真结果也很好的体现了其显示功能。
5 结束语
本文的温湿度显示报警系统设计是以单片机(AT89C51)为核心,SHT10温湿度感应器等部分组成。具体介绍Keil C51软件调试程序和Proteus的ISIS软件进行单片机系统的设计与仿真。在这次设计中,我完成了核心控制部分、显示部分、报警部分等基本功能。通过这次设计单片机有了一个更深的认识,对于LCD1602以及SHT10的使用过程有了一定的掌握,同时对Keil C51软件和Proteus软件有了更熟练的操作。本文设计到的内容还不是很完善,我会在以后的学习和工作中会做进一步的学习和探索,以取得更大的进步。但是通过这次毕业设计,我也学到了很多东西,感觉自己应
第26页(共43页)
参考文献
用基础知识及专业知识解决问题的能力有了很大的提高。总之,这次毕业设计收获还是蛮大的。
参考文献
[1]李洪超.基于AT89C51 的温度控制系统设计[J]. 微计算机信息(嵌入式与SOC),2010.8,26(12-2):87~88
[2]周乐安.基于MSP430 单片机温湿度控制器[J].四川兵工时报,2008.8,29(2):113~114 [3]杨学存,侯媛彬.基于MSP430单片机温湿度控制器的实现[J].煤矿机械,2005.6,(9),64~65 [4]钟晓伟,宋蛰存.基于单片机的实验室温湿度控制系统设计[J].林业机械与木工设备2010.8,38(1):39~42
[5]刘攀,俞杰,张海明.基于单片机的温度测控系统[J].兰州交通大学学报( 自然科学版),2005.9,24(6):103~106
[6]朱魏峰.基于单片机的温度监控系统[J].工业控制计算机,2011.6,24(10):91~92 [7]张为.基于单片机的温湿度测量系统设[J].阴山学刊,2010.6,24(3):26~29 [8]张妮,段文强,邵婷婷.基于单片机的温湿度监控系统设计[J]. 延安大学学 ( 自然科学版),2010.5,29(2):50~52
[9]刘翔.基于单片机的自动温度测量报警系统设计[J].电子设计工程,2011.8,19(1):125~127 [10]章昕,黄秋,汤彬,方方.智能温度报警系统的研制[J].自动化技术与应用,2009.4,28(7):103~105 [11]郑冬强,万琰,张平川.基于uC /OS - II的温湿度测控系统设计与实现[J].微计算机信息(嵌入式与SOC),2009.5,25(1-2): 68~69
[12]方言,王晓明.一种智能温湿度控制器的设计[ J].智能仪器仪表,2006(10): 66~67
[13]余泽辉,伍建军,陈洁.基于单片机的数字温度计的研究与设计[J].黑龙江工程学院学报( 自然科学版),2007.6,(12): 15~16
[14]罗兴垅,黄隆盛.基于AT89C51控制的0.01℃数显温度计的设计[J].微计算机信息,2006.3,22(5):70~72
[15]闫怀兵,李维宁.如何选用湿度传感器产品[J].制造业自动化,1999.5,(5):10~15 [16]严怀龙.基于单片机的数据采集系统[J].广西轻工业,2006.8,(6):34~35
[17]江太辉,邓展威.DS18B20数字式温度传感器的特性与应用[J].电子技术,2003.7,(12): 56~58 [18]张娟,陈杰,蔡振江.基于多传感器数据融合的温室温度采集[J].微计算机信息2007.2,27(1-1):153~154
[19]顾启民,吕庭.单片机系统中复位电路可靠性设计[J].电子测量技术,2001.7,(3):25~26 [20]何立民.单片机应用系统设计[M].北京,北京航空航天出版社,l990 [21]张立科.单片机通信技术与工程实践[M].北京:人民邮电出版社,2005:109~111
第27页(共43页)
基于单片机温湿度显示报警系统设计
[22]李光弟,朱秀月,王秀山.单片机基础[M].(修订本).北京:北京航空航天大学出版社, 2001 [23]丁明亮,唐前辉.51单片机应用设计与仿真[M].北京:北京航空航天大学出版社,2009
第28页(共43页)
致谢
第29页(共43页)
基于单片机温湿度显示报警系统设计
附录:
/*************端口定义******************** P1.0------SCK (SHT10)
P1.1------DATA (SHT10)
P0------DB0~DB7 (LCD1602)
P2.0------RS (LCD1602) P2.1------RW (LCD1602) P2.2------E (LCD1602) *****************************************/ #include #define uchar unsigned char #define uint unsigned int #define TEMPUP 28 //温度上限 #define TEMPDOWN 17 //温度下限 #define HUMDOWN 70 //湿度上限 #define HUMUP 40 sbit LcdRs= P2^0; //1602液晶端口定义 sbit LcdRw= P2^1; sbit LcdEn= P2^2; sbit led1 =P3^0; //报警灯端口定义 sbit led2=P3^4; 第30页(共43页) //湿度下限 附录 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; bit start; uchar str[7]; //向LCD写入命令或数据 ************************************************************ #define LCD_COMMAND #define LCD_DATA 0 // Command 1 // Data #define LCD_CLEAR_SCREEN 0x01 // 清屏 #define LCD_HOMING //设置显示模式************************************************************ #define LCD_SHOW #define LCD_HIDE 0x04 //显示开 0x00 //显示关 0x02 //显示光标 0x00 //无光标 0x01 //光标闪动 0x00 //光标不闪动 0x02 // 光标返回原点 #define LCD_CURSOR #define LCD_NO_CURSOR #define LCD_FLASH #define LCD_NO_FLASH //设置输入模式************************************************************ #define LCD_AC_UP 0x02 0x00 // default #define LCD_AC_DOWN #define LCD_MOVE 0x01 // 画面可平移 0x00 //default #define LCD_NO_MOVE unsigned char LCD_Wait(void); void LCD_Write(bit style, unsigned char input); 第31页(共43页) 基于单片机温湿度显示报警系统设计 /***********1602液晶显示部分子程序****************/ void delay(uint z) { } void LCD_Write(bit style, unsigned char input) { } void LCD_SetDisplay(unsigned char DisplayMode) //设置输出 { } void LCD_SetInput(unsigned char InputMode) //设置输入 { LCD_Write(LCD_COMMAND, 0x08|DisplayMode); LcdRs=style; P0=input; delay(5); LcdEn=1; delay(5); uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); //延时函数 LcdEn=0; 第32页(共43页) 附录 } LCD_Write(LCD_COMMAND, 0x04|InputMode); void LCD_Initial() //初始化LCD函数 { 阵 } void GotoXY(unsigned char x, unsigned char y) //液晶字符输入的位置 { } void Print(unsigned char *str) //将字符输出到液晶显示 { while(*str!='\\0') { if(y==0) LCD_Write(LCD_COMMAND,0x80|x); LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点 if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40)); 第33页(共43页) 基于单片机温湿度显示报警系统设计 } } LCD_Write(LCD_DATA,*str); str++; void zhuanhuan(float a)//浮点数转换成字符串函数 { } void welcome() //初始界面函数 { } void delay_n10us(uint n) //延时n个10us@12M晶振 { uint i; for(i=n;i>0;i--) { LCD_Initial(); GotoXY(0,0); Print(\" Welcome! \"); GotoXY(0,1); Print(\" Code of sht10 \"); delay(200); memset(str,0,sizeof(str)); sprintf (str,\"%f\ 第34页(共43页) 附录 } _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); } /*********************第一部分LCD1602设置 END****************************************/ /*********************第二部分SHT10设置 START**************************************/ sbit SCK = P1^0; //定义通讯时钟端口 sbit DATA = P1^1; //定义通讯数据端口 typedef union { unsigned int i; //定义了两个共用体 float f; } value; enum {TEMP,HUMI}; //TEMP=0,HUMI=1 #define noACK 0 //用于判断是否结束通讯 #define ACK 1 //结束数据传输 //adr command r/w #define STATUS_REG_W 0x06 //000 0011 0 #define STATUS_REG_R 0x07 //000 0011 1 #define MEASURE_TEMP 0x03 //000 0001 1 #define MEASURE_HUMI 0x05 //000 0010 1 #define RESET 0x1e //000 1111 0 /****************定义函数****************/ 第35页(共43页) 基于单片机温湿度显示报警系统设计 void s_transstart(void); //启动传输函数 void s_connectionreset(void); //连接复位函数 char s_write_byte(unsigned char value);//SHT10写函数 char s_read_byte(unsigned char ack); //SHT10读函数 char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//测量温湿度函数 void calc_dht90(float *p_humidity ,float *p_temperature);//温湿度补偿 void s_transstart(void) //启动传输函数 // generates a transmission start // _____ ________ // DATA: |_______| // ___ ___ // SCK : ___| |___| |______ { DATA=1; SCK=0; //Initial state _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0; 第36页(共43页) 附录 } void s_connectionreset(void) //连接复位函数 // communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart // _____________________________________________________ ________ // DATA: |_______| // _ _ _ _ _ _ _ _ _ ___ ___ // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______ { unsigned char i; DATA=1; SCK=0; //Initial state for(i=0;i<9;i++) //9 SCK cycles { SCK=1; SCK=0; } s_transstart(); //transmission start } char s_write_byte(unsigned char value) // SHT10写字节函数 //---------------------------------------------------------------------------------- // writes a byte on the Sensibus and checks the acknowledge { unsigned char i,error=0; for (i=0x80;i>0;i/=2) //shift bit for masking { 第37页(共43页) 基于单片机温湿度显示报警系统设计 if (i & value) DATA=1; //masking value with i , write to SENSI-BUS else DATA=0; SCK=1; //clk for SENSI-BUS _nop_();_nop_();_nop_(); //pulswith approx. 3 us SCK=0; } DATA=1; //release DATA-line SCK=1; //clk #9 for ack error=DATA; //check ack (DATA will be pulled down by DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。 _nop_();_nop_();_nop_(); SCK=0; DATA=1; //release DATA-line return error; //error=1 in case of no acknowledge //返回:0成功,1失败 } /*****SHT10读函数 reads a byte form the Sensibus and gives an acknowledge in case of \"ack=1\"****/ char s_read_byte(unsigned char ack) { unsigned char i,val=0; DATA=1; //release DATA-line for (i=0x80;i>0;i/=2) //shift bit for masking { SCK=1; //clk for SENSI-BUS if (DATA) val=(val | i); //read bit _nop_();_nop_();_nop_(); //pulswith approx. 3 us SCK=0; 第38页(共43页) 附录 } if(ack==1)DATA=0; //in case of \"ack==1\" pull down DATA-Line else DATA=1; //如果是校验(ack==0),读取完后结束通讯 _nop_();_nop_();_nop_(); //pulswith approx. 3 us SCK=1; //clk #9 for ack _nop_();_nop_();_nop_(); //pulswith approx. 3 us SCK=0; _nop_();_nop_();_nop_(); //pulswith approx. 3 us DATA=1; //release DATA-line return val; } /* 测量温湿度函数 makes a measurement (humidity/temperature) with checksum */ char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) { unsigned error=0; unsigned int i; s_transstart(); //transmission start switch(mode){ //send command to sensor case TEMP : error+=s_write_byte(MEASURE_TEMP); break; case HUMI : error+=s_write_byte(MEASURE_HUMI); break; default : break; } for (i=0;i<65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement 第39页(共43页) 基于单片机温湿度显示报警系统设计 if(DATA) error+=1; // or timeout (~2 sec.) is reached *(p_value) =s_read_byte(ACK); //read the first byte (MSB) *(p_value+1)=s_read_byte(ACK); //read the second byte (LSB) *p_checksum =s_read_byte(noACK); //read checksum return error; } void calc_sht90(float *p_humidity ,float *p_temperature) //温湿度补偿函数 // calculates temperature [C] and humidity [%RH] // input : humi [Ticks] (12 bit) // temp [Ticks] (14 bit) // output: humi [%RH] // temp [C] { const float C1=-4.0; // for 12 Bit const float C2=+0.0405; // for 12 Bit const float C3=-0.0000028; // for 12 Bit const float T1=+0.01; // for 14 Bit @ 5V const float T2=+0.00008; // for 14 Bit @ 5V float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit float t=*p_temperature; // t: Temperature [Ticks] 14 Bit float rh_lin; // rh_lin: Humidity linear float rh_true; // rh_true: Temperature compensated humidity float t_C; // t_C : Temperature [C] t_C=t*0.01 - 40; //calc. temperature from ticks to [C] rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH] rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity 第40页(共43页) 附录 [%RH] if(rh_true>100)rh_true=100; //cut if the value is outside of if(rh_true<0.1)rh_true=0.1; //the physical possible range *p_temperature=t_C; //return temperature [C] *p_humidity=rh_true; //return humidity[%RH] } /**************第二部分SHT10设置 END*****************************/ /***************************主函************************************/ void main(void) { value humi_val,temp_val; unsigned char error,checksum,i; LcdRw=0; led1=0; led2=0; start=0; s_connectionreset(); welcome();//显示欢迎画面 delay(2000); LCD_Initial(); while(1) { error=0; error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); if(error!=0) 第41页(共43页) 基于单片机温湿度显示报警系统设计 s_connectionreset(); //in case of an error: connection reset else { humi_val.f=(float)humi_val.i; //converts integer to float temp_val.f=(float)temp_val.i; //converts integer to float calc_sht90(&humi_val.f,&temp_val.f); //计算湿度与温度 GotoXY(0,0);// Print(\"Tep:\"); GotoXY(0,1); Print(\"Hum:\"); zhuanhuan(temp_val.f); //转换温度为uchar方便液晶显示 GotoXY(5,0); str[5]=0xDF;//℃的符号 str[6]=0x43; str[7]='\\0'; Print(str); if( temp_val.f>TEMPUP-1 || temp_val.f led1=0; zhuanhuan(humi_val.f);//转换湿度为uchar方便液晶显示 GotoXY(5,1); str[5]='%';//%的符号 str[6]='\\0';//字符串结束标志 Print(str); if( humi_val.f>HUMUP-1 || humi_val.f 第42页(共43页) 附录 led2=0; } delay_n10us(80000); //延时约0.8s } } 第43页(共43页) 因篇幅问题不能全部显示,请点此查看更多更全内容