“居室眼睛”智能窗户控制系统
学院(部):专 业:班 级:指导老师:(毕业论文)
2014年1月
目 录
一、 概述 ................................................ 1
1.1 引言 .............................................. 2
二、市场分析 ............................................. 3
2.1 当前窗户分析 ...................................... 4
2.2 市场需求 .......................................... 4
三、系统设计方案 ......................................... 6
3.1 功能描述 .......................................... 7
3.2 重要组成部分 ...................................... 8
3.3 实现方法 .......................................... 8
3.4 使用方法 .......................................... 9
四、设计特点 ............................................ 10
4.1 创新点 ........................................... 10
4.2 科学性 ........................................... 10
4.3先进性 ............................................ 10
五、推广前景 ............................................ 11
5.1安全性分析 ....................................... 11
5.2发展前景 ......................................... 11
六、结论 ................................................ 12
七、致谢 ................................................ 13
八、附录 ................................................ 14
II
一、 摘要
在我国智能家居也成为近年来一个最热门的话题之一, 智能家居窗户也成为了其中必不可少的一部分, 引发了不少研究。
智能家居控制系统的应用让人们在家中能够享受到更安全、更舒适、更方便的生活,并且使生活更具有人性化,而现代家居中,窗户具有良好的装饰是采光和阻挡灰尘空气循环的主要途径,但同时也是盗窃非法进屋的一个重要途径,目前市场上智能家居虽然集成了家居生活有关的设施,但是对于各部分不能做到细致具体的设计,常常忽略了一些必要的功能(如烟雾检测功能、温湿度检测功能、红外检测报警功能、自动换气功能)或者不够人性化。而窗户是智能家居的一个重要的组成部分,因此更好地实现窗户的智能控制和安全防护提升家居安全性、便利性、舒适性、艺术性显得尤为重要。
但是当前大部分窗户控制系统在一定程度上不是很完善,而且没有安防检测功能;有的产品没有换风系统;有的产品没有红外感应安防的功能。但是智能窗户控制系统它能在下雨且家中无人时, 自动关闭以防止雨水进入损坏室内财物, 室内有害气体超标则自动开窗, 有盗贼入内则自动报警, 当室内温湿度过高或过低时, 自动监测调节环境, 使窗户真正的智能起来, 就会给人们的居家生活带来诸多方便,从而进一步提高人们的生活质量。
关键词:STC89C52 定时 1602液晶 遥控 智能
二、市场分析
2.1窗户分析
当前大部分窗户在有烟雾过大时,或者在下雨天有雨水溅入时都要通过手动去开窗或关窗。在空气比较闷热时(超过26°C ),不能自动进行开窗以及通风换风,而且现在很多城市(揭阳、清远、韶关、广州,深圳等等)PM 2.5(可入肺颗粒物)季均浓度都超过了国家空气新标准规定的二级限值35微克/立方米,严重危害人体健康,而现在大部分窗户都没有过滤装置,为了提高人们的生活质量,我们可以通过在窗户上的换风装置上装一个PM 2.5过滤器,而且这个过滤器可以手动卸掉,进行定时清洁。现在大多数的窗户系统都没有安防的功能,当有小偷想从窗户进入偷窃,不能及时发现,造成很大的损失,所以在窗户上装红外检测防盗系统,能够及时报警,尽量避免不必要的损失等等。
2.2 市场需求
目前市场上智能家居虽然集成了家居生活有关的设施,但是对于各部分不能做到细致具体的设计,常常忽略了一些必要的功能(如烟雾检测功能、温湿度检测功能、红外检测报警功能、自动换气功能)或者不够人性化。而窗户是智能家居的一个重要的组成部分,因此更好地实现窗户的智能控制和安全防护提升家居安全性、便利性、舒适性、艺术性显得尤为重要。
三、系统设计方案
3.1功能概述
智能窗户控制系统分为两部分设计即电子自动控制部分和机械传动部分,电子控制部分使用STC89C52单片机为核CPU ,集成多种传感器实现监测控制; 机械传动部分设计在窗户上安装步进电机,实现精确控制窗户和窗帘的开启。
设计实现如下功能:
1.显示温湿度、烟雾值 、亮度值 、系统时间
2. 设定湿度、亮度值、烟雾上下限值功能
3.手动、红外遥控自动开|关窗户功能
4.定时开|关窗户功能
5.下雨时通过温湿度传感器窗户自动关窗功能
6. 当室内亮度值达到设定值时自动开|关窗户
7. 当室内烟雾|可燃气体达到设定值时,窗户自动开启并且报警 和启动换风功能
8. 红外探测防盗报警功能
3.1.1设计原理以及组成结构:
智能窗户控制系统使用机械传动控制窗户的开关与窗帘的开合,机械部分由步进电机提供动力,通过设计动滑轮组在运动部件和窗架间进行传动。电子自动控制系统部分包含湿度温度探测传感器模块、光敏电阻传感器模块、烟雾探测传感器模块、红外检测防盗模块、换风控制模块。各传感器将探测到的变化反映到单片机口,由单片机根据信号的变化(即电平的高低) 判断外界环境的变化,然后根据内部设定的程序发出命令,控制机械传动部分实现相应的动作。
系统总体框架如下图所示:
3.2重要组成部分
3.2.1探测电路设计:
(1).温湿度探测电路
使用DHT11数字温湿度传感器。该传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。单片机与DHT11之间的通讯和同步,采用单总线数据格式,一次传40位数据,高位先出。
(2).光敏电阻电路
使用的探测元件是LY-C1光敏传感器。光敏电阻对周围环境光强最敏感,一般用来检测周围环境光强。输出状态灵敏度可调。在周围光强达不到阈值时,D0口输出高电平; 光强超过阈值时,D0口输出低电平。依据此原理可以用来监测外界环境亮度,判断天色,当天黑时,信号端输出高电平。LY-C3传感器的D0端接单片机的P3.6口。单片机检测此IO 口的变化自动控制窗户的开启与关闭。
(3).红外检测防盗电路
该部分自行设计了激光防盗电路,探测器由发射头、接收头组成。正常情况时,发射头发射红外线,接头接收红外线,探测器导通不动作。当有人挡住红外线时,接收头接收不到由发射头发射的红外线,探测器断开输出低电平信号。本系统中安装有两组红外探测器,两个接收头的输出端接单片机的P3.3口和P3.4口,可确保对整个窗户面实现防盗。
3.2.2控制及输出电路设计
(1).换风系统电路
主要原理是:用风机将空气抽入机器,通过内置的滤网过滤空气,主要能够起到过滤粉尘、异味、有毒气体和杀灭部分细菌的作用。
(2). 液晶显示电路
液晶显示电路采用LCD1602液晶显示屏。其显示的内容为16X2, 即可以显示两行,每行16个字符。
主要负责显示光度、系统时间、室内外温度和室外的湿度。
(3). 步进电机电路
本电路由两组ULN2003模块和24YBJ 组成。
(4).红外遥控系统
红外遥控系统一般分发射和接收两个部分。发射部分的主要元件为红外发光二极管,接收部分的是红外接收管。
红外遥控的特点是不影响周边环境、不干扰其它电器设备、使用方便。
(5).蜂鸣器电路
蜂鸣器正极接高电平,负极接单片机P3.1端。
3.3.1软件程序
程序流程图
智能窗户系统工作:
接通电源后,单片机开始工作。步进电机模块启动,窗户首先关闭。湿温度传感器、烟雾传感器、光敏电阻、红外检测控制模块将检测到的信号传入到单片机中。湿温度传感器检测到室外湿度超过70%
时,单片机控制步进电机关窗。当窗户与窗框完全接触时,两个关窗
限位片导通,步进电机停止转动。当烟雾传感器探测到室内有可燃气体或浓雾超标时,单片机立刻发出开窗指令,窗户打开至两个开窗限位器接触时,停止电机转动,在此期间蜂鸣器进行报警,换风系统启动。在开窗的状态下,红外检测探头如果检测到有物体靠近,此时窗户自动关闭,并且蜂鸣器进行报警。进入夜晚时,在光敏电阻发出的信号后,关闭窗户。
3.4实现方法
智能窗户控制系统使用机械传动控制窗户的开关与窗户的开合,机械部分由步进电机提供动力,通过设计动滑轮组在运动部件和窗架间进行转动。实现通过传感电路不断循环检测室内光亮度、温湿度、有害气体(如媒气) 浓度等信号,然后与由预先设置的参数临界值相比较, 从而作出开/关窗的判断, 再结合窗状态检测电路所检测到的当前窗状态, 再输出脉冲信号调整步进电机,通过步进电机顺|逆转动带动滑轮组转动,从而使窗户开|关。
数据检测传感电路由四个部分组成:
(1)温湿度传感是放在窗户外面的,如在下雨天(湿度超过70%)时,能及时准确检测到温湿度变化,进行关窗动作;
(2)烟雾传感器是放在窗里面的,如有可燃气体泄漏|烟雾超过标准值时,通过步进电机顺时针旋转带动滑轮组在窗架转动使窗户打开,同时换风系统自动启动进行换气,蜂鸣器进行报警,发出声音;
(3)红外防盗探测头是放在窗户里面,当有小偷想通过窗户进来偷窃,可以及时发现,进行报警,并自动关窗;
(4)光敏电阻可以放在窗外|里面都可以,通过检测亮度,判断白天还是夜晚,自动关窗|开窗。换风系统是装在窗户最上面的,窗户上面要留一个适合风机大的可穿过位置。风机里面内置过滤网,并且可以卸装的。
3.5使用方法
1、可以通过红外遥控,直接对窗户进行开|关窗;
2、通过对按键的输入,预先设置的参数(亮度上|下限值、烟雾
上限值、温湿度),校对时间标准,可以进行定时开|关窗;
3、可以通过手动按键进行开|关窗,及可以进行复位功能消除警报。
四、设计特点
4.1创新点
将多个传感器和单片机相结合,来执行窗户的开或关,通过蜂鸣器报警,来提示人们所发生的变化,体现作品更加人性化设计。还有排|换风系统,在换风装置上增PM2.5过滤器,这个过滤器还可以卸掉进行定时清洁,进一步提高人们生活质量。
4.2科学性
现在的窗户大部分都是通过人为手动去关闭和打开的,但是当人不在家时,一旦发生意外时(煤气泄漏、有浓烟、下雨、有小偷..... )时不能快速且有效的去关闭或打开窗户,为家庭带来很大的隐患,所以我们设计的窗户控制系统,完全可以满足大部分人的需求,当各个意外时,系统都会给予自动处理的。
4.3 先进性
(1)单片机与警报电路相结合,通过单片机空间窗户打开与关闭 。
(2)实现单片机与数据检测模块结合,有自动报警功能。
(3)实现单片机与单片机之间的相互通信。
五、推广前景
5.1安全性分析
每年发生数以万起因煤气泄漏引发的火灾和入室犯罪案件,都已表明对居家环境的安全防范迫在眉睫。有鉴于此,开发一套功能齐全
的智能窗户无论是从经济价值角度分析,还是从治安的角度考虑,都有广泛的发展前景,如果智能家居安防系统能够得到广泛应用,必能会对犯罪分子形成强有力的威慑作用,减少入室盗窃、机动车盗窃等家居相关案件的发生,为构建社会主义和谐社会贡献一份力量。
5.2 发展前景
随着社会的发展,科技的进步以及人们生活水平的逐步提高,各种方便生活的自动控制系统进入了人们的生活,智能窗户已经深入一些高级写字楼,将来普通楼宇及家具的智能化必然是一种趋势。
但当前的窗户系统在一定程度不是很完善,有的该系统只有简单的开关窗功能,系统不是很完善,而且没有安防报警功能,在发生意外时只是开窗或关窗,而使用者完全没有发现所发生的意外,不能人为的去解除所产生的意外,而该智能窗户采用多个传感器和单片机的结合,通过传感电路不断循环检测室内光亮度、温湿度、有害气体(如媒气) 浓度等信号,通过传感器检测到的信号给单片机命令,然后再由单片机去执行窗户的开或关,所以该智能窗户在家庭中很大一部分减轻了人们的压力,为人省去很多不必要的担心,同时加快了家庭中自动化的发展,该作品经济、节约、实用性强。 很是适用于家中窗户的智能化安装,实用性强,有广大的市场发展前景。
总结
智能窗户控制系统的设计通过硬件和软件的设计同时考虑多种情况,解决了大部分问题,经过多次调试和修改,成功的将多种传感器集成进系统中,完好的实现了各项功能设计。该智能窗让人在不同的环境状况中或出门在外时不用担心窗户的开合情况。让人在无法手动直接控制时能够通过红外遥控控制窗户;夜间发生入室行为时窗户会自动报警,为人们生活提供方便和安全;当不启用智能窗系统时,也可以通过手动对窗户进行开关,更具人性化。
针对一些老式窗户还存在一定难度进行改造实现使其具有智能化、人性化;但该窗户智能设计仍然具有较大的提升空间。例如:该智能窗户系统还可以在窗户玻璃上装震动传感器,当有小偷破窗而进时,能及时知道有人是在破窗而进并进行报警;也可以在窗户控制系统上安装GSM 通信模块,当室内有害气体浓度过高时|有小偷入室偷窃时,可以及时通过短信通知主人;还可以将智能窗户控制系统与互联网连接起来,主人可以通过手机或终端对窗户的检测了解家里的情况,这样可以为人们的生活提供更多的安全保障。
致谢
在设计和说明书写作的整个过程中,指导教师老师在各个方面都给予了全面的指导和帮助。老师精深渊博的知识,求实创新、勤奋严谨的治学风范,忘我的工作作风时刻熏陶着我。老师因材施教、诲人
不倦的授业精神给我们留下了深刻的印象,这将使我们受益终身 。 在此,特别感谢老师对我们在学习、工作上给予我们的热情关怀、
温湿度传感器
另外,也感谢其他机电学院老师,以及同学在我们完
换气系统
成设计时提出了很多宝贵的意见和无私的帮助。
光敏电阻
步进电机
通过本次设计,LCD1602显示屏
而提高这三方面的能力。自己根据毕业设计任务中的
烟雾传感器
STC89C52单片机
内容和要求, 进一步掌握了电子产品设计的步骤和方法,学会查找和运用有关设计手册和技术
红外探测头传感器
在此,十分感谢指导老师对我们的精心指导和培养,使我们学到许多知识,得到了很好的锻练,给于我们平台磨练自己,这些都为我们以后走上工作岗位打下了良好基础。
附录:
制作模块如下图所示:
实体安装设计图:
程序:
#include //库函数
#include //库函数//如果 实物 打开 #include //AD转换库函数
#define uchar unsigned char//宏定意 #define uint unsigned int//宏定意
#define ulong unsigned long //宏定意 bit s=1;
sbit rs=P2^0;//LCD 1602 引脚定意 sbit rd=P2^1;//LCD 1602 引脚定意 sbit lcden=P2^2;//LCD 1602 引脚定意 sbit menu=P2^5; //主功能键 sbit add=P2^4;//加键 sbit dec=P2^3;// 减键
sbit open=P2^6;// 手动 开 sbit close=P2^7;// 手动 关
sbit IR=P3^5; //红外感 应 sbit BEEP=P3^1;// 报警 sbit pf=P3^0; //排风
#define MOTORSTEP P1 //宏定义,定义P1口为步进电机驱动端口
uchar dsflj,kval,lofl,menusw,con,befl,zhenfl,fanfl,brigfl;// 各种变量标记 正返转标记 uint sudu,dwbrigfl,humfl; //电机速度 //光度下限/湿度标记
uchar count0,second,zhenzhuan,fanzhuan,timeflg,opensw,closesw,keysw;//时钟变量 正反转 变量
uint adc0,adc1;
uint upbrig,dwbrig,kwbrig,uphum,uptemp,upsmo; // 下限 亮度 上限湿度// 上限温度
uint hour,minit,secon,DSdat,VAldat ,time;//时钟变量
uint ONhour,ONminit,ONsecon; // 开窗时间变量 uint OFhour,OFminit,OFsecon; // 关窗时间变量 uchar U8T_data_H,U8RH_data_H;
#define Imax 14000 //此处为晶振为11.0592时的取值, #define Imin 8000 //如用其它频率的晶振时, #define Inum1 1450 //要改变相应的取值。 #define Inum2 700 #define Inum3 3000
uchar f=0;
uchar Im[4]={0x00,0x00,0x00,0x00}; // 遥控码存储空间 uchar show[2]={0,0}; // 变量申明 ulong m,Tc; // 变量申明 uchar IrOK; // 变量申明
void delay(uint z);// 开窗时间变量
void write_rvalue(); // 显示函数
//**************以下是各种字幕提示语数组************************ uchar code logo1[]= "Welcome to use "; uchar code logo2[]="window system "; uchar code logo3[]="S=253T=85oCU=85%"; uchar code logo4[]="Br= 12:00:00 "; uchar code logo5[]="window open "; uchar code logo6[]="window close "; uchar code logo7[]="GWbrig= LUX "; uchar code logo8[]="UP-Hum= % "; uchar code logo9[]="Please input... "; uchar code logo10[]="Please wait... ";
uchar code logo11[]="UP-TEM= oC "; uchar code logo12[]="SEtime 12:00:00"; uchar code logo13[]="ONtime 12:00:00"; uchar code logo14[]="OFtime 12:00:00"; uchar code logo15[]="UP-SMO= "; uchar code logo16[]="KWbrig= LUX ";
void delaymoto() //步进电机每一步间延迟函数 { uint y=sudu; while(y--); }
uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步进电机驱动值数组 uchar code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //步进电机驱动值数组
xdata num1 [4] = {0x00,0x00,0x00,0x00,}; xdata num2 [4] = {0x00,0x00,0x00,0x00,}; xdata num3 [4] = {0x00,0x00,0x00,0x00,};
xdata num4 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组 xdata num5 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组
void delaylog(uint z)//延时函数 { uint x,y; for(x=z;x>0;x--) for(y=500;y>0;y--); }
void delay(uint z)//延时函数 {
uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); }
void SETP_MOTOR_FFW() //反转 {
uint i=0; for(i=0;i
void SETP_MOTOR_REV() //正转 {
uint i=0; for(i=0;i
void write_com(uchar com) //LCD 1602 写指令 { rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; }
void write_date(uchar date)//LCD 1602 写数据 { rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5);
lcden=0; }
void init1602()//LCD 1602 初始化 { uchar num; rd=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num
//*************************************************** write_com(0x80);
for(num=0;num
void write_sfm() // 拆分 个位 十位显示 {
uchar shi ,ge; shi=DSdat/10; ge=DSdat%10; write_date(0x30+shi); write_date(0x30+ge); }
void keyscn()//按键扫描函数 { uchar num; //局部变量 if(keysw==1) { if(opensw==1) { if(open==0) // 手动开窗 { write_com(0x80); for(num=0;num
}
if(menusw==1)//如果窗户运行完毕 {
if(menu==0)// 如果主功能键按下 { lofl=1; //字幕载入 delay(10); //延时消抖动 if(menu==0) { while(!menu);//松手检测 dsflj=0;// 关主页显示 kval++; // 按键变量++ keysw=0;//不允许手动 开窗 和关窗 } }
if(closesw==1)//如果窗户是打开的 {
if(close==0)//按下手动开 { write_com(0x80); for(num=0;num
//*************************************************************************8
if(kval==1) // 如果变量==1 进入时间设定 { if(lofl==1) { write_com(0x80); for(num=0;num
if(kval==2)//如果变量=2 进入小时设定 { DSdat=hour; // 刷新显示小时 write_com(0x40+0x40+8);// 显示坐标 write_com(0x0e); // 开关标 if(add==0)// 如果加键按下 { while(!add); // 松手检测 hour++; //小时++ DSdat=hour; //送显示 write_sfm(); // 拆分
if(hour==24) // {hour=0;} } if( dec==0) // 如果减键按下 { while(! dec);// 松手检测 hour--; //小时-- DSdat=hour; write_sfm(); //拆分限位 if(hour==0)//限位 {hour=23;} } }
//**************************以下时 分钟设 定 秒钟设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //******************************************************************** if(kval==3) { DSdat=minit; write_com(0x40+0x40+11); write_com(0x0e); if(add==0) { while(!add); minit++; DSdat=minit; write_sfm(); if(minit==60) {minit=0;} } if(dec==0) { while(! dec); minit--; DSdat=minit; write_sfm(); if(minit==0) {minit=59;} } }
if(kval==4)
{ DSdat=secon; write_com(0x40+0x40+14); write_com(0x0e); if(add==0) { while(!add); secon++; DSdat=secon; write_sfm(); if(secon==60) {secon=0;} } if( dec==0) { while(! dec); secon--; DSdat=secon; write_sfm(); if(secon==0) {secon=59;} } } //**************************以下 开窗时 小时 分钟设 定 秒钟设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** //*************************************设定开时****************************************
if(kval==5) { if(lofl==1) { write_com(0x80); for(num=0;num
}
if(kval==6) {
write_com(0x80+0x08); write_com(0x0e); if(add==0) { while(!add); ONhour++; DSdat=ONhour; write_sfm(); if(ONhour==24) {ONhour=0;} } if( dec==0) { while(! dec); ONhour--; DSdat=ONhour; write_sfm(); if(ONhour==0) {ONhour=23;} } }
if(kval==7) {
for(num=0;num
write_com(0x40+0x40+11); write_com(0x0e); if(add==0) { while(!add); ONminit++; DSdat=ONminit; write_sfm(); if(ONminit==60) {ONminit=0;} } if( dec==0) { while(! dec); ONminit--; DSdat=ONminit; write_sfm(); if(ONminit==0) {ONminit=59;} } }
if(kval==8) { write_com(0x40+0x40+14); write_com(0x0e); if(add==0) { while(!add); ONsecon++; DSdat=ONsecon; write_sfm(); if(ONsecon==60) {ONsecon=0;} } if( dec==0) { while(! dec); ONsecon--; DSdat=ONsecon;
write_sfm(); if(ONsecon==0) {ONsecon=59;} } } //**************************以下 关窗时 小时 分钟设 定 秒钟设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** //**************************************设定关时间**************************************
if(kval==9) { if(lofl==1) { write_com(0x80); for(num=0;num
}
} if(kval==10) {
write_com(0x80+0x08); write_com(0x0e); if(add==0) { while(!add); OFhour++; DSdat=OFhour; write_sfm(); if(OFhour==24) {OFhour=0;} } if( dec==0) { while(! dec); OFhour--; DSdat=OFhour; write_sfm(); if(OFhour==0) {OFhour=23;} } }
if(kval==11) { write_com(0x40+0x40+11); write_com(0x0e); if(add==0) { while(!add); OFminit++; DSdat=OFminit; write_sfm(); if(OFminit==60) {OFminit=0;} } if( dec==0) {
while(! dec); OFminit--; DSdat=OFminit; write_sfm(); if(OFminit==0) {OFminit=59;} } } if(kval==12) { write_com(0x40+0x40+14); write_com(0x0e); if(add==0) { while(!add); OFsecon++; DSdat=OFsecon; write_sfm(); if(OFsecon==60) {OFsecon=0;} } if( dec==0) { while(! dec); OFsecon--; DSdat=OFsecon; write_sfm(); if(OFsecon==0) {OFsecon=59;} } } //**************************以下 亮度会上设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //************** //********************************设定环境参数************************************
if(kval==13) {
write_com(0x0c); num4[4]=dwbrig; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
if(add==0) { delay(10); if(add==0) { while(!add); dwbrig++; num4[4]=dwbrig; write_rvalue(); if(dwbrig==250) {dwbrig=0;} } } if(dec==0) { delay(10); if(dec==0) { while(!dec); dwbrig--; num4[4]=dwbrig; write_rvalue(); if(dwbrig==0)
{dwbrig=250;} } } } //********************************************************************* //********************************设定环境参数************************************
if(kval==14) { write_com(0x0c); num4[4]=kwbrig; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
} } if(dec==0) { delay(10); if(dec==0) { while(!dec); kwbrig--; num4[4]=kwbrig; write_rvalue(); if(kwbrig==0) {kwbrig=250;} } } }
//**************************以下 湿度会上设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** if(kval==15) { num4[4]=uphum; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
{ while(!add); uphum++; num4[4]=uphum; write_rvalue(); if(uphum==100) {uphum=0;} } } if(dec==0) { delay(10); if(dec==0) { while(!dec); uphum--; num4[4]=uphum; write_rvalue(); if(uphum==0) {uphum=100;} } } }
//**************************以下 温度度会上设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** if(kval==16) { num4[4]=uptemp; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
} } if(add==0) { delay(10); if(add==0) { while(!add); uptemp++; num4[4]=uptemp; write_rvalue(); if(uptemp==100) {uptemp=0;} } } if(dec==0) { delay(10); if(dec==0) { while(!dec); uptemp--; num4[4]=uptemp; write_rvalue(); if(uptemp==0) {uptemp=100;} } } }
//**************************以下烟雾度会上设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** if(kval==17) { num4[4]=upsmo; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
} write_com(0x80+0x40); for(num=0;num
//*****退出设定********* if(kval==18) { write_com(0x0c); kval=0; dsflj=1; lofl=1;
keysw=1; if(lofl==1) { write_com(0x80); for(num=0;num
//步进电机函数 void setmoto() { char num;
if(zhenzhuan==1) //正转 { dsflj=0; SETP_MOTOR_REV(); if(second==10) { zhenzhuan=0; P1=0X00; dsflj=1; opensw=0; closesw=1; keysw=1; menusw=1; zhenfl=1; fanfl=0; brigfl=0; humfl=0;
write_com(0x80); for(num=0;num
if(fanzhuan==1) //反转 { dsflj=0; SETP_MOTOR_FFW(); if(second==10) { second=0; P1=0X00; zhenfl=0; fanfl=1; fanzhuan=0; dsflj=1; dwbrigfl=0; brigfl=0; opensw=1; closesw=0; keysw=1; menusw=1; humfl=1; write_com(0x80); for(num=0;num
{ //字幕显示 } } } }
void TEMPHRDSPLAY() //显示空气温湿度函数 写入1602 {
num1[4]=U8T_data_H; //温度高8位,即是整数部分 num1[1]=num1[4]/10; //整数十位 num1[0]=num1[4]%10; //整数个位
write_com(0x80+0x40+7); //显示温度 write_date(0x30+num1[1]); write_date(0x30+num1[0]); num2[4]=U8RH_data_H; //湿度高8位,即是整数部分 num2[3]=num2[4]/10; //整数十位 num2[2]=num2[4]%10; //整数个位
write_com(0x80+0x40+13); //显示湿度 write_date(0x30+num2[3]); write_date(0x30+num2[2]); }
void SMOGDSPLAY() //显示空气温湿度函数 写入1602 {
num3[4]=adc0; //温度高8位,即是整数部分 num3[0]=num3[4]%10; //显示ge 位 num3[1]=num3[4]%100/10; //显示shi 位 num3[2]=num3[4]%1000/100;//显示百位
write_com(0x80+0X40+2); write_date(0x30+num3[2]); write_date(0x30+num3[1]); write_date(0x30+num3[0]); }
void BRDSPLAY() {
write_date(logo3[num]); delay(2);
num5[4]=adc1; //温度高8位,即是整数部分 num5[0]=num5[4]%10; //显示ge 位 num5[1]=num5[4]%100/10; //显示shi 位 num5[2]=num5[4]%1000/100;//显示百位
write_com(0x80+3); write_date(0x30+num5[2]); write_date(0x30+num5[1]); write_date(0x30+num5[0]); }
void write_rvalue() {
num4[0]=num4[4]%10; //显示ge 位 num4[1]=num4[4]%100/10; //显示shi 位 num4[2]=num4[4]%1000/100;//显示百位
write_com(0x80+7); //显示温度 write_date(0x30+num4[2]); write_date(0x30+num4[1]); write_date(0x30+num4[0]); }
void init() {
TMOD=0X11; //定时器设置 TH0=0X3C; //定时器0置初值 0.05S TL0=0XBA; EA=1; //开总中断 ET0=1; //定时器0中断开启 TR0=1; //启动定时0
TL1=0X3C; //定时初值 TH1=0XBA; //定时初值 TR1=1; //启动定时器 ET1=1; //软件没用到 RCAP2H =(0xFFFF-50000)/256; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =(0xFFFF-50000)%256;
TR2=1; //启动定时器 ET2=1;
IT1=1;
TH0=0; //定时器0初值 TL0=0; //定时器0初值
TR0=1; //定时器0启动 EX1=1; //外部中断 软件没用到 }
void main()//主函数 {
init(); init1602();
sudu=200; //电要速度 zhenzhuan=0;//上电关正转 fanzhuan=1;//上电反转打开 dsflj=1; // 显示打开 uptemp=38; //温度上限 uphum=85; //湿度上限 upbrig=120; // 光控值 dwbrig=10;//光控下限 kwbrig=180; upsmo=85;
opensw=1; closesw=1; keysw=1; menusw=1; second=0; zhenfl=0; fanfl=0; brigfl=1; dwbrigfl=1; humfl=0; adc0 = ADC0832(1,0); //差分模式,CH0-CH1 adc1 = ADC0832(1,1); //差分模式,CH0-CH1 hour=12; minit=30; secon=10; // 系统时间 这些值可以按键修改 ONhour=12; // 自动开窗时间 为了方便演示 设定 一分钟后开 这些值可以按键修改
ONminit=31; ONsecon=10; OFhour=12; // 自动关窗时间 为了方便演示 设定 一分钟后关 这些值可以按键
修改
OFminit=31; OFsecon=20;
while(1)//大循环 { keyscn(); setmoto(); if (dsflj==1 ) { RH(); //DHT11 调用 TEMPHRDSPLAY(); adc0 = ADC0832(1,0); //差分模式,CH0-CH1 SMOGDSPLAY(); adc1 = ADC0832(1,1); //差分模式,CH0-CH1 BRDSPLAY(); if(fanfl==1) { if(adc1> kwbrig )//如果际亮度小与设定值 关窗 { zhenzhuan=1; } if(Im[2]==0x40) { Im[2]=0x00; zhenzhuan=1; } second=0; if(U8T_data_H>uptemp )//如果际温度大与设定值 开窗 { zhenzhuan=1; } if(adc0>upsmo)//如果际温度大与设定值 开窗 { zhenzhuan=1; BEEP=~BEEP; pf=0; s=0; } } if(zhenfl==1) { if(adc0
pf=1; BEEP=1; } if(Im[2]==0x44) { Im[2]=0x00; fanzhuan=1; } second=0; if(U8RH_data_H>uphum )//如果际湿度大与设定值 关窗 {
fanzhuan=1; brigfl=0;
dwbrigfl=0; } if(adc1
if(dec==0) {
delay(10); if(dec==0) { while(!dec); befl=0; BEEP=1; } }
DSdat=secon; write_com(0x80+14);
write_sfm(); DSdat=minit; write_com(0x80+11); write_sfm(); DSdat=hour; write_com(0x80+0x08); write_sfm(); } } }
//定时器2中断 timer2() interrupt 5 {
TF2=0; //!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
count0++; con++;
if(count0==15) { count0=0; second++; } if(befl==1) { if(con==20) { con=0; BEEP=~BEEP; } } }
void time0(void) interrupt 1 using 1 //定时中断子程序 { TH0=0X3C; //重赋初值 TL0=0XBA; }
//*********************************中断服务函数**************************************
void time0_int(void) interrupt 3 {
TH0=0X3C; //重赋初值 TL0=0XBA; //定时初值 TR1=1; time++; if(time==20) { time=0; secon++; } if(secon==60) { secon=0; minit++; }
if(minit==60) { minit=0; hour++; if(hour==24) { hour=0; } }
if(fanfl==1) { if((ONhour==hour)&&(ONminit==minit)&&(ONsecon==secon))//定时开窗 { zhenzhuan=1; } } if(zhenfl==1) { if((hour==OFhour)&&(minit==OFminit)&&(secon==OFsecon)) //定时关窗 { fanzhuan=1; } } }
//*********************************中断服务函数**************************************
// 遥控 解码 函数 接收头 接外部 中断口 P3.3
/************************************************************************/
//外部中断解码程序
void intersvr1(void) interrupt 2 using 1 {
Tc=TH0*256+TL0; //定时器清空只记TC 值 //提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零 if((Tc>Imin)&&(Tc
m=0; f=1; return; } //找到启始码 if(f==1) {
if(Tc>Inum1&&Tc>1|0x80; m++; //存0 } if(Tc>Inum2&&Tc>1; m++; // 存1 } if(m==32) //32位存储完毕 { m=0; f=0; if(Im[2]==~Im[3]) //反码检查 { IrOK=1; //OK 完成 } else IrOK=0; //取码完成后判断读码是否正确 } //准备读下一码 } }
/************************************************************************/ //************zheng 0X45; stop 0X46; fan 0X47 aut 0X43;
“居室眼睛”智能窗户控制系统
学院(部):专 业:班 级:指导老师:(毕业论文)
2014年1月
目 录
一、 概述 ................................................ 1
1.1 引言 .............................................. 2
二、市场分析 ............................................. 3
2.1 当前窗户分析 ...................................... 4
2.2 市场需求 .......................................... 4
三、系统设计方案 ......................................... 6
3.1 功能描述 .......................................... 7
3.2 重要组成部分 ...................................... 8
3.3 实现方法 .......................................... 8
3.4 使用方法 .......................................... 9
四、设计特点 ............................................ 10
4.1 创新点 ........................................... 10
4.2 科学性 ........................................... 10
4.3先进性 ............................................ 10
五、推广前景 ............................................ 11
5.1安全性分析 ....................................... 11
5.2发展前景 ......................................... 11
六、结论 ................................................ 12
七、致谢 ................................................ 13
八、附录 ................................................ 14
II
一、 摘要
在我国智能家居也成为近年来一个最热门的话题之一, 智能家居窗户也成为了其中必不可少的一部分, 引发了不少研究。
智能家居控制系统的应用让人们在家中能够享受到更安全、更舒适、更方便的生活,并且使生活更具有人性化,而现代家居中,窗户具有良好的装饰是采光和阻挡灰尘空气循环的主要途径,但同时也是盗窃非法进屋的一个重要途径,目前市场上智能家居虽然集成了家居生活有关的设施,但是对于各部分不能做到细致具体的设计,常常忽略了一些必要的功能(如烟雾检测功能、温湿度检测功能、红外检测报警功能、自动换气功能)或者不够人性化。而窗户是智能家居的一个重要的组成部分,因此更好地实现窗户的智能控制和安全防护提升家居安全性、便利性、舒适性、艺术性显得尤为重要。
但是当前大部分窗户控制系统在一定程度上不是很完善,而且没有安防检测功能;有的产品没有换风系统;有的产品没有红外感应安防的功能。但是智能窗户控制系统它能在下雨且家中无人时, 自动关闭以防止雨水进入损坏室内财物, 室内有害气体超标则自动开窗, 有盗贼入内则自动报警, 当室内温湿度过高或过低时, 自动监测调节环境, 使窗户真正的智能起来, 就会给人们的居家生活带来诸多方便,从而进一步提高人们的生活质量。
关键词:STC89C52 定时 1602液晶 遥控 智能
二、市场分析
2.1窗户分析
当前大部分窗户在有烟雾过大时,或者在下雨天有雨水溅入时都要通过手动去开窗或关窗。在空气比较闷热时(超过26°C ),不能自动进行开窗以及通风换风,而且现在很多城市(揭阳、清远、韶关、广州,深圳等等)PM 2.5(可入肺颗粒物)季均浓度都超过了国家空气新标准规定的二级限值35微克/立方米,严重危害人体健康,而现在大部分窗户都没有过滤装置,为了提高人们的生活质量,我们可以通过在窗户上的换风装置上装一个PM 2.5过滤器,而且这个过滤器可以手动卸掉,进行定时清洁。现在大多数的窗户系统都没有安防的功能,当有小偷想从窗户进入偷窃,不能及时发现,造成很大的损失,所以在窗户上装红外检测防盗系统,能够及时报警,尽量避免不必要的损失等等。
2.2 市场需求
目前市场上智能家居虽然集成了家居生活有关的设施,但是对于各部分不能做到细致具体的设计,常常忽略了一些必要的功能(如烟雾检测功能、温湿度检测功能、红外检测报警功能、自动换气功能)或者不够人性化。而窗户是智能家居的一个重要的组成部分,因此更好地实现窗户的智能控制和安全防护提升家居安全性、便利性、舒适性、艺术性显得尤为重要。
三、系统设计方案
3.1功能概述
智能窗户控制系统分为两部分设计即电子自动控制部分和机械传动部分,电子控制部分使用STC89C52单片机为核CPU ,集成多种传感器实现监测控制; 机械传动部分设计在窗户上安装步进电机,实现精确控制窗户和窗帘的开启。
设计实现如下功能:
1.显示温湿度、烟雾值 、亮度值 、系统时间
2. 设定湿度、亮度值、烟雾上下限值功能
3.手动、红外遥控自动开|关窗户功能
4.定时开|关窗户功能
5.下雨时通过温湿度传感器窗户自动关窗功能
6. 当室内亮度值达到设定值时自动开|关窗户
7. 当室内烟雾|可燃气体达到设定值时,窗户自动开启并且报警 和启动换风功能
8. 红外探测防盗报警功能
3.1.1设计原理以及组成结构:
智能窗户控制系统使用机械传动控制窗户的开关与窗帘的开合,机械部分由步进电机提供动力,通过设计动滑轮组在运动部件和窗架间进行传动。电子自动控制系统部分包含湿度温度探测传感器模块、光敏电阻传感器模块、烟雾探测传感器模块、红外检测防盗模块、换风控制模块。各传感器将探测到的变化反映到单片机口,由单片机根据信号的变化(即电平的高低) 判断外界环境的变化,然后根据内部设定的程序发出命令,控制机械传动部分实现相应的动作。
系统总体框架如下图所示:
3.2重要组成部分
3.2.1探测电路设计:
(1).温湿度探测电路
使用DHT11数字温湿度传感器。该传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。单片机与DHT11之间的通讯和同步,采用单总线数据格式,一次传40位数据,高位先出。
(2).光敏电阻电路
使用的探测元件是LY-C1光敏传感器。光敏电阻对周围环境光强最敏感,一般用来检测周围环境光强。输出状态灵敏度可调。在周围光强达不到阈值时,D0口输出高电平; 光强超过阈值时,D0口输出低电平。依据此原理可以用来监测外界环境亮度,判断天色,当天黑时,信号端输出高电平。LY-C3传感器的D0端接单片机的P3.6口。单片机检测此IO 口的变化自动控制窗户的开启与关闭。
(3).红外检测防盗电路
该部分自行设计了激光防盗电路,探测器由发射头、接收头组成。正常情况时,发射头发射红外线,接头接收红外线,探测器导通不动作。当有人挡住红外线时,接收头接收不到由发射头发射的红外线,探测器断开输出低电平信号。本系统中安装有两组红外探测器,两个接收头的输出端接单片机的P3.3口和P3.4口,可确保对整个窗户面实现防盗。
3.2.2控制及输出电路设计
(1).换风系统电路
主要原理是:用风机将空气抽入机器,通过内置的滤网过滤空气,主要能够起到过滤粉尘、异味、有毒气体和杀灭部分细菌的作用。
(2). 液晶显示电路
液晶显示电路采用LCD1602液晶显示屏。其显示的内容为16X2, 即可以显示两行,每行16个字符。
主要负责显示光度、系统时间、室内外温度和室外的湿度。
(3). 步进电机电路
本电路由两组ULN2003模块和24YBJ 组成。
(4).红外遥控系统
红外遥控系统一般分发射和接收两个部分。发射部分的主要元件为红外发光二极管,接收部分的是红外接收管。
红外遥控的特点是不影响周边环境、不干扰其它电器设备、使用方便。
(5).蜂鸣器电路
蜂鸣器正极接高电平,负极接单片机P3.1端。
3.3.1软件程序
程序流程图
智能窗户系统工作:
接通电源后,单片机开始工作。步进电机模块启动,窗户首先关闭。湿温度传感器、烟雾传感器、光敏电阻、红外检测控制模块将检测到的信号传入到单片机中。湿温度传感器检测到室外湿度超过70%
时,单片机控制步进电机关窗。当窗户与窗框完全接触时,两个关窗
限位片导通,步进电机停止转动。当烟雾传感器探测到室内有可燃气体或浓雾超标时,单片机立刻发出开窗指令,窗户打开至两个开窗限位器接触时,停止电机转动,在此期间蜂鸣器进行报警,换风系统启动。在开窗的状态下,红外检测探头如果检测到有物体靠近,此时窗户自动关闭,并且蜂鸣器进行报警。进入夜晚时,在光敏电阻发出的信号后,关闭窗户。
3.4实现方法
智能窗户控制系统使用机械传动控制窗户的开关与窗户的开合,机械部分由步进电机提供动力,通过设计动滑轮组在运动部件和窗架间进行转动。实现通过传感电路不断循环检测室内光亮度、温湿度、有害气体(如媒气) 浓度等信号,然后与由预先设置的参数临界值相比较, 从而作出开/关窗的判断, 再结合窗状态检测电路所检测到的当前窗状态, 再输出脉冲信号调整步进电机,通过步进电机顺|逆转动带动滑轮组转动,从而使窗户开|关。
数据检测传感电路由四个部分组成:
(1)温湿度传感是放在窗户外面的,如在下雨天(湿度超过70%)时,能及时准确检测到温湿度变化,进行关窗动作;
(2)烟雾传感器是放在窗里面的,如有可燃气体泄漏|烟雾超过标准值时,通过步进电机顺时针旋转带动滑轮组在窗架转动使窗户打开,同时换风系统自动启动进行换气,蜂鸣器进行报警,发出声音;
(3)红外防盗探测头是放在窗户里面,当有小偷想通过窗户进来偷窃,可以及时发现,进行报警,并自动关窗;
(4)光敏电阻可以放在窗外|里面都可以,通过检测亮度,判断白天还是夜晚,自动关窗|开窗。换风系统是装在窗户最上面的,窗户上面要留一个适合风机大的可穿过位置。风机里面内置过滤网,并且可以卸装的。
3.5使用方法
1、可以通过红外遥控,直接对窗户进行开|关窗;
2、通过对按键的输入,预先设置的参数(亮度上|下限值、烟雾
上限值、温湿度),校对时间标准,可以进行定时开|关窗;
3、可以通过手动按键进行开|关窗,及可以进行复位功能消除警报。
四、设计特点
4.1创新点
将多个传感器和单片机相结合,来执行窗户的开或关,通过蜂鸣器报警,来提示人们所发生的变化,体现作品更加人性化设计。还有排|换风系统,在换风装置上增PM2.5过滤器,这个过滤器还可以卸掉进行定时清洁,进一步提高人们生活质量。
4.2科学性
现在的窗户大部分都是通过人为手动去关闭和打开的,但是当人不在家时,一旦发生意外时(煤气泄漏、有浓烟、下雨、有小偷..... )时不能快速且有效的去关闭或打开窗户,为家庭带来很大的隐患,所以我们设计的窗户控制系统,完全可以满足大部分人的需求,当各个意外时,系统都会给予自动处理的。
4.3 先进性
(1)单片机与警报电路相结合,通过单片机空间窗户打开与关闭 。
(2)实现单片机与数据检测模块结合,有自动报警功能。
(3)实现单片机与单片机之间的相互通信。
五、推广前景
5.1安全性分析
每年发生数以万起因煤气泄漏引发的火灾和入室犯罪案件,都已表明对居家环境的安全防范迫在眉睫。有鉴于此,开发一套功能齐全
的智能窗户无论是从经济价值角度分析,还是从治安的角度考虑,都有广泛的发展前景,如果智能家居安防系统能够得到广泛应用,必能会对犯罪分子形成强有力的威慑作用,减少入室盗窃、机动车盗窃等家居相关案件的发生,为构建社会主义和谐社会贡献一份力量。
5.2 发展前景
随着社会的发展,科技的进步以及人们生活水平的逐步提高,各种方便生活的自动控制系统进入了人们的生活,智能窗户已经深入一些高级写字楼,将来普通楼宇及家具的智能化必然是一种趋势。
但当前的窗户系统在一定程度不是很完善,有的该系统只有简单的开关窗功能,系统不是很完善,而且没有安防报警功能,在发生意外时只是开窗或关窗,而使用者完全没有发现所发生的意外,不能人为的去解除所产生的意外,而该智能窗户采用多个传感器和单片机的结合,通过传感电路不断循环检测室内光亮度、温湿度、有害气体(如媒气) 浓度等信号,通过传感器检测到的信号给单片机命令,然后再由单片机去执行窗户的开或关,所以该智能窗户在家庭中很大一部分减轻了人们的压力,为人省去很多不必要的担心,同时加快了家庭中自动化的发展,该作品经济、节约、实用性强。 很是适用于家中窗户的智能化安装,实用性强,有广大的市场发展前景。
总结
智能窗户控制系统的设计通过硬件和软件的设计同时考虑多种情况,解决了大部分问题,经过多次调试和修改,成功的将多种传感器集成进系统中,完好的实现了各项功能设计。该智能窗让人在不同的环境状况中或出门在外时不用担心窗户的开合情况。让人在无法手动直接控制时能够通过红外遥控控制窗户;夜间发生入室行为时窗户会自动报警,为人们生活提供方便和安全;当不启用智能窗系统时,也可以通过手动对窗户进行开关,更具人性化。
针对一些老式窗户还存在一定难度进行改造实现使其具有智能化、人性化;但该窗户智能设计仍然具有较大的提升空间。例如:该智能窗户系统还可以在窗户玻璃上装震动传感器,当有小偷破窗而进时,能及时知道有人是在破窗而进并进行报警;也可以在窗户控制系统上安装GSM 通信模块,当室内有害气体浓度过高时|有小偷入室偷窃时,可以及时通过短信通知主人;还可以将智能窗户控制系统与互联网连接起来,主人可以通过手机或终端对窗户的检测了解家里的情况,这样可以为人们的生活提供更多的安全保障。
致谢
在设计和说明书写作的整个过程中,指导教师老师在各个方面都给予了全面的指导和帮助。老师精深渊博的知识,求实创新、勤奋严谨的治学风范,忘我的工作作风时刻熏陶着我。老师因材施教、诲人
不倦的授业精神给我们留下了深刻的印象,这将使我们受益终身 。 在此,特别感谢老师对我们在学习、工作上给予我们的热情关怀、
温湿度传感器
另外,也感谢其他机电学院老师,以及同学在我们完
换气系统
成设计时提出了很多宝贵的意见和无私的帮助。
光敏电阻
步进电机
通过本次设计,LCD1602显示屏
而提高这三方面的能力。自己根据毕业设计任务中的
烟雾传感器
STC89C52单片机
内容和要求, 进一步掌握了电子产品设计的步骤和方法,学会查找和运用有关设计手册和技术
红外探测头传感器
在此,十分感谢指导老师对我们的精心指导和培养,使我们学到许多知识,得到了很好的锻练,给于我们平台磨练自己,这些都为我们以后走上工作岗位打下了良好基础。
附录:
制作模块如下图所示:
实体安装设计图:
程序:
#include //库函数
#include //库函数//如果 实物 打开 #include //AD转换库函数
#define uchar unsigned char//宏定意 #define uint unsigned int//宏定意
#define ulong unsigned long //宏定意 bit s=1;
sbit rs=P2^0;//LCD 1602 引脚定意 sbit rd=P2^1;//LCD 1602 引脚定意 sbit lcden=P2^2;//LCD 1602 引脚定意 sbit menu=P2^5; //主功能键 sbit add=P2^4;//加键 sbit dec=P2^3;// 减键
sbit open=P2^6;// 手动 开 sbit close=P2^7;// 手动 关
sbit IR=P3^5; //红外感 应 sbit BEEP=P3^1;// 报警 sbit pf=P3^0; //排风
#define MOTORSTEP P1 //宏定义,定义P1口为步进电机驱动端口
uchar dsflj,kval,lofl,menusw,con,befl,zhenfl,fanfl,brigfl;// 各种变量标记 正返转标记 uint sudu,dwbrigfl,humfl; //电机速度 //光度下限/湿度标记
uchar count0,second,zhenzhuan,fanzhuan,timeflg,opensw,closesw,keysw;//时钟变量 正反转 变量
uint adc0,adc1;
uint upbrig,dwbrig,kwbrig,uphum,uptemp,upsmo; // 下限 亮度 上限湿度// 上限温度
uint hour,minit,secon,DSdat,VAldat ,time;//时钟变量
uint ONhour,ONminit,ONsecon; // 开窗时间变量 uint OFhour,OFminit,OFsecon; // 关窗时间变量 uchar U8T_data_H,U8RH_data_H;
#define Imax 14000 //此处为晶振为11.0592时的取值, #define Imin 8000 //如用其它频率的晶振时, #define Inum1 1450 //要改变相应的取值。 #define Inum2 700 #define Inum3 3000
uchar f=0;
uchar Im[4]={0x00,0x00,0x00,0x00}; // 遥控码存储空间 uchar show[2]={0,0}; // 变量申明 ulong m,Tc; // 变量申明 uchar IrOK; // 变量申明
void delay(uint z);// 开窗时间变量
void write_rvalue(); // 显示函数
//**************以下是各种字幕提示语数组************************ uchar code logo1[]= "Welcome to use "; uchar code logo2[]="window system "; uchar code logo3[]="S=253T=85oCU=85%"; uchar code logo4[]="Br= 12:00:00 "; uchar code logo5[]="window open "; uchar code logo6[]="window close "; uchar code logo7[]="GWbrig= LUX "; uchar code logo8[]="UP-Hum= % "; uchar code logo9[]="Please input... "; uchar code logo10[]="Please wait... ";
uchar code logo11[]="UP-TEM= oC "; uchar code logo12[]="SEtime 12:00:00"; uchar code logo13[]="ONtime 12:00:00"; uchar code logo14[]="OFtime 12:00:00"; uchar code logo15[]="UP-SMO= "; uchar code logo16[]="KWbrig= LUX ";
void delaymoto() //步进电机每一步间延迟函数 { uint y=sudu; while(y--); }
uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步进电机驱动值数组 uchar code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //步进电机驱动值数组
xdata num1 [4] = {0x00,0x00,0x00,0x00,}; xdata num2 [4] = {0x00,0x00,0x00,0x00,}; xdata num3 [4] = {0x00,0x00,0x00,0x00,};
xdata num4 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组 xdata num5 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组
void delaylog(uint z)//延时函数 { uint x,y; for(x=z;x>0;x--) for(y=500;y>0;y--); }
void delay(uint z)//延时函数 {
uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); }
void SETP_MOTOR_FFW() //反转 {
uint i=0; for(i=0;i
void SETP_MOTOR_REV() //正转 {
uint i=0; for(i=0;i
void write_com(uchar com) //LCD 1602 写指令 { rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; }
void write_date(uchar date)//LCD 1602 写数据 { rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5);
lcden=0; }
void init1602()//LCD 1602 初始化 { uchar num; rd=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num
//*************************************************** write_com(0x80);
for(num=0;num
void write_sfm() // 拆分 个位 十位显示 {
uchar shi ,ge; shi=DSdat/10; ge=DSdat%10; write_date(0x30+shi); write_date(0x30+ge); }
void keyscn()//按键扫描函数 { uchar num; //局部变量 if(keysw==1) { if(opensw==1) { if(open==0) // 手动开窗 { write_com(0x80); for(num=0;num
}
if(menusw==1)//如果窗户运行完毕 {
if(menu==0)// 如果主功能键按下 { lofl=1; //字幕载入 delay(10); //延时消抖动 if(menu==0) { while(!menu);//松手检测 dsflj=0;// 关主页显示 kval++; // 按键变量++ keysw=0;//不允许手动 开窗 和关窗 } }
if(closesw==1)//如果窗户是打开的 {
if(close==0)//按下手动开 { write_com(0x80); for(num=0;num
//*************************************************************************8
if(kval==1) // 如果变量==1 进入时间设定 { if(lofl==1) { write_com(0x80); for(num=0;num
if(kval==2)//如果变量=2 进入小时设定 { DSdat=hour; // 刷新显示小时 write_com(0x40+0x40+8);// 显示坐标 write_com(0x0e); // 开关标 if(add==0)// 如果加键按下 { while(!add); // 松手检测 hour++; //小时++ DSdat=hour; //送显示 write_sfm(); // 拆分
if(hour==24) // {hour=0;} } if( dec==0) // 如果减键按下 { while(! dec);// 松手检测 hour--; //小时-- DSdat=hour; write_sfm(); //拆分限位 if(hour==0)//限位 {hour=23;} } }
//**************************以下时 分钟设 定 秒钟设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //******************************************************************** if(kval==3) { DSdat=minit; write_com(0x40+0x40+11); write_com(0x0e); if(add==0) { while(!add); minit++; DSdat=minit; write_sfm(); if(minit==60) {minit=0;} } if(dec==0) { while(! dec); minit--; DSdat=minit; write_sfm(); if(minit==0) {minit=59;} } }
if(kval==4)
{ DSdat=secon; write_com(0x40+0x40+14); write_com(0x0e); if(add==0) { while(!add); secon++; DSdat=secon; write_sfm(); if(secon==60) {secon=0;} } if( dec==0) { while(! dec); secon--; DSdat=secon; write_sfm(); if(secon==0) {secon=59;} } } //**************************以下 开窗时 小时 分钟设 定 秒钟设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** //*************************************设定开时****************************************
if(kval==5) { if(lofl==1) { write_com(0x80); for(num=0;num
}
if(kval==6) {
write_com(0x80+0x08); write_com(0x0e); if(add==0) { while(!add); ONhour++; DSdat=ONhour; write_sfm(); if(ONhour==24) {ONhour=0;} } if( dec==0) { while(! dec); ONhour--; DSdat=ONhour; write_sfm(); if(ONhour==0) {ONhour=23;} } }
if(kval==7) {
for(num=0;num
write_com(0x40+0x40+11); write_com(0x0e); if(add==0) { while(!add); ONminit++; DSdat=ONminit; write_sfm(); if(ONminit==60) {ONminit=0;} } if( dec==0) { while(! dec); ONminit--; DSdat=ONminit; write_sfm(); if(ONminit==0) {ONminit=59;} } }
if(kval==8) { write_com(0x40+0x40+14); write_com(0x0e); if(add==0) { while(!add); ONsecon++; DSdat=ONsecon; write_sfm(); if(ONsecon==60) {ONsecon=0;} } if( dec==0) { while(! dec); ONsecon--; DSdat=ONsecon;
write_sfm(); if(ONsecon==0) {ONsecon=59;} } } //**************************以下 关窗时 小时 分钟设 定 秒钟设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** //**************************************设定关时间**************************************
if(kval==9) { if(lofl==1) { write_com(0x80); for(num=0;num
}
} if(kval==10) {
write_com(0x80+0x08); write_com(0x0e); if(add==0) { while(!add); OFhour++; DSdat=OFhour; write_sfm(); if(OFhour==24) {OFhour=0;} } if( dec==0) { while(! dec); OFhour--; DSdat=OFhour; write_sfm(); if(OFhour==0) {OFhour=23;} } }
if(kval==11) { write_com(0x40+0x40+11); write_com(0x0e); if(add==0) { while(!add); OFminit++; DSdat=OFminit; write_sfm(); if(OFminit==60) {OFminit=0;} } if( dec==0) {
while(! dec); OFminit--; DSdat=OFminit; write_sfm(); if(OFminit==0) {OFminit=59;} } } if(kval==12) { write_com(0x40+0x40+14); write_com(0x0e); if(add==0) { while(!add); OFsecon++; DSdat=OFsecon; write_sfm(); if(OFsecon==60) {OFsecon=0;} } if( dec==0) { while(! dec); OFsecon--; DSdat=OFsecon; write_sfm(); if(OFsecon==0) {OFsecon=59;} } } //**************************以下 亮度会上设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //************** //********************************设定环境参数************************************
if(kval==13) {
write_com(0x0c); num4[4]=dwbrig; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
if(add==0) { delay(10); if(add==0) { while(!add); dwbrig++; num4[4]=dwbrig; write_rvalue(); if(dwbrig==250) {dwbrig=0;} } } if(dec==0) { delay(10); if(dec==0) { while(!dec); dwbrig--; num4[4]=dwbrig; write_rvalue(); if(dwbrig==0)
{dwbrig=250;} } } } //********************************************************************* //********************************设定环境参数************************************
if(kval==14) { write_com(0x0c); num4[4]=kwbrig; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
} } if(dec==0) { delay(10); if(dec==0) { while(!dec); kwbrig--; num4[4]=kwbrig; write_rvalue(); if(kwbrig==0) {kwbrig=250;} } } }
//**************************以下 湿度会上设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** if(kval==15) { num4[4]=uphum; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
{ while(!add); uphum++; num4[4]=uphum; write_rvalue(); if(uphum==100) {uphum=0;} } } if(dec==0) { delay(10); if(dec==0) { while(!dec); uphum--; num4[4]=uphum; write_rvalue(); if(uphum==0) {uphum=100;} } } }
//**************************以下 温度度会上设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** if(kval==16) { num4[4]=uptemp; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
} } if(add==0) { delay(10); if(add==0) { while(!add); uptemp++; num4[4]=uptemp; write_rvalue(); if(uptemp==100) {uptemp=0;} } } if(dec==0) { delay(10); if(dec==0) { while(!dec); uptemp--; num4[4]=uptemp; write_rvalue(); if(uptemp==0) {uptemp=100;} } } }
//**************************以下烟雾度会上设定 和上面小时一样
//只是就量不一样 不作注释******************************************* //************** if(kval==17) { num4[4]=upsmo; write_rvalue(); if(lofl==1) { write_com(0x80); for(num=0;num
} write_com(0x80+0x40); for(num=0;num
//*****退出设定********* if(kval==18) { write_com(0x0c); kval=0; dsflj=1; lofl=1;
keysw=1; if(lofl==1) { write_com(0x80); for(num=0;num
//步进电机函数 void setmoto() { char num;
if(zhenzhuan==1) //正转 { dsflj=0; SETP_MOTOR_REV(); if(second==10) { zhenzhuan=0; P1=0X00; dsflj=1; opensw=0; closesw=1; keysw=1; menusw=1; zhenfl=1; fanfl=0; brigfl=0; humfl=0;
write_com(0x80); for(num=0;num
if(fanzhuan==1) //反转 { dsflj=0; SETP_MOTOR_FFW(); if(second==10) { second=0; P1=0X00; zhenfl=0; fanfl=1; fanzhuan=0; dsflj=1; dwbrigfl=0; brigfl=0; opensw=1; closesw=0; keysw=1; menusw=1; humfl=1; write_com(0x80); for(num=0;num
{ //字幕显示 } } } }
void TEMPHRDSPLAY() //显示空气温湿度函数 写入1602 {
num1[4]=U8T_data_H; //温度高8位,即是整数部分 num1[1]=num1[4]/10; //整数十位 num1[0]=num1[4]%10; //整数个位
write_com(0x80+0x40+7); //显示温度 write_date(0x30+num1[1]); write_date(0x30+num1[0]); num2[4]=U8RH_data_H; //湿度高8位,即是整数部分 num2[3]=num2[4]/10; //整数十位 num2[2]=num2[4]%10; //整数个位
write_com(0x80+0x40+13); //显示湿度 write_date(0x30+num2[3]); write_date(0x30+num2[2]); }
void SMOGDSPLAY() //显示空气温湿度函数 写入1602 {
num3[4]=adc0; //温度高8位,即是整数部分 num3[0]=num3[4]%10; //显示ge 位 num3[1]=num3[4]%100/10; //显示shi 位 num3[2]=num3[4]%1000/100;//显示百位
write_com(0x80+0X40+2); write_date(0x30+num3[2]); write_date(0x30+num3[1]); write_date(0x30+num3[0]); }
void BRDSPLAY() {
write_date(logo3[num]); delay(2);
num5[4]=adc1; //温度高8位,即是整数部分 num5[0]=num5[4]%10; //显示ge 位 num5[1]=num5[4]%100/10; //显示shi 位 num5[2]=num5[4]%1000/100;//显示百位
write_com(0x80+3); write_date(0x30+num5[2]); write_date(0x30+num5[1]); write_date(0x30+num5[0]); }
void write_rvalue() {
num4[0]=num4[4]%10; //显示ge 位 num4[1]=num4[4]%100/10; //显示shi 位 num4[2]=num4[4]%1000/100;//显示百位
write_com(0x80+7); //显示温度 write_date(0x30+num4[2]); write_date(0x30+num4[1]); write_date(0x30+num4[0]); }
void init() {
TMOD=0X11; //定时器设置 TH0=0X3C; //定时器0置初值 0.05S TL0=0XBA; EA=1; //开总中断 ET0=1; //定时器0中断开启 TR0=1; //启动定时0
TL1=0X3C; //定时初值 TH1=0XBA; //定时初值 TR1=1; //启动定时器 ET1=1; //软件没用到 RCAP2H =(0xFFFF-50000)/256; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =(0xFFFF-50000)%256;
TR2=1; //启动定时器 ET2=1;
IT1=1;
TH0=0; //定时器0初值 TL0=0; //定时器0初值
TR0=1; //定时器0启动 EX1=1; //外部中断 软件没用到 }
void main()//主函数 {
init(); init1602();
sudu=200; //电要速度 zhenzhuan=0;//上电关正转 fanzhuan=1;//上电反转打开 dsflj=1; // 显示打开 uptemp=38; //温度上限 uphum=85; //湿度上限 upbrig=120; // 光控值 dwbrig=10;//光控下限 kwbrig=180; upsmo=85;
opensw=1; closesw=1; keysw=1; menusw=1; second=0; zhenfl=0; fanfl=0; brigfl=1; dwbrigfl=1; humfl=0; adc0 = ADC0832(1,0); //差分模式,CH0-CH1 adc1 = ADC0832(1,1); //差分模式,CH0-CH1 hour=12; minit=30; secon=10; // 系统时间 这些值可以按键修改 ONhour=12; // 自动开窗时间 为了方便演示 设定 一分钟后开 这些值可以按键修改
ONminit=31; ONsecon=10; OFhour=12; // 自动关窗时间 为了方便演示 设定 一分钟后关 这些值可以按键
修改
OFminit=31; OFsecon=20;
while(1)//大循环 { keyscn(); setmoto(); if (dsflj==1 ) { RH(); //DHT11 调用 TEMPHRDSPLAY(); adc0 = ADC0832(1,0); //差分模式,CH0-CH1 SMOGDSPLAY(); adc1 = ADC0832(1,1); //差分模式,CH0-CH1 BRDSPLAY(); if(fanfl==1) { if(adc1> kwbrig )//如果际亮度小与设定值 关窗 { zhenzhuan=1; } if(Im[2]==0x40) { Im[2]=0x00; zhenzhuan=1; } second=0; if(U8T_data_H>uptemp )//如果际温度大与设定值 开窗 { zhenzhuan=1; } if(adc0>upsmo)//如果际温度大与设定值 开窗 { zhenzhuan=1; BEEP=~BEEP; pf=0; s=0; } } if(zhenfl==1) { if(adc0
pf=1; BEEP=1; } if(Im[2]==0x44) { Im[2]=0x00; fanzhuan=1; } second=0; if(U8RH_data_H>uphum )//如果际湿度大与设定值 关窗 {
fanzhuan=1; brigfl=0;
dwbrigfl=0; } if(adc1
if(dec==0) {
delay(10); if(dec==0) { while(!dec); befl=0; BEEP=1; } }
DSdat=secon; write_com(0x80+14);
write_sfm(); DSdat=minit; write_com(0x80+11); write_sfm(); DSdat=hour; write_com(0x80+0x08); write_sfm(); } } }
//定时器2中断 timer2() interrupt 5 {
TF2=0; //!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
count0++; con++;
if(count0==15) { count0=0; second++; } if(befl==1) { if(con==20) { con=0; BEEP=~BEEP; } } }
void time0(void) interrupt 1 using 1 //定时中断子程序 { TH0=0X3C; //重赋初值 TL0=0XBA; }
//*********************************中断服务函数**************************************
void time0_int(void) interrupt 3 {
TH0=0X3C; //重赋初值 TL0=0XBA; //定时初值 TR1=1; time++; if(time==20) { time=0; secon++; } if(secon==60) { secon=0; minit++; }
if(minit==60) { minit=0; hour++; if(hour==24) { hour=0; } }
if(fanfl==1) { if((ONhour==hour)&&(ONminit==minit)&&(ONsecon==secon))//定时开窗 { zhenzhuan=1; } } if(zhenfl==1) { if((hour==OFhour)&&(minit==OFminit)&&(secon==OFsecon)) //定时关窗 { fanzhuan=1; } } }
//*********************************中断服务函数**************************************
// 遥控 解码 函数 接收头 接外部 中断口 P3.3
/************************************************************************/
//外部中断解码程序
void intersvr1(void) interrupt 2 using 1 {
Tc=TH0*256+TL0; //定时器清空只记TC 值 //提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零 if((Tc>Imin)&&(Tc
m=0; f=1; return; } //找到启始码 if(f==1) {
if(Tc>Inum1&&Tc>1|0x80; m++; //存0 } if(Tc>Inum2&&Tc>1; m++; // 存1 } if(m==32) //32位存储完毕 { m=0; f=0; if(Im[2]==~Im[3]) //反码检查 { IrOK=1; //OK 完成 } else IrOK=0; //取码完成后判断读码是否正确 } //准备读下一码 } }
/************************************************************************/ //************zheng 0X45; stop 0X46; fan 0X47 aut 0X43;