
| 2015届课程论文 |
题 目 基于单片机的智能光控窗帘设计
学生姓名
学 号
所属学院 信息工程学院
专 业 通信工程
班 级 通信15-1
授课教师
教师职称 副教授
基于单片机的智能光控开关设计
摘要
随着社会的不断进步,人们在智能化控制上的逐步认识和接受,并从多方面开始关注,尤其在生活方面做出了很多的努力。光照对人民生活是很重要的,人们可以根据光照的强弱选择对窗帘的开关。它不仅适用于人们生活的住宅区,而且适用于工厂、办公室、教学楼等公共场所。因此智能开关,在现代化的生活中,将起到重要的作用。
为了能根据室外环境亮度实现窗帘自动拉合的设计需求,一种简单的通过光照强度来控制窗帘的开关的开闭合,从而达到开关的自动断开、闭合功能,其具有很强的适用性。提出了一种基于单片机控制的光控窗帘设计方案,并完成系统的软、硬件设计。该系统的硬件部分主要利用光敏传感器产生的信号作为单片机输入信号,软件部分采用C语言进行编程,能够完成智能光控窗帘的自动拉合。同时,考虑到用户习惯和天气原因,本方案还设置了选择开关,用户在使用窗帘时可任意选择自动或手动控制方式。实际应用表明,该系统具有设计成本低、可靠性高的特点,达到了设计要求。
关键词:单片机 光敏传感器 直流电动机 C语言 智能光控窗帘
1 引言
随着生活水平的不断提高,人们对家庭生活舒适度的要求也越来越高,具有装饰、遮光并能进行自动开合的智能光控窗帘成为了现代家居生活的新宠。为了能根据室外环境亮度实现窗帘自动拉合的设计需求,本文提出了一种基于单片机控制的光控窗帘设计方案。
研究目的和意义
研究目的:通过这次的课题研究希望使自己在理清它的发展脉络上进一步了解它的发明原理,将平时所学习的理论知识和技能运用到实际生活当中,这对提高自己的动手能力、创新意识,以及锻炼我们的思维活动是一个很大的帮助。同时,通过这次的研究希望提高自己对社会普通科学知识的了解;增强自身的只是见解和设计论文的方法。
研究意义:用光控制开关代替一般的开关,只有在光照达到一定强度时,才能使直流发动机开始工作,使得电路导通,而且发动机延迟一段时间就会自动断开,因此节电效率很高,全自动智能控制,接线简单,安装方便,是公共场所照明开关的理想选择。
2课题的研究内容
运用单片机可以设计出智能型的光控开关,电路设计好后,运用软件编程来实现其功能,灵活方便,修改简单,在使用过程中更加的安全节电,智能环保。
2.1技术方案的选择
目前的声控开关大多都是应用模拟电子技术进行设计,分立元件多,不可靠,而且许多声控开关的平均使用寿命不长,主要是因为电路作频繁的开关,启动电流非常大,导致功率元件可控硅由于过载而损坏。如果在设计中采用开关电压过零保护技术,可消除白炽灯开启瞬间的大电流冲击,有效地防止可控硅元件启动时的电流过载,大大地延长了开关的使用寿命,并且可以起到保护灯泡的作用。
如今单片机技术已经相当成熟,未来的发展方向趋向于运用单片机可以设计出智能型的声控开关,电路设计好后,运用软件编程来实现其功能,灵活方便,修改简单。在使用过程中更加的安全节电,智能环保。
首先单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
单片机的特点:
(1) 种类多,型号全;
(2) 提高性能,扩大容量,性能价格比高;
(3) 增加控制功能,向真正意义上的“单片”机发展;
(4) 低消耗;
(5) C语言开发环境,友好的人机互交环境。
单片机的优点:
(1) 使用寿命长;
(2) 运行速度越来越快;
(3) 低噪声和高可靠性技术;
(4) OTP与掩膜。
综上所述,单片机的特点和优点符合制作智能声光控开关的条件,并且具有准确性和节能性。
3 系统结构与工作原理
3.1 系统结构
本设计由单片机、传感器和直流电动机组成,以ATC51单片机[芯片为核心,运用光敏传感器技术,将室外环境亮度作为单片机的控制信号,实现窗帘的自动拉合。同时,考虑到用户习惯和天气原因,本方案还设置了选择开关,用户在使用窗帘时可任意选择自动或手动控制方式。当选择自动控制模式时,单片机将室外环境光线亮度作为输入信号,单片机控制程序根据光敏传感器所产生的电流信号的强弱自动调节直流电机的正反转,从而实现窗帘的自动拉合;当选择手动控制模式时,单片机将手动控制开关作为输入信号,单片机控制程序根据开关信号控制电机的正反转,从而实现窗帘的手动拉合。
3.2 工作原理
模拟光信号的采集,可以通过软件来调节对光照的强度。单片机软件实施对光度的判断,决定窗帘的打开和闭合;由于个人或是其他原因用户可以选择手动开关窗帘。
4 系统硬件设计
本系统硬件系统主要由传感器、单片机、直流电动机三大部分组成,如图1所示。
图1 系统工作原理图
4.1整体设计模块
4.1.1单片机的复位、时钟电路
(1)单片机再开机时需要复位,以便使CPU及其他功能部件处于一个确定的初始状态,并从这个状态开始工作,单片机应用程序必须以此作为设计的前提。
(2)单片机执行指令的过程可分为取指令、分析指令和执行指令三个步骤,每个步骤又由许多微操作,这些微操作必须在一个统一的时钟控制下才能按照正确的顺序执行。如图2:
图2
4.1.2光信号的模拟与判断
当光敏电阻收到光照的时候,电阻减小,运放同向输入端为低电平,端口1输出为低电平;当光照较弱时,电阻增加,运放同向输入端为高电平,端口1输出为高电平。光控电路的输出信号经过电压跟随器后,将比较微弱的电流信号放大到单片机能够识别的电流,然后由运放输出端传输放大后的信号。然后经过一个非门,形成相反的电压,分别传输给P2.2与P2.3口。
图3
4.1.3 开关控制电路
如果k7断开,系统将执行光控控制,k3、4是控制光信号的输入;k5、k6分别是对正转、反转的反向控制。当k7闭合卖系统执行手动控制,k1、k2是对窗帘拉开、闭合的控制。
图4
4.1.4 指示灯电路
当电动机正传时,led1灯亮,当电动机反转时,led2灯亮。
图5
4.1.5 控制电动机正反转电路
由电动机与PNP和NPN三极管控制,当p1.0口低电平,控制电动机正传,当p1.1低电平,电动机反转。
图6
4.2系统整体电路
图7
5 软件设计
5.1 系统软件设计
系统软件主要实现智能光控、手动控制两大功能,采用C语言进行编程,可实现用户在使用窗帘时任意选择自动或手动控制方式[4-5]。
5.2程序流程图
光控窗帘程序流程图如图3所示。
图8
5.3 程序设计
(1)光控程序
当天亮时,有阳光射进屋内,传感器感应到光信号,此时电机正转,窗帘开始打开,当碰到开限位开关时,电机停止转动;当天黑时,传感器接收到信号,电机反转,窗帘闭合,当碰到关限位开关时,电机停止转动。具体程序如下:
#include #include #define uchar unsigned char #define uint unsigned int sbit K3=P2.2; //光控正转或反转,此处接光敏传感器 sbit K5=P2.4; //开限位 sbit K6=P2.5; //关限位 sbit LED1=P0.0; //正转指示灯 sbit LED2=P0.1; //反转指示灯 sbit MA=P1.0; sbit MB=P1.1; void main(void) { LED1=1;LED2=1; while(1) { if(K7==0) sd(); if (K3==0&&K4==1) //光控正转 { while (K3==0&&K5==1&&K4==1) {LED1=0;LED2=1;MA=0;MB=1;} LED1=1;LED2=1;MA=1;MB=1; } if (K4==0&&K3==1) //光控反转 { while (K4==0&&K6==1&&K3==1) { LED1=1;LED2=0;MA=1;MB=0; } LED1=1;LED2=1;MA=1;MB=1; } } } (2)手动程序 当阴天或者晚上用户要打开窗帘时,只需将控制方式选择按钮P2.6按下,就可以实现手动控制窗帘的开合。程序如下: #include #include #define uchar unsigned char #define uint unsigned int sbit K1=P2.0; //手动正转 sbit K2=P2.1; //手动反转 sbit K7=P2.6; //控制方式选择按钮 sbit LED1=P0.0; //正转指示灯 sbit LED2=P0.1; //反转指示灯 sbit MA=P1.0; sbit MB=P1.1; void delay(uint z); 声明子函数 void delay(uint z) //延时子程序延时约z毫秒 { uint x,y; for(x=z;x>0;x--) } int main(void) { LED1=1;LED2=1; while(1) { if(K7==0) sd(); if (K3==0&&K4==1) //光控正转 { while (K3==0&&K5==1&&K4==1) {LED1=0;LED2=1;MA=0;MB=1; while (K3==0&&K5==1&&K4==1) { delay(10000);LED1=1;LED2=1;MA=1;MB=1;} } while (K3==0&&K5==0&&K4==1) {LED1=1;LED2=0;MA=1;MB=0; while (K3==0&&K5==0&&K4==1) { delay(10000);LED1=1;LED2=1;MA=1;MB=1;} } } if (K4==0&&K3==1) //光控反转 { while (K4==0&&K6==1&&K3==1) { LED1=1; LED2=0; MA=1;MB=0; while (K4==0&&K6==1&&K3==1) { delay(10000); LED1=1;LED2=1;MA=1;MB=1; } } while (K4==0&&K6==0&&K3==1) {LED1=0;LED2=1;MA=0;MB=1; } while (K4==0&&K6==0&&K3==1) { delay(10000); LED1=1;LED2=1;MA=1;MB=1; } } } } 6 系统的不足和改进 6.1系统的不足 系统的灵敏度不是很高,在模式运行下,有一定的延迟。 6.2 系统的改进 系统根据光强来判断断开还是闭合开关,而每个开关所控制电机转动的时间不同从而解决了窗帘大开的程度的自动化。在系统的外部增加一个收集天气、温度的采集点,根据湿度、温度、风速、浮尘度等等,进行判决,自动帮助系统选择模式。进而实现了系统全智能化。 7.心得体会 通过对本次课程的课程设计,使自己深刻的认识到自己的很多不足之处,在实际动手操作能力的不足,在进行程序编程时,自己需要,认真审题,看懂题目的要求!对于软件编程不益太简单或者太难。做到既能把课题完成又能锻炼自己的能力! 根据课题要求,复习相关的知识,查询相关的资料。根据课程条件,找到适合的方案,找到需要的元器件及工具,准备课程。 根据课程设计的要求和自己所要增加的功能写好程序流程图,在程序流程图的基础上,根据芯片的功能写出相应的程序和增加额外的功能程序。然后再进行程序调试和相应的修改,以达到能够实现所要求的功能的目的。 还要根据课程的实际情况,添加些额外程序来使系统更加的稳定,如开关的去抖(采用延迟)。 程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。 该课程设计的程序可以参考MCS-51系列单片机,也可自己根据自己熟悉的方法来编程如单片机C语言。 在设计控制开关时,注意2个中断的打开和关闭的先后顺序,否则就会出错。 这次的单片机课程设计重点是理论与实际的相结合。该设计从头到尾都要自己参与,熟悉了对整个设计的过程,更系统的锻炼了自己。 虽然这次的设计到最后并没有做出非常准确的结果,但是基本达到了设计的要求,最重要的是,在本次设计过程中我学到了很多平时没有学到的或者说是很欠缺的东西,在一定程度上也提升了自己的能力,受益匪浅。 参考文献 [1] 张鑫.单片机原理及应用(第2版)[M].北京:电子工业出版社,2010. [2] 胡汉才.单片机原理及其接口技术(第3版)[M].北京:清华大学出版社,2010. [3] 胡汉才.单片机原理及其接口技术学习辅导与实践教程[M].北京:清华大学出版社,2010. [4] 张义和.例说51单片机(C语言版)[M].北京:人民邮电出版社,2008. [5] 黄英.单片机工程应用技术[M].上海:复旦大学出版社,2011 . 附录 系统程序: #include #include #define uchar unsigned char #define uint unsigned int sbit K1=P2^0; //手动正转 sbit K2=P2^1; //手动反转 sbit K7=P2^6; //控制方式选择按钮 sbit LED1=P0^0; //正转指示灯 sbit LED2=P0^1; //反转指示灯 sbit MA=P1^0; sbit MB=P1^1; sbit K3=P2^2; sbit K4=P2^3; //光控正转或反转,此处接光敏传感器 sbit K5=P2^4; //开限位 sbit K6=P2^5; //关限位 void delay(uint z); //声明子函数 void delay(uint z) //延时子程序延时约z毫秒 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void sd() //子程序 { while(1) { if(K7==1) { return; } if (K1==0&&K2==1) //手动正转 { while (K1==0&&K5==1&&K2==1) { LED1=0;LED2=1;MA=0;MB=1; //delay(10000); } LED1=1;LED2=1;MA=1;MB=1; //不转 } if (K2==0&&K1==1) //手动反转 { while (K2==0&&K6==1&&K1==1) { LED1=1;LED2=0;MA=1;MB=0; //delay(10000); } LED1=1;LED2=1;MA=1;MB=1; } } } int main(void) { LED1=1;LED2=1; while(1) { if(K7==0) sd(); if (K3==0&&K4==1) //光控正转 { while (K3==0&&K5==1&&K4==1) {LED1=0;LED2=1;MA=0;MB=1; while (K3==0&&K5==1&&K4==1) { delay(10000);LED1=1;LED2=1;MA=1;MB=1;} } while (K3==0&&K5==0&&K4==1) {LED1=1;LED2=0;MA=1;MB=0; while (K3==0&&K5==0&&K4==1) { delay(10000);LED1=1;LED2=1;MA=1;MB=1;} } } if (K4==0&&K3==1) //光控反转 { while (K4==0&&K6==1&&K3==1) { LED1=1; LED2=0; MA=1;MB=0; while (K4==0&&K6==1&&K3==1) { delay(10000); LED1=1;LED2=1;MA=1;MB=1; } } while (K4==0&&K6==0&&K3==1) {LED1=0;LED2=1;MA=0;MB=1; } while (K4==0&&K6==0&&K3==1) { delay(10000); LED1=1;LED2=1;MA=1;MB=1; } } } } 系统正转 系统反转
