基于51单片机的智能窗户设计
【摘 要】 随着电子技术的发展和人民生活水平的不断提高,智能窗已经越来越
多地被用到了现代智能化建筑中,提供住户一个安全、方便的环境。据统计,在未来的几年内,安装智能窗的用户将不断增加。本次设计的智能窗户系统能通过其数据检测传感电路不断循环检测室外湿度及温度,当室外湿度达到一定时(下雨时)窗户自动关闭,防止潮湿空气或雨水进入房间;另外可设置自动关闭窗户或开启窗户时间,到了设定时间会自动关闭或开启窗户;可设置是否自动根据湿度变化自动开启关闭窗户或者根据设置时间自动开启或者关闭窗户。
【关键词】智能窗户; 单片机; 温度检测;湿度检测;
【Abstract】 With the development of electronic technology and the
continuous improvement of people's living standard, the intelligent window has been increasingly used in modern intelligent building, to provide a safe, convenient resident environment. According to statistics, in the next few years, the installation of smart windows users will continue to increase. The design of intelligent window system through the data detecting sensing circuit continuous detection of circulating outside humidity and temperature, when the outside humidity reaches a certain time ( when it rains ) close the window automatically, prevent the moist air or water into the room; also can be set to automatically close the windows or window opening time, to set the time automatically open or close the window; you can set whether to automatically according to the changes of temperature and humidity automatically open and close the windows or according to the set time automatically open or close the window; when the window outside the person near infrared alarm to be generated when the anti-theft function. Also can control the keyboard, directly control window switch, select the display parameter types.
【Key words】 intelligent window single chip microcomputer temperature
detection humidity detection
目录
第1章 绪论 ........................................................................................................................................................ 2
1.1 智能窗户综述..................................................................................................................................... 2 1.2 智能窗户研究现状 ............................................................................................................................. 2 第2章 设计的目标任务..................................................................................................................................... 4
2.1 本文主要工作设计 ............................................................................................................................. 4 2.2论文的要求与数据 ................................................................................................................................ 4 第3章 设计方案论证................................................................................................................................... 5
3.1 温湿度检测方案................................................................................................................................... 5 3.2 窗户控制系统设计方案 ....................................................................................................................... 6 3.3 限位开关控制系统设计方案 ............................................................................................................... 7 第4章 硬件电路设计......................................................................................................................................... 8
4.1 最小系统电路设计 ............................................................................................................................. 8 4.2温湿度检测电路设计 ............................................................................................................................ 8 4.3电机驱动电路设计 .............................................................................................................................. 11 4.4 显示电路设计..................................................................................................................................... 11 4.5时钟电路设计...................................................................................................................................... 12 4.6 光电开关电路设计 .............................................................................................................................. 13 4.7按键电路的设计.................................................................................................................................. 14 第5章 软件设计 ............................................................................................................................................ 15
5.1 主程序流程图................................................................................................................................... 15 5.2 各部分子程序................................................................................................................................... 15 第6章 系统组装与调试................................................................................................................................. 19
6.1 基本电路板检查................................................................................................................................. 19 6.2 主控模块调试..................................................................................................................................... 19 6.3 软件调试 ............................................................................................................................................ 19 6.4数据整理 ............................................................................................................................................. 19 结束语和致谢语 ................................................................................................................................................ 21 参考文献 ............................................................................................................................................................ 22 附(一):原理图 ............................................................................................................................................ 23 附(二):PCB板 ............................................................................................................................................. 24 附(三):程序 ................................................................................................................................................ 25
1
第1章 绪论
1.1 智能窗户综述
智能窗户一般是指安装了先进的防盗、防劫、防雨系统技术的门窗。
起初智能窗户在一些公共场所、高档商品房、商场中运用广泛,但随着科学技术的飞跃发展,生活水平的不断提高,人们对安全、舒适、健康的生活需求变得日益迫切。而近年来,智能家居概念已经逐渐深入到国民的生活之中,且不断地影响着人们的思维。因此,众多有能力的小区、别墅用户已经开始安装使用智能家居系统,并尝试智能化为家居生活带来的安全、舒适和便利。智能窗户提供住户一个安全、方便的环境。据统计,在未来的几年内,安装智能窗的用户将不断增加。全自动智能窗户要求遇刮风或飘雨,窗户会自动关闭;窗户就自动打开;高高在上的天窗,也乖乖听从指挥开启闭合,免去攀高之累。
最新科技的智能窗户控制系统它由智能主控器、门窗控制器、门窗驱动器等组成,是智能居家的理想选择。要求具备以下功能:
①安全
在工作日,上下班时间基本都是固定的。你可以设定窗户开关的时间,上班时窗户自动关闭下班时自动打开,方便安全。
②自动防风防雨
居家过日子,忘记关窗是常有的事,每逢刮风下雨身在外边便叫苦不已。现在,这款产品可以消除您的这个顾虑了,它外侧装有湿度传感器,当空气里的湿度达到80%时湿度传感器上就会有感应,窗户立即自行关闭,令您从此大胆出门无忧无虑。
③节约能源
当室外的温度超过30°时能关闭窗户并把空调打开,保持室内室温适宜。当室外温度下降到20°时,窗户自动打开并把空调关闭,保持室内空气清新,当然这一动作是以外界没有下雨为前提的。
④人性化
增加手动开窗、关窗功能,是产品更人性化。 1.2 智能窗户研究现状
由于我国房地产行业的迅速发展,也带动了我国门窗幕墙行业的迅速发展,一般来说,一个建筑物按面积推算,有10%是窗,15%是门,全国每年新建为20亿平方米,门窗的需求量为5亿多平方米。如再考虑到原有城乡建筑的窗户改制,每年窗户的安装量至少达到10亿平方米。以每平方米窗户50元计算,全国窗户消费需求空间为500亿元,并且还有不断扩大的趋势。如下图所示:
2
窗户需求(亿元)600400窗户需求(亿元)20002006年2007年2008年2009年 图1.1 2006年~2009年我国窗户需求量
门窗是家庭智能化安全防范系统的一个重要组成部分,是一种智能化的控制系统,它由现代微型机、先进传感器(温度传感器、湿度传感器等)、等一系列机械传动装置组成,是具有智能化、人性化、网络化的高科技产品。可以对窗户进行随心所欲的控制和安全措施,它具有时尚、方便、安全等特点,使人们的家居环境得到较大的改善。再者通过我们的调查发现目前整个市场上存在许多不足之处。
当前智能窗户的功能还不是很完善,虽然市场上有下雨时能自动关窗的装置,但在雨过天晴后并不能适时自动开窗。这就会让主人在下班回家后觉得屋内空气不流通、不清新等。因此,我以这次毕业设计为契机,改进了部分功能实现的方法,并增加了适时开窗的新功能,还把窗户和空调相结合。力求整个装置高效、简洁、易实现并突出节能环保的理念。
窗户之所以能自动开闭,关键是长条形装置内的一些元件、温湿度传感器组成了一套智能控制系统,发挥着自动控制功能。“人们早晨出门上班时还是晴空万里,所以没有关窗,下午突然下雨了,窗户会自动关闭,不用担心家中淋雨。”除了自动开闭窗户外,还可以通过遥控器来控制智能窗户的开闭大小,不用走到窗前去关窗。
智能窗户的应用越来越受广大人民的欢迎,在许多大城市中,很多小区都实现智能化管理,其中智能窗户的应用相当的重要一部分。所以我这次毕业设计选了这个我比较感兴趣也很有现实意义的题目。
3
第2章 设计的目标任务
2.1 本文主要工作设计 2.1.1本设计的总体介绍
(1) 智能窗户:基于单片机控制系统设计出温湿度检测电路、电机驱动电路、时钟电路、单片机、晶振和复位电路和控制电路等。
(2)设计智能窗户的数据采集及控制系统。 2.1.2设计的具体任务
对智能窗户的功能进行设计,相应的硬件电路和系统软件设计,并做出控制系统,从而达到设计的目的:温度升高到超过预设值时,电机转动关闭窗户并把空调打开;若下雨窗外的湿度传感器会感应到并把窗户关闭;通过按键可以设置自动开启窗户时间及自动关闭窗户时间,到设定时间会自动关闭或开启窗户;可以设置根据温湿度控制窗户开关及根据时间开启、关闭窗户功能。 2.2论文的要求与数据
(1)完成该课题必须重点研究单片机控制、温湿度采集、晶振和复位电路等关键问题和理论。
(2)研究方案的设计、研究方法和手段要合理,符合理论与实践的要求。
4
第3章 设计方案论证
智能窗户的模型如下图3.1,传动机构由皮带、电机和定滑轮组成。当电机正转时,可移动窗扇向右移动至限位开关处电机停止。当电机反转时,可移动窗户向左移动至限位开关处电机停止。
图3.1 智能窗户的模型
整个智能窗户控制系统包括微处理器、温湿度检测电路、报警电路、 电机驱动电路等模块组成。整个系统框图如图3.1所示。
温湿度传感器 STC89C52 LCD显示电路 时钟显示电路 光电传感器 电机驱动电路 按键
图3.2 系统框图
3.1 温湿度检测方案
方案一:温度检测采用热电阻温度传感器。热电阻是利用导体的电阻随温度变化的特性制成的测温元件;现应用较多的有铂、铜、镍等热电阻;其主要的特点为精度高、测量范围大、便于远距离测量。 湿度检测使用湿敏电阻。
方案二:我们采用数字温湿度传感器DHT11。DHT11 数字温湿度 传感器是一款含有已校准数字信 号输出的温湿度复合传器 。 它应用专用的数字模块采集技术和温湿度传感技术 ,确保产品具有极 高可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测元件,并与一个高性能 8 位单片机相 连接。因此该产品具有品质卓越、超
5
快应、抗干扰能力强、性价比极高等优点。每个DHT11 传感器都在极为精确的度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集变得简易快捷。超小的体积、极低的功耗,信号传输距离可达 20 米以上,使成为各类应用甚至最为苛刻的应用场合的最佳选则。产品 为 4 针单排引脚装,连接方便。 综合来看DHT11集温湿度检测于一体,反应快,单片机数字读取数剧,利于数据采集,而起体积小,利于本次设计,所以选用第二种方案。 3.2 窗户控制系统设计方案 窗户的开关主要通过直流电机控制。 方案一 :直流电机驱动电路使用最广泛的就是H型全桥式电路,这种驱动电路可以很方便实现直流电机的四象限运行,分别对应正转、正转制动、反转、反转制动。它的基本原理图如图2.1所示。 VCCS1S4A+S3Motor Servo-S2GND 图3.3 H桥电机驱动电路 全桥式驱动电路的4只开关管都工作在斩波状态,S1、S2为一组,S3、S4 为另一组,两组的状态互补,一组导通则 另一组必须关断。当S1、S2导通时,S3、 S4关断,电机两端加正向电压,可以实 现电机的正转或反转制动;当S3、S4导 通时,S1、S2关断,电机两端为反向电压,电机反转或正转制动。 在窗户动作的过程中,我们要不断地使电机在四个象限之间切换,即在正转和反转之间切换,也就是在S1、S2导通且S3、Q4关断,到S1、S2关断且S3、 S4导通,这两种状态之间转换。在这种 情况下,理论上要求两组控制信号完全互补,但是,由于实际的开关器件都存在开通和关断时间,绝对的互补控制逻辑必然导致上下桥臂直通短路,比如在上桥臂关断的过程中,下桥臂导通了。这个过程可用图2.2说明。 6
图3.4 窗户桥臂导通示意图
因此,为了避免直通短路且保证各个开关管动作之间的协同性和同步性,两组控制信号在理论上要 求互为倒相的逻辑关系,而实际上却必须相差一个足够的死区时间,这个矫正过程既可以通过硬件实现,即在上下桥臂的两组控制信号之间增加延时,也可以通过软件实现。
方案二:通过L6203集成块控制直流电机。L6203是专用驱动集成电路,属于 H桥集成电路,其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。利用单片机输入PWM波形控制使能端很容易改变直流电机速度,调速及控制方向容易,电路设计简单。
综合来看L6203具有强驱动能力,体积小,电路设计简单等优点,故选用方案二。 3.3 限位开关控制系统设计方案
限位开关就是用以限定机械设备的运动极限位置的电气开关。这种开关有接触式的和非接触式的。
方案一:接触式的比较直观,机械设备的运动部件上,安装上行程开关,和其相对运动的固定点上安装极限位置的挡块,或者是相反安装位置。当行程开关的机械触头碰上挡块时,切断了(或改变了)控制电路,机械就停止运行或改变运行。由于机械的惯性运动,这种行程开关有一定的“超行程”以保护开关不受损坏。
方案二:非接触式的形式很多,常见的有干簧管、光电式、感应式等,这几种形式在电梯中都能够见到。我这里选择光电式,光电传感器(ST178)是利用被检测物体对红外光束的遮光或反射,由同步回路选通而检测物体的有无,其物体不限于金属,对所有能反射光线的物体均可检测。
综合来看光电式传感器具有体积小,设计简单,而且检测的
7
第4章 硬件电路设计
4.1 最小系统电路设计
最小系统主要有震荡电路、复位电路、单片机和电源构成。其中震荡电路使用11.0592MHz的晶振配合两个22p的谐振电容构成,为单片机提供必要的系统时钟。复位电路即可实现上电复位,也可实现人工手动复位。当刚开始打开电源时,电容C1相当于短路,单片机RST脚短时间内处于高电平,从而使单片机复位;同样,当SW键按下时,RST12脚同样为高电平,可以使单片机正常复位。以上三部分电路构成了一个最小的单片机系统。 VCCC1AGND22PC322PX2P10P11P12P13P14P15P16P17P33P32P35P34VCC40123456781312151431X119X218RESET9BP37P36171620VCCP10/TP11/TP12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRD'WR'GND1P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27RXDTXDALE/P'PSEN3938373635343332212223242526272810113029P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27P30P31ALE/P'PSENVCCP112345678910KR210KLCD12Y112MHzX1VCCVCC1C410URESETR310KGNDVCCR4330U2 C5图4.1 最小系统电路 +12VGNDVCC4.2温湿度检测电路设计 GND10492VREFVS4.2.1数字温湿度传感器DHT11简介 5DHT11 数字温湿度P12 传感器是一款含有已校准数字信 号输出的温湿度复合传器 。 它2IN110431N4007COUT1P1011ENABLEMB1应用专用的数字模块采集技术和温湿度传感技术 ,确保产品具有极高可靠性与卓越的长1MotorOUT2D2P117C7IN2期稳定性。传感器包括一个电 阻 式 感 湿元件和一 个 NTC 测元件,并与一个 高性能 8 GND8BOOT2GND10410位单片机相 连接。因此该产品具有品质卓越、超快应、抗干扰能力强、性价比极高等优1N4007SENSES1点。每个 DHT11 传感器都在极为精确的度校验室中进行校准。校准系数以程序的形式储P24存在 OTP 内存中,传感器内在检测信号的处理过程中要调用这些校准系数。 单线制串行S2电机驱动接口,使系统 集变得简易快捷。超小的体积、极低的功耗, 信号传输距离可达 20 米以P25GNDPower1VCCS33 为 4 针单排引脚装。上, 使成为各类应用甚至最为苛刻的应用场合的最佳选则。产品 连P262+12V1S4接方便。 Header 3P27GND4.2.2 DHT11工作原理 DBOOT14U3L6203C6D1GND6GND由于采用DHT数字温湿度传感器,电路不用考虑A/D转换,只需设计指定P1.4与数电源接入口按键电路字传感器相连,电路原理图如图4.3。 12GND 8
P20P21P22P00P01R8330U4111234567单片机 STC89C52LCD4GND1920P2GND4NC3DATA2VCC1DHT11C2VCC104R15KP14 AVCCVCC图4.2 DHT11与单片机的连接 DHT11温湿度传感器性能说明: 模块温湿度传感器VCCR676R7100K12BU1ALM339131KP33 GNDGNDVCCR101K5LM339DHT11的数据读取: DATA 用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时2P32间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后4 3U1B表4.1 DHT11温湿度传感器性能 C129 GND扩展,现读出为零。操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据 +8bit校验和。
数据传送正确时校验和数据等于\湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据\所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集,采集数据后转换到低速模式。 总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
图4.3 总信号表示方法
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。格式见下面图示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
图4.4 数字0信号表示方法
图4.5 数字1信号表示方法
10
4.3电机驱动电路设计
L6203是专用驱动集成电路,属于 H桥集成电路,其输出电流为2A,最高电流5A,最高工作电压48V,最高频率100KHZ,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。为了避免电机对单片机的干扰,可对模块加入光耦,进行光电隔离,从而使系统能稳定可靠的工作。
图4.6 L6203的管脚图
图4.7 L6203的内部框图
图4.8 电机驱动的原理图
4.4 显示电路设计
显示部分采用LCD12864作为显示器件。LCD12864采用标准的20脚(有背光带字库),各引脚接口说明如表4-1所示。
11
表4-1 LCD12864引脚说明128X64HZ 引脚说明 引脚号 引脚名称 方向 功能说明 1 VSS - 模块的电源地 2 VDD - 模块的电源正端 3 V0 - LCD驱动电压输入端 4 RS(CS) H/L 并行的指令/数据选择信号;串行的片选信号 5 R/W(SID) H/L 并行的读写选择信号;串行的数据口 6 E(CLK) H/L 并行的使能信号;串行的同步时钟 7~14 DB0~DB7 H/L 数据0~数据7 15 PSB H/L 并/串行接口选择:H-并行;L-串行 16 NC 空脚 17 /RET H/L 复位 低电平有效 18 NC 空脚 19 LED_A (LED+5V) 背光源正极 20 LED_K (LED-OV) 背光源负极 逻辑工作电压(VDD):4.5~5.5V 电源地(GND):0V
工作温度(Ta):-10℃ ~60℃(常温) / -20℃~70℃(宽温)
其中,VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。D0~D7为8位双向数据线。
LCD12864与单片机的连接如图3.11所示,其中,RT1电位器用来调节LCD的对比度,该对比度必须在LCD正常工作的时候调节到一个合适值。
图4.9 LCD12864电路原理图
4.5时钟电路设计
时钟电路是利用单片机STC89C52控制串行实时时钟芯片DS1302构成的,实现计时的功能。时钟芯片DS1302带有后备电池,具备对后备电源进行涓细电流充电的能力,保证电路断电后仍保存时间和数据信息,这些优点解决了目前常用实时时钟计时不可靠等缺点。
时钟芯片DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可
12
通过AM/PM标志位决定采用24或12小时时间格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:复位(RST)、I/O数据线、串行时钟(SCLK)。时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。
图4.10 DS1302的内部结构图
图4.11 时钟电路
4.6 光电开关电路设计
光电开关电路是利用光电反射传感器ST178来控制的。当检测到黑色带时,输出低电平电机转动即窗户运动,当检测到白色带时,输出高电平电机停止转动即窗户停止运动。
4.6.1、ST178的底视图和内部电路如下图:
图4.12 ST178的底视图和内部电路
4.6.2、ST178的特点
1.采用高发射功率红外光电二极管和高灵敏度光电晶体管组成。 2.检测距离可调整范围大,4-10mm可用。 3.采用非接触检测方式。
13
4.7按键电路的设计
本设计的按键主要是用来设定开关窗的时间和是否要根据温湿度情况和设定时间的情况来开关窗。
图4.13按键电路的原理图
14
第5章 软件设计
5.1 主程序流程图
本系统的MCU使用了ATMEL公司的低功耗单片机STC89C52。主程序中仅完成了系统的初始化和开始的显示部分,然后就进入待机模式。其他功能模块都在中断服务子程序中完成。当产生中断时,MCU被唤醒并执行相应的中断服务子程序,从中断子程序返回后,系统又进入到待机模式,并关闭显示设备,节省电量。整个程序的设计使系统在绝大多数时间都处于最低功耗状态。整个程序用全部用C 语言编写,使用模块化的设计方法,把各个模块相关的程序放在一个文件中,便于分块调试和管理,缩短了调试周期,增加了程序的可移植性和可剪裁性。
在主程序中,首先关闭了看门狗和总中断,避免了在初始化过程中看门狗或其他中断导致单片机复位,使初始化无法完成。初始化过程分模块进行,增加了程序的可读性,而已便于分块调试,缩短了调试周期。
整个系统软件需要对温度传感器DHT11、报警器、窗户控制系统进行管理。温度传感器DHT11为数字式温度传感器,直接与单片机的串口连接来读取温度。以上所有模块均在主程序中完成初始化过程,系统流程图如图5-1所示。
开始 系统初始化 中断初始化 温湿度数据读取 有异常? N 处理 结束
图5.1 主程序流程图
5.2 各部分子程序 5.2.1温湿度检测程序
DHT11子程序是结合它的用户使用资料编写,主要完成的是初始化DHT11,从DHT11中读出一个字节的数据,向DHT11中写入一个字节的数据,配置DHT11包括警报温度的上
15
限和下限、温度转换的精度,读出Scrachpad存储器中的九个字节的数据,读出Rom中的64位Code值,对读出的Scrachpad数据进行CRC校验,然后根据读出的数据得到测量出的十进制温度值。从DHT11中读出九个字节数据的流程图如图5.2所示。
初始化 ROM指令 读取温湿度 N CRC校验 Y 储存温度
结束 图5.2温度读取流程图
DHT11数据的CRC校验。为了解决单总线串行传输数据可能引起的错误,DHT11内部具有产生CRC校验码电路,这样编程时可以通过对读出的数据进行CRC校验码,并用这个校验码和获得的数据的最后一个字节比较,若两者相同则证明数据传送没有错误,从而验证通信过程中数据传输的正确性,使采集温度信号的可靠性得到保证。
CRC检验的求法。M为一个k位长的信息帧。P为n+1位预先确定的用来生成校验码的二进制序列其最高位和最低位必须为1,DS18B20中使用的序列为:P = 1 0011 0001。F为n位FCS,即校验码序列。T为k+n位被传输的帧。因为F是接在M信息帧之后的,因此T=M 2 2 n (2 n 为2的n次方)中,M 2 2 n 相当于M左移n位,后面添n个零。设M 2 2 n 除以P的商和余数分别是Q和R,则有M 2 2 n =P 2 Q+R即M 2 2 n /P=Q+R/P若设T=M 2 2 n +R,则T定能被整除。因为按模2的加减运算相当于异或运算,故有T/P=(M 2 2 n +R)/P=(M 2 2 n )/P+R/P =Q+R/P+R/P=Q这样一来,校验码序列F就是M 2 2 n 除以P的余数R。通过计算可以得到 256个用于CRC检验的数据[4]。
在本设计中,为了降低处理器的功耗,选用了查表法来进行计算。其关键代码如下: for(i=0;i checkdata=(checkdata<<8)^CRCTable[((checkdata>>8)^crc_data[i])]; } CRC_CCITT_L=(unsigned char)(checkdata%6); CRC_CCITT_H=(unsigned char)(checkdata/256); 5.2.2 电机控制系统 窗户控制系统主要包括开关窗户的控制。夏天当温度传感器检测到室外温度高于30℃ 16 时,P1.2=1、P1.1低电平,电机正转窗户关闭到限位点时,电机停止。温度传感器检测到室外温度低于25℃时,P1.2=0、P1.1高电平,电机反转窗户开启到限位点时,电机停止。 开始 是 温度>30℃? 电机反转开窗 温度<25℃ 是 电机正转关窗 结束 图5.3 窗户控制程序流程图 5.2.3LCD12864显示程序设计 LCD显示程序最主要的部分就在发送命令和发送数据这两个基础程序。通过LCD的数据手册,可知LCD时序图如下。 表5-1 LCD12864基本操作状态表 1. 读操作时序 根据LCD12864控制器的数据手册,可以通过流程图来得知LCD读取数据和写入数据的时序及流程。如图5.4所示。 图5.4 LCD12864读操作时序 2. 写操作时序如图 17 图5.5 LCD12864写操作时序 LCD写操作包括写数据和写命令两个部分构成,当RS=0时,为写命令,当RS=1时为写数据。 具体程序见附页。 18 第6章 系统组装与调试 6.1 基本电路板检查 根据前面的研究完成各个电路模块的原理设计并生成PCB图,制作电路板,进行实验调试。 (1)检查印制板的印制线是否有断路,是否有毛刺,是否与其它线或是焊盘粘连,焊盘是否有脱落,过孔是否有未金属化现象等等。 (2)先用万用表复核目测中认为可疑的连接或是接点,检查它们的通短状态是否与设计规定相符。再检查各种电源线与地线之间是否有短路现象,如有再仔细检查出并排除。短路现象一定要在器件安装及加电前检查出。 (3)路接通电源后,用手摸一下芯片是否发热,如果发热,立即关掉电源,稍后再进行再次检测;如果没有发热,再测试芯片的VCC端电压是否达到设计要求,接地端是否都接地。 6.2 主控模块调试 在本次设计中,主控模块是非常重要的部分,它不仅是本次设计的核心,在本次硬件调试中也遇到了问题,接上电源的时候,液晶显示亮了,但没有任何显示,于是我做了如下的工作: (1)检查电源是否通电,使用万用表测试之后,主要测试各个芯片和液晶显示是否正常通电,发现电压、电流都是正确的; (2)液晶显示通电但没信号显示,检测发现是电位器烧坏了,换了一个好的。重新通电液晶正常显示。 6.3 软件调试 当硬件制作完成后,软件制作也是不可轻视的部分,是实现电路的功能的关键部分,通过本次毕业设计,总结经验如下: (1)先进行人工检查。写好程序后,不要立刻烧入单片机,先对纸面上的程序进行人工检查。由于采用C语言编程,所以要特别小心地检查语法错误,如括号不配对,漏写分号等,通过仔细的检查,发现并排除这些错误。 (2)人工检查无误后,上机调试。在编译时给出的语法错误的信息,根据提示的信息具体找出程序中错误之处并改之,从上至下逐一改正。应当注意的是:有的提示出错行并不是真正出错的行,如果在提示出错的行上找不到错误的话,则应该到上行再找。 (3) 当确认程序无语法错误和逻辑错误时,通过直接下载到单片机来调试。采用的是自下到上的调试方法,即单独调好每一个模块,然后再连接成一个完整的系统调试。 (4) 程序烧入单片机后,观察各个部件的工作是否正常,功能是否实现。如不能正常工作,则继续检查程序中的相应模块,必要时从上到下重新检查程序。 6.4数据整理 1、当外界湿度大于80%时,窗户都是关闭的; 2、当外界温度大于30℃时,窗户关闭并开启空调; 3、当外界温度小于20℃时,窗户开启且关闭空调; 4、在湿度小于80%且温度小于30℃时,窗户的状态是保持原来的状态。 19 具体测得的数据如下表: 温度 湿81% 80% 78% 75% 度 18℃ 关窗 关窗 开窗 开窗 20℃ 关窗 关窗 开窗 开窗 21℃ 关窗 关窗 保持 保持 25℃ 关窗 关窗 保持 保持 27℃ 关窗 关窗 保持 保持 30℃ 关窗 关窗 保持 保持 31℃ 关窗 关窗 关窗 关窗 32℃ 关窗 关窗 关窗 关窗 表6.1 相关数据 73% 开窗 开窗 保持 保持 保持 保持 关窗 关窗 70% 开窗 开窗 保持 保持 保持 保持 关窗 关窗 68% 开窗 开窗 保持 保持 保持 保持 关窗 关窗 20 结束语 由于时间、试验条件以及个人能力的限制,本系统完成的并不够理想,但是也已经基本达到了最初的设计目的。通过传感器发出信号从而控制窗户的开关达到空气流通等实际效果,代替人为操作为生活提供一定的方便。采用温湿度传感器设计该系统,这样感应的距离会比较理想,为家居安全提供一定的保障。 总的说毕业设计是考验学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。这次的毕业设计通过搜集相关资料和撰写论文对我来说是一次非常难得的锻炼机会,可以说已经囊括了大学期间大部分的知识,从选题到定稿,从理论到实践可以把所学的专业认识充分运用起来解决具体的问题,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,能够使所学知识融会贯通。对于我来说这不仅仅是一次毕业设计,更重要的是在过程中提高了我学习的能力、解决问题的能力和实际工作的能力,这些技能和方法都会对将来的工作有很大的帮助。回顾起此次毕业设计,至今我仍感慨颇多,可以说得是苦多于甜,但是可以学到很多很多的东西。在设计和写论文的过程中遇到很多问题,可以说得是困难重重,发现了自己还有很多的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说三极管PNP管脚不懂怎么放置,不懂分得二极管的正负极,对C语言和单片机汇编语言掌握得不好。这次课程设计也让我对以前所学过的知识有了温故知新。 本次设计已经完成了对智能窗户的基本功能实现,完全可以作为一套简易系统投入使用,但也存在着一些问题,比如温度、湿度等采集点过于单一,可能会有漏报或误报的情况;另外我们也可以在系统中加入防煤气泄漏检测和烟雾检测等技术,以及防盗报警可以是模拟摘机报警系统等等。这些问题对我是一种激励,我会在以后的工作和学习中更加努力。 在制作的过程中,学会了单片机系统的设计方法,知道了单片机系统从需求分析,到方案设计,到电路图,程序设计的整个流程。掌握了protel电路图设计软件,学会了使用温是度传感器多种传感器的使用方法,掌握了电机驱动的方法。 致谢语 毕业设计结束了,在这段时间的设计和学习过程中,我得到了很多人的帮助,学到了很多东西。 首先,感谢我的指导老师张士钱和其他指导和帮助过我的老师们。有了老师们的监督和指导,让我能够很好地学习专业知识,培养自己的动手能力,这在毕业设计中发挥了非常重要的作用。在设计过程中,老师以自己精专的知识,不断地启发我,使我的设计得以顺利进行,也使得我自己的专业水平有很大程度的提高。 再次,我要感谢同学对我帮助和指导,在设计中不懂的请教同学时,总是很热心的帮我发现问题,寻找更好的解决办法。 最后,祝你们身体健康, 工作顺利。 21 参考文献 [1] 何立民.单片机应用系统设计[M].北京:北京航空航天大学出版社,1996,35-48 [2] 松井邦彦.传感器实用电路设计与制作[M].北京:科学出版社,2005,107-110 [3] 苏家健.单片机原理及应用技术[M].高等教育出版社 ,P5 [4] 黄继昌.传感器工作原理及应用实例[A].北京:人民邮电出版社,1998 [5] DALLAS Semiconductor. DS18B20 Data Sheet [J]. 2002:1-26 [6] 阎石.数字电子技术基础[M].高等教育出版社,2004.6 20-73 [7] 童诗白.模拟电子技术基础[M].高等教育出版社,2006, 79-85 [8] 孙晓云.接口与通信技术原理与应用[J].中国电力出版社,2007 [9] 郑启忠.数字温度传感器DS18B20及无线测温系统设计.微型机与应用[J],2004 [10] 李华.MCS-51系列单片机使用接口技术[M].北京航空航天大学出版社,1993,35-42 [11]邓学欣.檀润华.智能窗的概念设计[J] .河北工业大学学报,2003 [12]侯建华.基于51单片机的室温测试[J].电子技术,2007.07 [13]韩磊 .家居进入“智能窗时代” [J] .环境与生活,2008(2):17-19 [15]李胜多,张还,佟春明,高春风.基于PLC多功能窗的设计[J] .青岛农业大学学报,2010(1)84-88 22 附(一):电路原理图 电源模块电路 23 附(二):PCB板 24 附(三):程序 #include #define uint unsigned int #define uchar unsigned char sbit BEEP=P3^4; uint tnum=0; uchar num[10]=\ /*************************************************/ //DHT11温度传感器程序模块 /*************************************************/ sbit TRH=P1^4;//温湿度传感器DHT11数据接入 uint TH_data,TL_data,RH_data,RL_data,CK_data; uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp; uint com_data,untemp,temp; uint respond,WEN,SHI; // 温度、湿度、? /*************************************************/ //5us级延时程序 /*************************************************/ void delay_us() { _nop_();_nop_();_nop_();_nop_();_nop_(); } void delay_ms(unsigned x ) { unsigned char i; while(x--) { for(i = 0; i<250; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } /************************************************/ //收发信号检测,数据读取???????? /*************************************************/ char receive() { uint i; com_data=0; for(i=0;i<=7;i++) { 25 respond=2; //? while((!TRH)&&respond++); //没数据接入就延时 delay_us(); delay_us(); delay_us(); if(TRH) //有数据接入 { temp=1; respond=2; while((TRH)&&respond++); } else temp=0; com_data<<=1; com_data|=temp; } return(com_data); } /********************************************/ //湿度读取子程序 //温度高8位== TL_data //温度低8位== TH_data //湿度高8位== RH_data //湿度低8位== RH_data //校验 8位 == CK_data //调用的程序有 delay_ms();, Delay_5us();,RECEIVE(); /*******************************************/ void read_TRH() { //主机拉低18ms TRH=0; delay_ms(18); TRH=1; //DATA总线由上拉电阻拉高 主机延时20us delay_us(); delay_us(); delay_us(); delay_us(); //主机设为输入 判断从机响应信号 TRH=1; //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!TRH) { respond=2; //判断DHT11发出 80us 的低电平响应信号是否结束 while((!TRH)&& respond++); 26 respond=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while(TRH && respond++); //数据接收状态 RH_temp = receive(); RL_temp = receive(); TH_temp = receive(); TL_temp = receive(); CK_temp = receive(); TRH=1; //数据校验 untemp=(RH_temp+RL_temp+TH_temp+TL_temp); if(untemp==CK_temp) { RH_data = RH_temp; RL_data = RL_temp; TH_data = TH_temp; TL_data = TL_temp; CK_data = CK_temp; } WEN=TH_data; SHI=RH_data; } } /*************************************************/ //LCD12864液晶显示程序模块 /*************************************************/ sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; #define LCD_DATA P0 /*----写命令到 LCD---*/ void LCD_WriteCom(unsigned char command) { RS=0; RW=0; // delay_ms(1); E=1; LCD_DATA=command; delay_ms(1);//////////////////// 在数据写入的时候加入适当的延时 E=0; // delay_ms(1); } /*----写数据到 LCD---*/ void LCD_WriteDat(unsigned char date) { 27 RS=1; RW=0; delay_ms(1); E=1; LCD_DATA=date; delay_ms(1);/////////////////// 在数据写入的时候加入适当的延 E=0; // delay_ms(1); } /*---初始化 LCD 屏---*/ void LCD_init() { delay_ms(5); LCD_WriteCom(0x30); delay_ms(5); // 选择基本指令集 LCD_WriteCom(0x30); // 选择 8bit 数据流 delay_ms(5); LCD_WriteCom(0x0c); // 开显示 ( 无游标、不反白 ) delay_ms(5); LCD_WriteCom(0x01); // 清除显示,并且设定地址指针为 00H delay_ms(5); LCD_WriteCom(0x06); // 指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 delay_ms(5); } /*---显示字符串---*/ void LCD_writestring(unsigned char *str) { while(*str != '\\0') { LCD_WriteDat(*str++); } *str = 0; } /******************************************************************** ********************************************************************* ***************************DS1302部分******************************** ********************************************************************* *********************************************************************/ sbit DS1302_SCLK= P1^5; sbit DS1302_IO = P1^6; sbit DS1302_RST = P1^7; uchar Year,Month,Day,Week,Hour,Minute,Second; /******************************************************************** ****函数名称:uchar DS1302_Readuchar() ****函数功能:从DS1302读1字节数据 28 ****备注说明: ********************************************************************/ uchar DS1302_Readuchar() { uchar i; uchar dat = 0; for (i=0; i<8; i++) //8位计数器 { DS1302_SCLK = 0; //时钟线拉低 _nop_(); //延时等待 _nop_(); dat >>= 1; //数据右移一位 if (DS1302_IO) dat |= 0x80; //读取数据 DS1302_SCLK = 1; //时钟线拉高 _nop_(); //?óê±μè′y _nop_(); } return dat; } /******************************************************************** ****函数名称:DS1302_Writeuchar(uchar dat) ****函数功能:向DS1302写1字节数据 ****备注说明: ********************************************************************/ void DS1302_Writeuchar(uchar dat) { char i; for (i=0; i<8; i++) //8位计数器 { DS1302_SCLK = 0; //时钟线拉低 _nop_(); //延时等待 _nop_(); dat >>= 1; //移出数据 DS1302_IO = CY; //送出到端口 DS1302_SCLK = 1; //时钟线拉高 _nop_(); //延时等待 _nop_(); } } /******************************************************************** ****函数名称:DS1302_Read(uchar addr) ****函数功能:读DS1302某地址的的数据 ****备注说明: ********************************************************************/ uchar DS1302_Read(uchar addr) { 29 uchar dat; DS1302_RST = 0; _nop_(); //延时等待 _nop_(); DS1302_SCLK = 0; _nop_(); //延时等待 _nop_(); DS1302_RST = 1; _nop_(); //延时等待 _nop_(); DS1302_Writeuchar(addr); //写地址 dat = DS1302_Readuchar(); //读数据 DS1302_SCLK = 1; DS1302_RST = 0; return dat; } /******************************************************************** ****函数名称:DS1302_Write(uchar addr, uchar dat) ****函数功能:往DS1302的某个地址写入数据 ****备注说明: ********************************************************************/ void DS1302_Write(uchar addr, uchar dat) { DS1302_RST = 0; _nop_(); //延时等待 _nop_(); DS1302_SCLK = 0; _nop_(); //延时等待 _nop_(); DS1302_RST = 1; _nop_(); //延时等待 _nop_(); DS1302_Writeuchar(addr); //写地址 DS1302_Writeuchar(dat); //写数据 DS1302_SCLK = 1; DS1302_RST = 0; } /******************************************************************** ****函数名称:DS1302_SetTime() ****函数功能:写入DS1302初始时间 ****备注说明: ********************************************************************/ void DS1302_SetTime() { DS1302_Write(0x8e, 0x00); //允许写操作 DS1302_Write(0x8c, 0x12);//年 30 DS1302_Write(0x88, 0x03);//月 DS1302_Write(0x86, 0x12);//日 DS1302_Write(0x8a, 0x01);//周 DS1302_Write(0x84, 0x20);//时 DS1302_Write(0x82, 0x22);//分 DS1302_Write(0x80, 0x40);//秒 DS1302_Write(0x8e, 0x80); //写保护 } void LCD_ShowTime() { Year=DS1302_Read(0x8D); Month=DS1302_Read(0x89); Day=DS1302_Read(0x87); Week=DS1302_Read(0x8B); Hour=DS1302_Read(0x85); Minute=DS1302_Read(0x83); Second=DS1302_Read(0x81); LCD_WriteCom(0x80); LCD_writestring(\ LCD_WriteDat(Year/16+0x30); LCD_WriteDat(Year+0x30); LCD_writestring(\年\ LCD_WriteDat(Month/16+0x30); LCD_WriteDat(Month+0x30); LCD_writestring(\月\ LCD_WriteDat(Day/16+0x30); LCD_WriteDat(Day+0x30); LCD_writestring(\日\ LCD_WriteCom(0x90); LCD_WriteDat(Hour/16+0x30); LCD_WriteDat(Hour+0x30); LCD_writestring(\ LCD_WriteDat(Minute/16+0x30); LCD_WriteDat(Minute+0x30); LCD_writestring(\ LCD_WriteDat(Second/16+0x30); LCD_WriteDat(Second+0x30); LCD_writestring(\星期\ switch(Week) { case 0x01: LCD_writestring(\一\ case 0x02: LCD_writestring(\二\ case 0x03: LCD_writestring(\三\ 31 case 0x04: LCD_writestring(\四\ case 0x05: LCD_writestring(\五\ case 0x06: LCD_writestring(\六\ case 0x07: LCD_writestring(\日\ } LCD_WriteCom(0x88); LCD_writestring(\当前温度:\ LCD_WriteDat((char)(0x30+WEN/10)); LCD_WriteDat((char)(0x30+WEN)); LCD_writestring(\℃ \ LCD_WriteCom(0x98); LCD_writestring(\当前湿度:\ LCD_WriteDat((char)(0x30+SHI/10)); LCD_WriteDat((char)(0x30+SHI)); LCD_writestring(\ } /*************************************************/ //窗户位置确定及运动程序模块 /*************************************************/ sbit ZAI_ZUO=P3^3; sbit ZAI_YOU=P3^2; sbit L=P1^2; sbit R=P1^1; sbit ENABLE=P1^0; uchar LEFT,RIGHT; void mo_init() { ENABLE=0; L=0; R=0; TR0=0; } void turn_left() { L=1; R=0; TR0=1; } void turn_right() { L=0; R=1; 32 TR0=1; } void stop() { TR0=0; ENABLE=0; L=0; R=0; } sbit s1=P2^7; sbit s2=P2^6; sbit s3=P2^5; sbit s4=P2^4; sbit beep=P3^4; uchar s1num,open_h,open_m,close_h,close_m; bit auto_ws,auto_time; void di() //蜂鸣器报警声音 { beep=0; delay_ms(100); beep=1; } void keyscan() { if(s1==0)//检测S1 { delay_ms(10); if(s1==0) { di(); s1num++;//记录按下次数 LCD_WriteCom(0x80); LCD_writestring(\开时: : \ LCD_writestring(\湿度自动控制:\ if(auto_ws==0) LCD_writestring(\否\ else LCD_writestring(\是\ LCD_writestring(\关时: : \ LCD_writestring(\定时自动控制:\ if(auto_time==0) LCD_writestring(\否\ else LCD_writestring(\是\ LCD_WriteCom(0x83); LCD_WriteDat(num[open_h/10]); 33 LCD_WriteDat(num[open_h]);//写入自动开启窗户小时 LCD_WriteCom(0x85); LCD_WriteDat(num[open_m/10]); LCD_WriteDat(num[open_m]);//写入自动开启窗户分钟 LCD_WriteCom(0x93); LCD_WriteDat(num[close_h/10]); LCD_WriteDat(num[close_h]);//写入关闭开启窗户小时 LCD_WriteCom(0x95); LCD_WriteDat(num[close_m/10]); LCD_WriteDat(num[close_m]);//写入关闭开启窗户分钟 while(!s1);//等待S1释放 switch(s1num) {//光标闪烁点定位 case 1: LCD_WriteCom(0X83); LCD_WriteCom(0x0f); break; case 2: LCD_WriteCom(0x85); break; case 3: LCD_WriteCom(0x93); break; case 4: LCD_WriteCom(0x95); break; case 5: LCD_WriteCom(0x8F); break; case 6: LCD_WriteCom(0x9F); break; case 7: s1num=0; LCD_WriteCom(0x01);//清楚LCD显示内容 LCD_ShowTime(); break; } } } if(s1num!=0)//只有当S1按下后,才检测S2和S3 { if(s2==0) { delay_ms(5); if(s2==0) { di(); while(!s2);//等待S2放开 switch(s1num) {//根据功能键次数调节相应数值 case 1: open_h=open_h+1; if(open_h==24) 34 open_h=0; LCD_WriteCom(0x83); LCD_WriteDat(num[open_h/10]); LCD_WriteDat(num[open_h]);//写入自动开启窗户小时 LCD_WriteCom(0x83); break; case 2: open_m++; if(open_m==60) open_m=0; LCD_WriteCom(0x85); LCD_WriteDat(num[open_m/10]); LCD_WriteDat(num[open_m]);//写入自动开启窗户小时 LCD_WriteCom(0x85); break; case 3: close_h++; if(close_h==24) close_h=0; LCD_WriteCom(0x93); LCD_WriteDat(num[close_h/10]); LCD_WriteDat(num[close_h]);//写入自动开启窗户小时 LCD_WriteCom(0x93); break; case 4: close_m++; if(close_m==60) close_m=0; LCD_WriteCom(0x95); LCD_WriteDat(num[close_m/10]); LCD_WriteDat(num[close_m]);//写入自动开启窗户小时 LCD_WriteCom(0x95); break; case 5: auto_ws=~auto_ws; if(auto_ws==1) { LCD_WriteCom(0x8f); LCD_writestring(\是\ LCD_WriteCom(0x8f); } else { LCD_WriteCom(0x8f); LCD_writestring(\否\ LCD_WriteCom(0x8f); } break; case 6: auto_time=~auto_time; if(auto_time==1) 35 { LCD_WriteCom(0x9f); LCD_writestring(\是\ LCD_WriteCom(0x9f); } else { LCD_WriteCom(0x9f); LCD_writestring(\否\ LCD_WriteCom(0x9f); } break; } } } if(s3==0) { delay_ms(1); if(s3==0) { di(); while(!s3); switch(s1num) {//根据功能键次数调节相应数值 case 1: open_h--; if(open_h==-1) open_h=23; LCD_WriteCom(0x83); LCD_WriteDat(num[open_h/10]); LCD_WriteDat(num[open_h]);//写入自动开启窗户小时 LCD_WriteCom(0x83); break; case 2: open_m--; if(open_m==-1) open_m=59; LCD_WriteCom(0x85); LCD_WriteDat(num[open_m/10]); LCD_WriteDat(num[open_m]);//写入自动开启窗户小时 LCD_WriteCom(0x85); break; case 3: close_h--; if(close_h==-1) close_h=23; LCD_WriteCom(0x93); LCD_WriteDat(num[close_h/10]); LCD_WriteDat(num[close_h]);//写入自动开启窗户小时 36 LCD_WriteCom(0x93); break; case 4: close_m--; if(close_m==-1) close_m=59; LCD_WriteCom(0x95); LCD_WriteDat(num[close_m/10]); LCD_WriteDat(num[close_m]);//写入自动开启窗户小时 LCD_WriteCom(0x95); break; case 5: auto_ws=~auto_ws; if(auto_ws==1) { LCD_WriteCom(0x8f); LCD_writestring(\是\ LCD_WriteCom(0x8f); } else { LCD_WriteCom(0x8f); LCD_writestring(\否\ LCD_WriteCom(0x8f); } break; case 6: auto_time=~auto_time; if(auto_time==1) { LCD_WriteCom(0x9f); LCD_writestring(\是\ LCD_WriteCom(0x9f); } else { LCD_WriteCom(0x9f); LCD_writestring(\否\ LCD_WriteCom(0x9f); } break; } } } } if(s4==0)//检测S4 { delay_ms(5); if(s4==0) 37 { } di(); LCD_WriteCom(0x80); LCD_writestring(\开时: : \LCD_writestring(\湿度自动控制: \LCD_writestring(\关时: : \LCD_writestring(\定时自动控制: \LCD_WriteCom(0x83); LCD_WriteDat(num[open_h/10]); LCD_WriteDat(num[open_h]);//写入自动开启窗户小时 LCD_WriteCom(0x85); LCD_WriteDat(num[open_m/10]); LCD_WriteDat(num[open_m]);//写入自动开启窗户分钟 LCD_WriteCom(0x93); LCD_WriteDat(num[close_h/10]); LCD_WriteDat(num[close_h]);//写入关闭开启窗户小时 LCD_WriteCom(0x95); LCD_WriteDat(num[close_m/10]); LCD_WriteDat(num[close_m]);//写入关闭开启窗户分钟 if(auto_ws==1) { LCD_WriteCom(0x8f); LCD_writestring(\是\ LCD_WriteCom(0x8f); } else { LCD_WriteCom(0x8f); LCD_writestring(\否\ LCD_WriteCom(0x8f); } if(auto_time==1) { LCD_WriteCom(0x9f); LCD_writestring(\是\ LCD_WriteCom(0x9f); } else { LCD_WriteCom(0x9f); LCD_writestring(\否\ LCD_WriteCom(0x9f); } while(!s4);//等待S4释放 LCD_ShowTime(); 38 } } void auto_move() { if((auto_ws==1)&&(SHI>=70)&&(ZAI_YOU==0)) //当温湿度自动控制开,湿度大于70%,窗户打开时 关闭窗户 { turn_left(); while(ZAI_ZUO!=0); stop(); } if((SHI<40)&&(auto_time==1)&&(open_h==(Hour/16*10+Hour))&&(open_m==(Minute/16*10+Minute))&&(ZAI_ZUO==0)) //当窗户关闭,根据时间自动控制开,湿度小于40,到达开启时间时窗户自动打开 { turn_right(); while(ZAI_ZUO!=0); stop(); } if((auto_time==1)&&(close_h==(Hour/16*10+Hour))&&(close_m==(Minute/16*10+Minute))&&(ZAI_YOU==0)) //当到设置关闭窗户时间及窗户关闭时打开窗户 { turn_left(); while(ZAI_ZUO!=0); stop(); } } void main() { auto_ws=0; auto_time=0; LCD_init(); open_h=0; open_m=0; close_h=0; close_m=0; // DS1302_SetTime(); mo_init(); TMOD=0x01;//定时器0模式16 TH0=0xFF; //1ms定时器0方式1初值 TL0=0xF6; EA=1;//开总中断 ET0=1;//允许定时器0中断 while(1) { 39 read_TRH(); if(s1num==0) { LCD_ShowTime(); } keyscan(); auto_move(); } } void timer0() interrupt 1 { TH0=0xFF; //1KHZ PWM波形,占空比可调 TL0=0xF6; tnum++; if(tnum==100) { tnum=0; } if(tnum<30)//占空比为30% { ENABLE=1; } else { ENABLE=0; } } 40