智能家居控制系统
通信与信息工程学院
电信1202班 苏伟、杨博、张波波
1
江苏科技大学毕业论文
摘要—————————————————— 一.方案论证与设计———————————
1.1 方案来源------------------------------------------------------------------ 1.2系统设计------------------------------------------------------------------- 1.3主要器件及型号---------------------------------------------------------
二.系统实现 ——————————————
2.1 原理分析与硬件电路图----------------------------------------------- 2.2测量模块---------------------------------------------------
2.3感应模块------------------------------------------------------------------- 2.4显示模块-------------------------------------------------------------------- 2.5控制模块-------------------------------------------------------------------- 2.6软件调试-------------------------------------------------------------------- 2.7性能分析--------------------------------------------------------------------
三.系统设计与误差分析—————————— 四.总结—————————————————
4.1系统功能-------------------------------------------------------------------- 4.2资料来源-------------------------------------------------------------------- 4.3 单片机控制总程序代码---------------------------------------------------------- 4.4 单片机仿真原理图---------------------------------------------------------------- 4.5 单片机系统实物图---------------------------------------------------------------- 4.6 实验设计总结心得----------------------------------------------------------------
2
江苏科技大学毕业论文
摘要:(简要总结)
当今世界,随着科技的不断发展,智能家居成了人类关注的话题。智能家居是在物联网的影响之下物联化体现。智能家居通过物联网技术将家中的各种设备(如照明系统、窗帘控制、空调控制、安防系统,报警控制等)连接到一起,提供家电控制、照明控制、窗帘控制、室内外遥控、防盗报警、环境监测、红外遥感以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、信息家电、设备自动化,集系统、结构、服务、管理为一体的高效、舒适、安全、便利、环保的居住环境,而且提供全方位的信息交互功能,帮助家庭与外部保持信息交流畅通,优化人们的生活方式,帮助人们有效安排时间,增强家居生活的安全性,甚至为各种能源费用节约资金。 本文首先介绍了智能家居的发展前景,接着介绍了该课题设计构想,各模块电路的选择及其电路工作原理,最后对该课题的设计过程进行了总结与展望并附带各个模块的电路原理图,和本设计实物图,以及C语言思想。
一、方案论证与设计 1.1 方案来源
设计背景:
智能家居实验是为智能家居系统实验做准备的,是实验的基础,智能家居是为了提高学生的动手能力,配合各类电子设计大赛,科技活动等而开发的设计模型。在此模型上我们可以进行多种实验,如测量,感应,报警,控制,自动控制等等。为了能更好的控制模拟家居,实现手动与自动控制相结合,进行各种功能实现,并且这个实验对现实生活也有一定的意义,所以我们就需要对这个实验进行一定的研究。
3
江苏科技大学毕业论文
理论来源:
本次设计主要分五个个功能,分别为测温湿度,烟雾及红外感应和报警,显示信息和报警信息、自动与手动风扇控制以及键盘控制。将这几个个功能巧妙的与家居结合,我们已经知道五个单独功能如何实现,现在要将五个功能通过单片机系统化反馈,以达到能实现综合五种功能的智能家居。
设计涉及主硬件:
STC89C52RC单片机,DHT11温室度传感器,DS1302时钟芯片,人体红外感
应器,烟雾传感器,智能风扇及其驱动器,按键设置与调控,LCD1602液晶显示模块,光电效应电路,蜂鸣器报警电路,以及超标指示显示模块组成。
系统功能介绍:
智能家庭控制系统的主要功能包括家庭设备自动及部分手动控制、家庭安全防范二个方面。其中家庭设备自动监控包括电器设备的集中、安全防御、显示完备、控制及数据采集。
(1)通过DHT11温湿度采集数据将信息显示于LCD1602上面,如果温湿度超出设定的预警值,那么风扇会自动开启,并且显示器有显示,指示灯有提示;待到坏境温湿度降到低于预警值的时候,风扇自动关闭指示也关闭;同时我们也可以手动按键开启风扇,不需要时则可手动关闭。
(2)通过DS1302时钟芯片可以及时准确的显示时间(年月日,时分秒,及周期)于显示器,非常容易知道查看我们的日常所需时间,并且该时钟芯片带有备用的电池,以便在断电情况下持续备电,以避免时间的不连续。
(3)采用烟雾探头传感器来检测我们周围环境的烟雾,可对煤气甲烷,以及我们周围着火的烟雾,或是抽烟的浓度等实时监测,如有超标,蜂鸣器报警,并有指示灯动作来提醒你解决当前的问题,解决之后,这些显示和指示指标自动关闭,所以能给您带来一定的安全感。
(4)光电感应电路能够根据外界环境光照强度大小来显示是否自动开启光敏电路灯,晚上灯照自动开启,白天则自动关闭,我们可以通过调节其灵敏度来达
4
江苏科技大学毕业论文
到我们的日常需求,此外该系统也可以手动开启led灯,来更进一步全方位的满足您的需求
(5)该设计的许多功能可以通过调节其灵敏度或是按键等来更进一步实现需求。
1.2简易方案设计
测温湿度:
测温湿度功能采用了DHT11传感器,该传感器能同时测出环境的温湿度,减少了外部硬件电路,具有低成本和易使用的特点。
感应方案:
感应分为烟雾传感器感测,红外距离感测,光电感测,其中烟雾传感器采用
MQ—2探头,红外传感器采用人体感测效应,光电感测采用根据外界光照强度大小效应。
显示方案:
显示功能分别采用1602液晶显示器,1602内部集成有显示芯片,可以识
别英文字母、阿拉伯数字和日语片假名,功能比较齐全;另外含有DS1302时钟芯片能显示完整的时间,基本可以满足本系统的要求。
控制方案:
控制分为手动和自动两种,其中自动控制有光敏电阻(代表日光灯),风扇
和蜂鸣器报警,而同时也可以手动控制风扇和灯的开关,体现出人性化以及易操作性的特性。
1.3主要器件型号
a.单片机 STC89C52RC b.温湿度传感器(DHT11)
c.显示器 (LCD1602液晶) d.烟雾测试(MQ-2探头) e.红外传感器:(人体红外探头)
f.时钟模块:(DS1302芯片)
g.电机驱动模块:(LM298驱动) H.光电感应模块(LM393驱动)
5
江苏科技大学毕业论文
二.系统实现
2.1 原理分析与硬件电路图
系统总体设计框图:
蜂鸣器
总电路图:
光控灯 红外报警 烟雾感测 万年历 显 示 器 智能家居系统 测量温湿度 风扇 按键控制 6
江苏科技大学毕业论文
总实物图:
7
江苏科技大学毕业论文
简易的PCB图(STC89C52单片机最小系统图):
8
江苏科技大学毕业论文
2.2单片机最小系统模块:
上拉电阻C133pFGND晶振电路RP1U119XTAL11P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161723456789RESPACK-8X1CRYSTAL18XTAL2C233pF9RSTVCC293031PSENALEEAR2200C31nF12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51复位电路R31k
线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。
其主要功能特性:
①兼容MCS-51指令系统 ②1000次擦写周期
③32个可编程I/O口 ④8K字节在系统可编程Flash存储器 ⑤3个16位可编程定时/计数器 ⑥时钟频率0-33MHz ⑦六个中断源 ⑧看门狗定时器
⑨低功耗空闲和掉电模式 ⑩掉电标识符 ⑾全双工UART串行通道 ⑿3级加密程序存储器
STC89C52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口
⒀双数据指针 ⒁掉电后中断可唤醒 STC89C52引脚简介说明
VCC:电源电压 GND:地
P0 口:P0口是一个8位漏极开路的双向I/O口。
9
江苏科技大学毕业论文
P1 口、P2 口和P3 口:都是具有内部上拉电阻的8 位双向I/O 口,它们的输出缓冲器能驱动4 个 TTL 逻辑电平。
RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。
XTAL1:振荡器反相放大器及内部时钟发生器的输入端。 XTAL2:振荡器反相放大器的输出端。
简述电路:该电路模块含有电路所需要的晶振起振电路,上电自动或是手动复位电路
2.3光电感应模块:
RV1R210kVCC1k8U2:A31R310kR41kC2R10.1uf1k241LDR1TORCH_LDRC10.1ufLM3932D3LED-YELLOW+88.8Volts
该电路采用LM393运放芯片来将光敏电阻采集到的模拟数据放大后给予单片机处理,从而达到在白天光照灯亮,而到了晚上则自动熄灭的要求,同时可通过滑动变阻器来调节其灵敏度来满足不同需求。
10
江苏科技大学毕业论文
2.4显示模块:
图.1602引脚图 图.1602实物图 本系统显示采用1602显示器:
引脚:1602采用标准的16脚接口,其中:
第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极
特性:3.3V或5V工作电压,对比度可调;内含复位电路;提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;有80字节显示数据存储器DDRAM;内建有192个5X7点阵的字型的字符发生器CGROM。 8个可由用户自定义的5X7的字符发生器CGRAM。
字符集:1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同
的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。具体读如下图。
11
江苏科技大学毕业论文
图
该液晶的功能室显示采集到的温度和湿度,而且当有温湿度和烟雾浓度超过预警值的时候会显示(YW OVER和WH OVER字样),在开启系统时有(WELCOME to zh jiaju)字样提醒的界面。
2.5温湿度模块:
温湿度传感器DHT11VCCdataNCGND
12
江苏科技大学毕业论文
DHT11系列数字温湿度传感器的特性: -全量程标定,单线数字输出;
-湿度测量范围:20%~90%RH(0-50℃温度补偿); -温度测量范围:0~+50℃; -湿度测量精度:±5.0%RH -温度测量精度:±2.0℃ -响应时间:<5s; -低功耗 特点:
相对湿度和温度一体测量
全量程标定,无需重新标定即可互换使用 超快响应时间
单线制数字接口(最简单的系统集成,超低的价格) 超小尺寸(12X15.5X5.5mm) 高可靠性
优化的长期稳定性
电气特性:
VDD=5V,T =25℃,除非特殊标注
参数 供电 供电电流 采样周期 条件 DC 测量 平均 待机 秒 min 3 0.5 0.2 100 1 typ max 5 5.5 2.5 0.5 150 单位 V mA mA uA 次
DHT11 的主要功能室采集外界环境的温湿度状况,然后将采集到的数据进行一定的算法转换来将温湿度的大小显示在液晶显示屏上面,该器件采用一根线来与单片机实现数据的传输,所以程序必须根据该器件的时序来严格的编程,否则效果会大大不佳,该器件的引脚分别为VCC,GND,以及DATA数据传输,其中的NC(第三脚)处于空穴状态,不需要与任何引脚连接,当该温湿度超过预警值时 ,风扇会自动开启来达到降温降湿的作用,同时会有相应的指示灯开启提醒。
2.6烟雾测试模块和人体红外感应模块:
13
江苏科技大学毕业论文
烟雾传感器YWVCCGNDDOAO
A. 标准工作条件 符号 Vc VH RL RH PH B. 环境条件 符号 Tao Tas RH O2 参数名称 使用温度 储存温度 相对湿度 氧气浓度 技术条件 -10℃-50℃ -20℃-70℃ 小于 95%RH 21%(标准条件) 参数名称 回路电压 加热电压 负载电阻 加热电阻 加热功耗 技术条件 ≤15V 5.0V±0.2 V 可调 31Ω±3Ω ≤900mW
备注 AC or DC AC or DC 室温 备注 最小值大于2% 氧气浓度会影响灵敏度特性 C. 灵敏度特性 符号 Rs 参数名称 敏感体表面电阻 技术参数 3KΩ-30KΩ (1000ppm 异丁烷 ) α(3000/1000) 浓度斜率 异丁烷 标准工作条件 预热时间 备注 探测浓度范围 100ppm-10000ppm 液化气和丙烷 300ppm-5000ppm 丁烷 5000ppm-20000ppm 甲烷 300ppm-5000ppm 氢气 100ppm-2000ppm 酒精 ≤0.6 温度: 20℃±2℃ Vc:5.0V±0.1V 相对湿度: 65%±5% Vh: 5.0V±0.1V 不超过1小时 应用: 适用于家庭或工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙烷、甲烷、酒精、氢气、烟雾等监测装置。 四、原理特点:
1、具有信号输出指示。
2、双路信号输出(模拟量输出及TTL电平输出) 3、TTL输出有效信号为低电平。(当输出低电平时信号灯亮,可直接接单片机)
14
江苏科技大学毕业论文
4、模拟量输出0~5V电压,浓度越高电压越高。 5、对液化气,天然气,城市煤气有较好的灵敏度。 6、具有长期的使用寿命和可靠的稳定性 7、快速的响应恢复特性
该器件有四个引脚,分别为VCC,GND,AO(模拟信号输出端),DO(数字信号输出端),本次系统所应用的是数字信号的输出传输给单片机处理,当外界的浓度超过一定值时,该传感器输出低电平,从而引发单片机去处理相应的报警动作响应,同时会有指示灯来提醒你目前环境状况处于不佳状态,显示器提醒超标状态。
2.7电机驱动模块示意:
电机驱动电路(LM293)风扇qd2VCCGNDqd1
LM298 N 引脚
恒压恒流桥式2A驱动芯片L298N
L298是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部同样包含4通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7 V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46 V。输出电流可达2.5 A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。
LM298N 功能表格: PWM_X X_EN1 X_EN2 运转状态 0 1
X 1 15
X 0 停止 正转 江苏科技大学毕业论文
1 1 1 0 1 0 1 1 0 反转 刹停 停止 风扇控制分为手动和自动,通过中断的控制可以按键开启与关闭,也可以根据温湿度是否超标来自动感应器风扇的关闭与否。
2.8 DS1302时钟模块:
VccDS1302备用电池U3GNDVcc81rst5sclk7io6VCC1VCC2X12X2RSTSCLKI/ODS1302CRYSTALX23
DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RST 复位(2)I/O 数据线(3)SCLK串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW
DS1302主要性能指标:★ 实时时钟具有能计算2100 年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力 ★ 8位暂存数据存储RAM
★ 串行 I/O 口方式使得管脚数量最少 ★ 宽范围工作电压2.0 5.5V ★ 工作电流 2.0V 时,小于300nA
★ 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式
★ 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配 ★ 简单 3 线接口
★ 与 TTL 兼容Vcc=5V
★ 可选工业级温度范围-40 +85
★ 双电源管用于主电源和备份电源供应
6.模块工作电压兼容3.3V/5V,可与5V及3.3V单片机连接 7.工作温度:0°---70° 接线方法:
16
江苏科技大学毕业论文
VCC→+5V/3.3V GND→GND CLK→P02 DAT→P01 RST→P00
DS1302芯片需要严格的读写时序才能将其内部资源利用起来,其中主要的就是时钟,复位脚,以及数据传输脚的协调配合,通过读写时序的结合将(年与日,时分秒,星期)显示于屏幕上面。
2.9报警电路模块(蜂鸣器)
Q1PNPfmR11k报警电路LS1SPEAKER
该电路通过接一个PNP三极管将信号放大来控制蜂鸣器的响否,从而通过超标控制产生报警提示。
3.0人体红外感应模块:
GND
功能特点:
1、全自动感应:人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。
2、两种触发方式:(可跳线选择)
a、不可重复触发方式:即感应输出高电平后,延时时间段一结束,输出将自动从高电平变成低电平;
17
江苏科技大学毕业论文
b、可重复触发方式:即感应输出高电平后,在延时时间段内,如果有人体在其感应范围
活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检
测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时 时间的起始点)。
5、具有感应封锁时间(默认设置:2.5S封锁时间):感应模块在每一次感应输出后(高电平变
成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。
此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产
品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(此时间可设置在零点几秒 —几十秒钟)。
6、工作电压范围宽:默认工作电压DC3.6V~30V。
7、微功耗:静态电流<50微安,特别适合干电池供电的自动控制产品。 8、输出高电平信号:可方便与各类电路实现对接。
注:调节距离电位器顺时针旋转,感应距离增大(约7米),反之,感应距离减小(约3米)。
调节延时电位器顺时针旋转,感应延时加长(约300S),反之,感应延时减短(约
18
江苏科技大学毕业论文
5S)。
它能自动快速开启各类白炽灯、荧光灯、蜂鸣器、自动门、电风扇、烘干机和自动洗衣
机等装置,是一种高技术产品。特别适用于企业,宾馆、商场、库房及家庭的过道、走廊等敏
感区域,或用于安全区域的自动灯光、照明和报警系统。
3.1按键模块:
该电路采用矩阵键盘来控制电路相关硬件设备工作与否,这也是手动设备给我们带来的方便之处。
3.2 程序下载部分:
通过下载电路,可以把需要应用的程序载入到单片机芯片AT89S52之中进行调试。
19
江苏科技大学毕业论文
三.系统设计与误差分析
四.总结
4.2 资料来源:
参考文献
[1] 何立民.单片机应用系统设计.北京:航天航空大学出版社.2001年. [2] 李广弟.单片机基础.北京:北京航空航天大学出版社,2001年. [3] 何希才.新型实用电子电路400例.电子工业出版社,2000年. [4] 赵负图.传感器集成电路手册,第一版.化学工业出版社,2004年. [5] 杨邦文.新型实用电路制作200例.北京:人民邮电出版社,1998年. [6] 邹其洪.电工电子试验与计算机仿真.北京:电子工业出版社.2003年.
20
江苏科技大学毕业论文
4.3总结:
通过本次电子设计的参与以及行动,同学的互相合作以及老师的及时指导,感觉有不少的收获,从题目的选取到材料的准备,从硬件的焊接到软件的编程,都有所感悟。其中硬件的测试涉及到了示波器和万用表等的使用,软件设计到了keil编程环境的熟悉,proteus仿真电路的应用,以及altium的使用(单片机最小系统设计)等。但是过程中也遇到了很多麻烦,通过网络,老师,同学间的合作力量基本将其解决。由于水平的有限,所以各方面的设计效果还有很多欠缺待我们去进一步的学习与努力才能行之有效。 4.4 系统调试与分析:
在硬件准备差不多的时候,最关键的就是软件的程序调试。在这个过程中程序出现过很多错误,以致于硬件无法运行或是效果太差等。
1.比如说这次用到的液晶显示,刚开始用的是P0口,程序没有错误和警告,但是液晶却无法显示字符,通过多番测试才知道P0口的驱动不足,所以更换IO口后,便能正确显示。
2.如由于这次程序用的比较多,但是RAM空间又小,
21
江苏科技大学毕业论文
所以程序中的变量定义,必须改为idata(就是全部RAM区)型的,包括数组,否则变量随意分配会引发意想不到的后果。
3.如光电感应的调试,刚开始怎么也不显示效果,多番检测之后,发现不是程序的问题,而是硬件电路LM393没有连接好导致的。
4.再如由于这次的使用传感器较多,所以带来的后果是如果公地太多势必会影响到实际的运行结果及其稳定性,比方说液晶,温湿度,以及光电的共地会使液晶的显示极度不稳定。
5.烟雾的调节也很重要,如果灵敏度这些太高或是太低都会带来比较麻烦的后果,我们通过多次测试将其调节到一定值后才能更加有效的工作。
6.延时的多少也很重要,该次使用11.0592MHZ的,如果不当会使有关硬件的响应缓慢或是误差太大。 4.5 系统性能分析与评估:
该系统的基本功能实现基本还算稳定,但是由于这次设计的硬件主要是以最小系统为基准设计的,所以在外扩展其他硬件功能时难免会用到导线连接,而这次设计所占用的IO口比较多,所以带来的后果是看起来并不是美观而协调的。相如温湿度的采集可以说是灵敏迅速,能够实时的显示环境的温湿度。光敏电
22
江苏科技大学毕业论文
阻通过滑动变阻器的调节也是很灵敏,处于黑暗状态他能马上亮起来,明亮状态马上熄灭。当烟雾超标时,液晶屏及时的显示超标信息以及指示信号。其他功能基本都行,但是由于时间紧急加上水平有限,往后还有很多方面需要改善,而且最好能够实现无线控制或是基于GSM的控制。
五.电路运行代码源程序:
1.主程序(zhineng.c)
#include #include\"1602.h\" //采用1602液晶显示 #include\"dht11.h\" #include\"tiaosu.h\" //风扇头文件 #include\"shizhong.h\" //DS1302显示时钟:年月日,时分秒,以及星期显示 #define uint unsigned int #define uchar unsigned char uchar idata temp[] =\"SD:SET:00% \\0\"; //设置 的湿度值显示 uchar idata temp_s[] =\"RS:00% TEMP:00 \\0\"; //实时湿度显示 uchar idata wsdisplay[]=\" WH Over:\\0\"; //温湿度超载显示 uchar idata ywdisplay[]=\" YW Over:\\0\";//烟雾超载浓度显示 uchar idata title0[]=\" Welcome To:\\0\"; //上电显示界面 uchar idata title1[]=\" ZN House \\0\" ; sbit sw1=P3^0; //温湿度调节 sbit sw2=P3^1; //温湿度调节P2^5 sbit led=P2^1;// 光敏电阻光照灯显示 35 sbit ss=P2^2;//光照检测 P0^1 P0^0 sbit led1=P3^5;//温湿度异常指示 sbit led2=P3^6; //烟雾浓度过高指示 sbit led3=P3^7; //手动开启照明灯指示 sbit key4=P2^5; //按键控制开启照明灯 23 江苏科技大学毕业论文 sbit baojing=P3^6; //蜂鸣器报警 sbit yw=P2^2; //烟雾探头 sbit key1=P3^2; //中断控制风扇自动停止与否 sbit key2=P3^3; //风扇停止位控制 sbit key3=P3^4; //功能选择:进行时间和温湿度显示的切换 ///// sbit hw=P2^1; //人体红外检测模块 uchar idata set; //变量定义 uchar idata num1; uchar idata getdata=55; uint idata shangxian=85; //湿度上线值设置 uchar idata temp_h,temp_t,fleg; void conv(); void key(); void kongzhi(); void guangming(); void ywjiance(); void hwjiance(); void autoled(); void guangming() { led=0; if(ss==0) led=1; } void zhuanhuan()//扫描数据转换 { temp[7]=shangxian/10%10+0x30; temp[8]=shangxian%10+0x30; temp_s[3]=temp_h/10%10+0x30; temp_s[4]=temp_h%10+0x30; temp_s[3]=temp_h/10%10+0x30; temp_s[4]=temp_h%10+0x30; temp_s[12]=temp_t/10%10+0x30; temp_s[13]=temp_t%10+0x30; temp_s[14]=0xdf; 24 江苏科技大学毕业论文 temp_s[15]='C'; } void main(void) { baojing=1; delay(200); PWM1=0; PWM2=0; LCD_Initial(); //液晶初始化 GotoXY(0,0); Print(title0); GotoXY(0,1);//显示起始位置 Y=0,第一行,Y=1 第二行 Print(title1);// 内容 delay(500); clock(); delay(100); while(1) { EA=1; IT0=1; EX0=1; // IT1=1; // EX1=1; // IP=0x01; delay(10); ywjiance(); hwjiance(); guangming(); autoled(); delay(10); RH(); temp_t=U8T_data_H; temp_h=U8RH_data_H; zhuanhuan(); key();// 按键检测 kongzhi(); if(key3==0) { delay(10); if(key3==0) { Display(); 25 显示第二行 江苏科技大学毕业论文 delay(3000); LCD_clear(); } } GotoXY(0,0);//显示起始位置 Y=0,第一行,Y=1 第二行//显示第一行 Print(temp);// 内容 GotoXY(0,1);//显示起始位置 Y=0,第一行,Y=1 第二行 显示第二行 Print(temp_s);// 内容 delay(1); //getdate= GetADCResult(0)*3.9; } } void key() //按键检测程序 {if(set==0)//上限设置 { if(sw1==0) //上限 减功能 { delay(50); if(sw1==0) { if(shangxian>0) shangxian--; else( shangxian=255); } } if(sw2==0) //上限 加功能 { delay(50); if(sw2==0) { if(shangxian<255) shangxian++; else( shangxian=0); } } } } void autoled() { 26 江苏科技大学毕业论文 if(key4==0) { delay(10); if(key4==0) { if(fleg) { led3=1; fleg=0; } else { led3=0; fleg=1; } } } } void ywjiance() { yw=1; led2=0; if(yw==0) { delay(500); GotoXY(0,0); Print(ywdisplay); delay(1000); baojing=0; led2=1; } } void hwjiance() { //hw=0; if(hw==1) { baojing=0; } else baojing=1; } void kongzhi() //控制报警 { 27 江苏科技大学毕业论文 led1=0; if((temp_h>=shangxian)|(temp_t>35)) //此处 设定预设温度 { GotoXY(0,0); Print(wsdisplay); delay(1000); led1=1; PWM1=0; PWM2=1; } else { led1= 0; PWM1=0; PWM2=0; } } void int0(void) interrupt 0 { delay(10); while(key2!=0) { PWM1=0; PWM2=1; } } 2.头文件(DHT11.H) #include typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */ typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */ typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */ typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */ typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */ typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */ 28 江苏科技大学毕业论文 #define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //相当于用Data_0_time代替4. sbit DQ = P2^7; // IO口定义 U8 U8FLAG,k; //定义区 U8 U8count,U8temp; U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; U8 U8comdata; U8 outdata[5]; //定义发送的字节数 U8 indata[5]; U8 count, count_r=0; U16 U16temp1,U16temp2; //以上为变量的定义. void COM(void); void Delay2(U16 j) //延时函数 { U8 i; for(;j>0;j--) { for(i=0;i<27;i++); } } void Delay_10us(void) //延时10us的延时函数. { U8 i; i--; i--; i--; i--; i--; i--; } void COM(void) { U8 i; for(i=0;i<8;i++) { U8FLAG=2; while((!DQ)&&U8FLAG++); Delay_10us(); 29 江苏科技大学毕业论文 Delay_10us(); Delay_10us(); U8temp=0; if(DQ)U8temp=1; U8FLAG=2; while((DQ)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1; //左移1位 U8comdata|=U8temp; //U8comdata与U8temp相或,结果保存在U8comdata中. } } //-------------------------------- //-----湿度读取子程序 ------------ //-------------------------------- //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM(); //-------------------------------- void RH(void) { //主机拉低18ms DQ=0; Delay2(180); DQ=1; //总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主机设为输入 判断从机响应信号 DQ=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DQ) //T ! { 30 江苏科技大学毕业论文 U8FLAG=2; //判断从机是否发出 80us 的低电平响应信号是否结束 while((!DQ)&&U8FLAG++); U8FLAG=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((DQ)&&U8FLAG++); //数据接收状态 COM(); //调用COM函数 U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; DQ=1; //数据校验 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; }//对数据作出相应的处理与运算. } } 3.头文件液晶显示(1602.h) #include #define uint unsigned int #define uchar unsigned char void delay(uint z) //延时函数 { uint a,b; for(a=z;a>0;a--) for(b=120;b>0;b--); 31 江苏科技大学毕业论文 } sbit LcdRs = P2^1; sbit LcdRw = P2^2; sbit LcdEn = P2^3; sfr DBPort = 0x90; //端口定义,LcdRs就代表P1^0口,以下同. //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口 unsigned char LCD_Wait(void) //内部等待函数,LCD的显示需要一定的延迟时间. { LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); LcdEn=0; return DBPort; } //向LCD写入命令或数据 #define LCD_COMMAND 0 // Command #define LCD_DATA 1 // Data #define LCD_CLEAR_SCREEN 0x01 // 清屏 #define LCD_HOMING 0x02 // 光标返回原点 //以上4行为宏定义,以后出现LCD_HOMING的地方就可以用0x02来代替. void LCD_Write(bit style, unsigned char input) //LCD写入子函数,形参为数据类型和无符号字符型输入. { LcdEn=0; LcdRs=style; //数据类型传递给LcdRS LcdRw=0; _nop_(); DBPort=input; _nop_();//写入的数据传递给DBPort LcdEn=1; _nop_();//注意顺序 LcdEn=0; _nop_(); LCD_Wait(); //调用内部等待函数. } //设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开 #define LCD_HIDE 0x00 //显示关 #define LCD_CURSOR 0x02 //显示光标 #define LCD_NO_CURSOR 0x00 //无光标 #define LCD_FLASH 0x01 //光标闪动 #define LCD_NO_FLASH 0x00 //光标不闪动 32 江苏科技大学毕业论文 void LCD_SetDisplay(unsigned char DisplayMode) //LCD显示设置子函数 { LCD_Write(LCD_COMMAND, 0x08|DisplayMode); } //设置输入模式************************************************************ #define LCD_AC_UP 0x02 #define LCD_AC_DOWN 0x00 // default #define LCD_MOVE 0x01 // 画面可平移 #define LCD_NO_MOVE 0x00 //default void LCD_SetInput(unsigned char InputMode) { LCD_Write(LCD_COMMAND, 0x04|InputMode); } //初始化LCD*********************************************************** void LCD_Initial() //初始化函数. { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 delay(5); LCD_Write(LCD_COMMAND,0x38); delay(5); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 delay(5); LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 delay(5); LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 delay(5); } void GotoXY(unsigned char x, unsigned char y) //液晶字符输入的位置 { if(y==0) LCD_Write(LCD_COMMAND,0x80|x); if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40)); } void Print(unsigned char *str)//将字符输出到液晶显示 33 江苏科技大学毕业论文 { while(*str!='\\0') { LCD_Write(LCD_DATA,*str); str++; delay(1); } } 4.头文件时钟显示(shizhong.h) #include #define uchar unsigned char #define uint unsigned int uchar dis_time_buf[16]={0}; sbit RST=P1^7;//DS1302引脚定义 sbit IO=P1^6; sbit SCK=P1^5; //DS1302地址定义 #define ds1302_sec_add 0x80 //秒数据地址 #define ds1302_min_add 0x82 //分数据地址 #define ds1302_hr_add 0x84 //时数据地址 #define ds1302_date_add 0x86 //日数据地址 #define ds1302_month_add 0x88 //月数据地址 #define ds1302_day_add 0x8a //星期数据地址 #define ds1302_year_add 0x8c //年数据地址 #define ds1302_control_add 0x8e //控制数据地址 #define ds1302_charger_add 0x90 #define ds1302_clkburst_add 0xbe uchar time_buf[8] = {0x20,0x14,0x05,0x11,0x21,0x50,0x00,0x02};//初始时间2010年6月1号23点59分55秒 星期二 void Delay_xms(uint x) //11.0592M时,j<122 功能:延时1毫秒 { uint i,j; for(i=0;i void Delay_xus(uint t)//功能:12us延时 { for(;t>0;t--) { _nop_(); } 34 江苏科技大学毕业论文 } void LCD_en_write(void) //控制LCD写时序 { LcdEn =1; Delay_xus(20); LcdEn =0; Delay_xus(20); } void Write_Instruction(uchar command) //写指令函数 { LcdRs=0; LcdRw=0; LcdEn=1; DBPort =command; LCD_en_write();//写入指令数据 } void Write_Data(uchar Wdata)//写数据函数 { LcdRs=1; LcdRw=0; LcdEn=1; DBPort =Wdata; LCD_en_write();//写入数据 } void LCD_SET_XY(uchar X,uchar Y)//字符显示初始地址设置 { uchar address; if(Y==0) address=0x80+X;//Y=0,表示在第一行显示,地址基数为0x80 else address=0xc0+X;//Y非0时,表时在第二行显示,地址基数为0xC0 Write_Instruction(address);//写指令,设置显示初始地址 } //在第X行Y列开始显示Wdata所对应的单个字符 void LCD_write_char(uchar X,uchar Y,uchar Wdata) { LCD_SET_XY(X,Y);//写地址 Write_Data(Wdata);//写入当前字符并显示 } //清屏函数 void LCD_clear(void) { Write_Instruction(0x01); Delay_xms(5); 35 江苏科技大学毕业论文 } void ds1302_init(void) { RST=0; //RST脚置低 SCK=0; //SCK脚置低 } void ds1302_write_byte(uchar addr, uchar d) //向DS1302写入一字节数据 { uchar i; RST=1; //启动DS1302总线 //写入目标地址:addr addr = addr & 0xFE; //最低位置零,寄存器0位为0时写,为1时读 for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO=1; } else { IO=0; } SCK=1; //产生时钟 SCK=0; addr = addr >> 1; } //写入数据:d for (i = 0; i < 8; i ++) { if (d & 0x01) { IO=1; } else { IO=0; } SCK=1; //产生时钟 SCK=0; d = d >> 1; } RST=0; //停止DS1302总线 } //从DS1302读出一字节数据 uchar ds1302_read_byte(uchar addr) { uchar i,temp; RST=1; //启动DS1302总线 //写入目标地址:addr 36 江苏科技大学毕业论文 addr = addr | 0x01; //最低位置高,寄存器0位为0时写,为1时读 for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO=1; } else { IO=0; } SCK=1; SCK=0; addr = addr >> 1; } //输出数据:temp for (i = 0; i < 8; i ++) { temp = temp >> 1; if (IO) { temp |= 0x80; } else { temp &= 0x7F; } SCK=1; SCK=0; } RST=0; //停止DS1302总线 return temp; } //向DS302写入时钟数据 void ds1302_write_time(void) { ds1302_write_byte(ds1302_control_add,0x00); ds1302_write_byte(ds1302_sec_add,0x80); //ds1302_write_byte(ds1302_charger_add,0xa9); ds1302_write_byte(ds1302_year_add,time_buf[1]); ds1302_write_byte(ds1302_month_add,time_buf[2]); ds1302_write_byte(ds1302_date_add,time_buf[3]); ds1302_write_byte(ds1302_hr_add,time_buf[4]); ds1302_write_byte(ds1302_min_add,time_buf[5]); ds1302_write_byte(ds1302_sec_add,time_buf[6]); ds1302_write_byte(ds1302_day_add,time_buf[7]); ds1302_write_byte(ds1302_control_add,0x80); } //从DS302读出时钟数据 void ds1302_read_time(void) 37 //关闭写保护 //暂停时钟 //涓流充电 //年 //月 //日 //时 //分 //秒 //周 //打开写保护 江苏科技大学毕业论文 { time_buf[1]=ds1302_read_byte(ds1302_year_add); //年 time_buf[2]=ds1302_read_byte(ds1302_month_add); //月 time_buf[3]=ds1302_read_byte(ds1302_date_add); //日 time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时 time_buf[5]=ds1302_read_byte(ds1302_min_add); //分 time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59 time_buf[7]=ds1302_read_byte(ds1302_day_add); //周 } void Display(void) { LCD_write_char(3,0,dis_time_buf[0]+'0'); LCD_write_char(4,0,dis_time_buf[1]+'0'); LCD_write_char(5,0,dis_time_buf[2]+'0'); LCD_write_char(6,0,dis_time_buf[3]+'0'); LCD_write_char(7,0,'/'); LCD_write_char(8,0,dis_time_buf[4]+'0'); LCD_write_char(9,0,dis_time_buf[5]+'0'); LCD_write_char(10,0,'/'); LCD_write_char(11,0,dis_time_buf[6]+'0'); LCD_write_char(12,0,dis_time_buf[7]+'0'); LCD_write_char(15,0,dis_time_buf[14]+'0'); //第2行显示 LCD_write_char(3,1,dis_time_buf[8]+'0'); LCD_write_char(4,1,dis_time_buf[9]+'0'); LCD_write_char(5,1,':'); LCD_write_char(6,1,dis_time_buf[10]+'0'); LCD_write_char(7,1,dis_time_buf[11]+'0'); LCD_write_char(8,1,':'); LCD_write_char(9,1,dis_time_buf[12]+'0'); LCD_write_char(10,1,dis_time_buf[13]+'0'); } //定时器中断函数 void Timer2() interrupt 5 //定时器2是5号中断 { static uchar t; 38 江苏科技大学毕业论文 TF2=0; t++; if(t==4) //间隔200ms(50ms*4)读取一次时间 { t=0; ds1302_read_time(); //读取时间 dis_time_buf[0]=(time_buf[0]>>4); //年 dis_time_buf[1]=(time_buf[0]&0x0f); dis_time_buf[2]=(time_buf[1]>>4); dis_time_buf[3]=(time_buf[1]&0x0f); dis_time_buf[4]=(time_buf[2]>>4); //月 dis_time_buf[5]=(time_buf[2]&0x0f); dis_time_buf[6]=(time_buf[3]>>4); //日 dis_time_buf[7]=(time_buf[3]&0x0f); dis_time_buf[14]=(time_buf[7]&0x07); //星期 //第2行显示 dis_time_buf[8]=(time_buf[4]>>4); //时 dis_time_buf[9]=(time_buf[4]&0x0f); dis_time_buf[10]=(time_buf[5]>>4); //分 dis_time_buf[11]=(time_buf[5]&0x0f); dis_time_buf[12]=(time_buf[6]>>4); //秒 dis_time_buf[13]=(time_buf[6]&0x0f); } } void Init_timer2(void)//定时器2初始化 { RCAP2H=0x3c;//赋T2初始值0x3cb0,溢出20次为1秒,每次溢出时间为50ms RCAP2L=0xb0; TR2=1; //启动定时器2 ET2=1; //打开定时器2中断 EA=1; //打开总中断 } void clock(void)//主函数 { Delay_xms(50);//等待系统稳定 LCD_clear(); //清屏 ds1302_init(); //DS1302初始化 Delay_xms(10); ds1302_write_time(); //写入初始值 Init_timer2(); //定时器2初始化 } 5.风扇控制(tiaosu.h) #include sbit PWM1=P2^4;//PWM 通道 1,反转脉冲 39 江苏科技大学毕业论文 sbit PWM2=P2^3;//PWM 通道 2,正转脉冲 六. 指导老师: 张晓莉老师 40 因篇幅问题不能全部显示,请点此查看更多更全内容