基于单片机的智能窗帘控制器设计_第1页
基于单片机的智能窗帘控制器设计_第2页
基于单片机的智能窗帘控制器设计_第3页
基于单片机的智能窗帘控制器设计_第4页
基于单片机的智能窗帘控制器设计_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机的智能窗帘控制器设计摘要在社会经济快速增长,人们的生活质量也在不断飞升的时代里,

人们对生活的舒适度的需求越来越高

,窗帘作为每个家庭的必须用品,当然也需要满足人们更高的舒适性需求

,因此就有设计一款智能的遥控窗帘的需要。

本文设计一款基于AT89C51

智能遥控窗帘,可以采用无线遥控和智能光感模式,通过直流电机控制窗帘的开和关。光感部分主要可分成光感检测和光感执行两部分。光感检测依靠的是光敏电阻的使用;光敏电阻可分成暗电流和亮电流两部分。光感执行部分主要包括一个直流电机和三个限位开关来实现,电机按相应方向转动。手动遥控部分则依靠无线接收模块来控制电机的转动,还实现了时间自动控制,根据设置输入的开启或关闭时间来控制窗帘的关闭和打开。窗帘的正转、反转和停止功能可由单片机输出电平来控制步进电机的运转以实现。环境亮度的控制通过光敏电阻和运放组成的电路来控制单片机输出电平继而控制电机的正转和反转。关键词:AT89C51;直流电机;无线遥控AbstractIntherapidgrowthofsocialeconomy,thequalityofpeople'slifeisalsointheeraofconstantrise,peopleliveamoreandmorehighdemandforcomfort,curtainforeveryfamilymustsupplies,ofcoursealsoneedtomeetpeople'sneedsforhighercomfort,sothereisaneedtodesignasmartremotecontrolcurtain.Thisdesignisbasedon8-bitmicrocontrollerAT89C51designofintelligentremotecontrolcurtain.WirelessremotecontrolandintelligentphotosensitivemodecanbeusedtocontroltheopeningandclosingofcurtainsbyDCmotor.Theopticalsensepartcanbedividedintotwoparts:opticalsensedetectionandopticalsenseexecution.Lightsensingdependsontheuseofphotosensitiveresistors.Photosensitiveresistorscanbedividedintodarkcurrentandlightcurrent.Theopticalsenseactuatormainlyconsistsofadcmotorandthreelimitswitches.Whenthelightresistancejudgesthatthelightintensitychanges,themotorrotatesinthecorrespondingdirection.Alsorealizedthetimeautomaticcontrol,accordingtothesettinginputopenorclosetime,tocontrolthecurtaincloseandopen.Theforward,reverseandstopfunctionsofthecurtaincanberealizedbytheoutputlevelofthesingle-chipmicrocomputertocontroltheoperationofthesteppingmotor.ThecontrolofambientbrightnesscontrolstheMCUoutputlevelandthentheforwardandreverseofthemotorthroughthecircuitcomposedofphotosensitiveresistorandoperationalamplifier.Automatictimecontrolcanbecontrolledbyatimer.Adoptwirelessremotecontrol,andintelligentmode,throughthedirectcurrentelectricalcontrolsystemcurtainopeningandclosing.Keywords:AT89C51;Dcmotor;Thewirelessremotecontrol

目录TOC\o"1-3"\h\u第一章绪论 绪论1.1系统设计的背景及意义低功耗以住宅为平台,兼备建筑、网络通信、信息家电、设备自动化,集系统、结构、服务、管理为一体的高效、舒适、安全、便利、环保的居住环境,所有显示在家里方便的设备(如音频和视频设备、照明、窗帘控制、空调控制、网络家电,等)通过家庭网络连接在一起。与普通家居相比,它不仅具有传统的居住功能,提供安全舒适的家居生活空间,而且还提供全方位的信息交互功能,优化人们的生活方式。随着社会信息化的加速,人们的工作、生活、交流和信息越来越接近。信息化社会在改变人们的生活方式和工作习惯的同时也对传统民居提出了挑战,社会、技术和经济的进步使人们的观念发生了很大的变化。人们对家居的要求已经不是物理空间了,更关心的是一个安全、方便、舒适的家居环境。随着科技产业结构的调整,生产技术的快速发展,人们的生活水平不断提高,家庭用电也变得越来越普遍。高精度、多功能、低功耗是现代科学技术的发展趋势。在这种趋势下,窗帘的数字化和智能化已成为现代生产研究的主导设计方向。单片机在电子产品中的应用越来越广泛,在许多电子产品中也应用了红外控制。具有光敏系统和红外遥控系统的智能窗帘系统具有较好的开发前景。1.2设计的基本内容本次设计的低功耗自动窗帘控制系统以AT89C51单片机为核心,由电源模块、光敏感应模块、无线遥控模块等几部分的主框架系统,同时扩大其他控制功能。系统可以实现实时监控外部光的强度,从而控制窗帘的自动开启和关闭,通过窗帘的开启和关闭,使室内光线和温度达到理想状态。为了更人性化,本设计通过红外线发送和接收,可以根据用户的意愿实现窗帘的开启和关闭的远程控制。(1)手动控制:该功能使电动窗帘具有手动正传、手动反转和手动停止的功能。而且增加了工作状态指示,电机工作在正传、反转和停止状态的时候,数码管均有不同工作状态指示。

(2)半自动手动控制:半自动手动控制是在需要关闭或打开窗帘的时候,只需要人工按一下正转或反转按键后,窗帘到位自动停止。

(3)环境亮度控制:窗帘的关闭和开启通过环境亮度自动完成窗帘的开启或关闭操作控制,―天黑关闭,天亮打开,具有智能管理,不产生误动作。(4)时间自动控制:根据设置输入的开启或关闭时间,来控制窗帘的关闭和打开。并且有闹铃功能不可手动关闭。

总的来说自动窗帘控制系统具有以下基本功能:(1)照明控制:根据传感器采集的光强值自动开启或关闭窗帘。也就是说,当晨光强度增加到设定值时,通过光感受器采集,单片机控制步进电机拉开窗帘;当夜晚的光强降低到设定值时,通过传感器采集,单片机控制步进电机关闭窗帘。(2)无线控制:当光强不达到设定值时,手动操作红外遥控,接收红外接收系统的信号,单片机控制步进电机开启或关闭窗帘。第二章系统总体方案本系统主要由单片机最小系统、无线发射、接收模块、按键部分、电机控制执行部分和限位开关组成。2.1设计思路本设计是基于单片机的遥控窗帘,采用8位的AT89C51单片机做控制器,程序采用C语言编程来实现.。窗帘的闭合和打开是利用直流电机正反转来实现的。无线遥控模块是由SC2262(发射)/SC2272(接收)编码解码芯片组成的无线发送接收模块。接收信号是通过SC2272,利用SC2272的D0、D1、D2、D3.端口输出的信号控制单片机,单片机控制电磁继电器的吸合来控制直流电机的正反转,实现窗帘的打开和闭合,再电机工作的过程中程序会时刻检测是否碰到行程开关,如果碰到程序会终止电机的工作,从而实现窗帘的防过卷。系统框图如下:状态指示无线发射模块AT89C51状态指示无线发射模块AT89C51电机控制模块电机控制模块光线检测模块光线检测模块图2.1系统框图2.2主控芯片本设计的主控芯片是单片机AT89C51。是一个具有4K可编程Flash存储器,允许程序存储器在系统可编程,他的指令和管脚的功能和工业的80c51是一致的,所以AT89C51在许多嵌入式控制系统中得到广泛应用。AT89C51单片机主要功能:在晶片内部具时钟振荡器;其中内部程序存储器(ROM)为4KB;内部数据存储器(RAM)为256字节;具有32个可编程I/O口线;包括8个中断向量源;可以看到有两个16位计数器/定时器;同时是具有全双工UART串行通道的;还具有三级加密程序存储器;在掉电后中断可被唤醒;并且会有低功耗空闲和掉电模式;还有一个看门狗定时器。REST:叫单片机复位输入引脚。在振荡器复位器件的情况下,要保持REST脚两个机器周期的高电平时间。ALE/PROG:在FLASH编程期间,用于输入编程脉冲。在一般情况下,ALE端会以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。以至于它可用来作对外部输出的脉冲或者是用于定时目的。需要特别注意的一点是:每当它被用作外部数据存储器时,就将跳过一个ALE脉冲。要是想禁止ALE的输出那就可以在SFR8EH地址上置0。与此同时ALE只有在执行MOVX,MOVC指令时才会起作用。最后需要将该引脚被略微拉高。如果微处理器是在外部执行ALE禁止状态,那么置位就是无效的。PSEN:是用于外部程序存储器的选通信号。在由外部程序存储器取指的这段时间,每个机器周期需要两次的PSEN才能有效。如果在访问外部数据存储器的话,这两次有效的/PSEN信号是不会出现的。EA/VPP:当EA保持低电平时,需要保证在此期间有外部程序存储器(0000H-FFFFH),关于内部程序存储器是可有可无的。需要特别注意的是当加密方式为1时,EA引脚将内部锁定为RESET;反之当EA端是高电平时,需要保持在此间有内部程序存储器。在FLASH编程期间,此引脚也可以用于12V编程的电源。2.3单片机最小系统单片机的最小系统:需要在51单片机加上一些的外围电路和应用系统所构成的应用系统称为单片机最小系统。(1)时钟电路AT89C51单片机芯片内部有一个反相放大器,是用来构成振荡器振荡电路。一般情况下会在在P19和P20还有GND之间接一个30Pf的瓷片电容,然后根据实际情况选择合适的晶振,可以选6M、12M、24M等构成晶振电路,起作用是为单片机提供时钟。图2.2时钟电路(2)复位电路在单片机的最小系统电路中,通常采用自动复位和手动键复位来实现最小系统的还原操作。在这种情况下,电源连接到单片机,MCU的最小系统自动实现复位操作,自动复位通过电容C3充电实现。在这里使用手动复位,当电源接通时,单片机被按钮开关复位。电阻R1与VCC连接,按下按钮重置手动按钮。其结构如下图:图2.3复位电路(3)电源模块51单片机虽然使用时间最早、应用范围最广,但是在实际使用过程中,一个和典型的问题就是相比其他系列的单片机,51单片机更容易受到干扰而出现程序跑飞的现象,克服这种现象出现的一个重要手段就是为单片机系统配置一个稳定可靠的电源供电模块。此最小系统中的电源供电模块的电源可以通过计算机的USB口供给,也可使用外部稳定的5V电源供电模块供给。图2.4电源电路第三章硬件系统设计3.1按键设计有三种常用的按钮:机械触摸,导电橡胶和柔性按钮(也称为触摸键盘)。使用机械接触按钮机械的灵活性使复位按钮,感觉很明显,连接被用来做一个清晰,简单的过程。但是很容易进入尘埃,体积更大。采用橡胶弹性压钮,复位导电橡胶按钮,使其体积小,便于组装,适合大批量生产。但时间很长,留下弹性橡胶老化,容易进入尘埃。弹性按钮近年来发展迅速,新型按键可分为凸面和平面两种。最灵活的关键特性是防尘、防潮、耐腐蚀、美观、易于组装。而面板的布局和外观,颜色,从机键可以根据需要设计。由于有限的客观条件和经济能力,该系统采用机械接触的按钮。图3.1按键电路图3.1.1按键功能表3.1按键功能表键位功能1切换模式(在手动模式、

定时模式

、光控模式循环切换)2进入当前时间的设置3进入定时时间和光控阈值大小的设置4减(手动

关闭窗帘

)5加(手动

开启窗帘

)3.1.2时间的修改年份的修改:年按下按键2,此时光标在年份的位置闪烁,通过按键4和按键5修改年份的大小。月份的修改:设置好年份之后,再次按下按键2,此时光标跳到了月份闪烁,继续通过按键4键5进行月份大小的修改。按照上面的操作,依次修改年份、月份、日期、小时、分钟,最后设置好分钟的大小后,再次按下按键2,就退出了当前时间的设置。3.2光线检测模块当室外光线变亮,拉开窗帘,指示器亮,当室外光线变暗,窗帘关闭,关闭指示器,光电阻增加的测试系统自动关闭,自动模式的晶体管电压变低,晶体管的发射极电阻是10k,低输出低电平;当强光电阻变小时,当晶体管的基极电压较高时,当晶体管连接时,功率发射器被拉出,输出高。光学传感器的原理如图3.2所示。图3.2光敏检测模块

3.3无线模块3.3.1遥控发射模块参数表3.2遥控发射模块参数1通讯方

式调

幅AM2工作频

率3

15M

HZ/

433

MHZ3频率稳

定度±75

KHZ4发射功

率≤

500

MW5静

态电流≤0

1UA6发射电

流3

~50

MA7工作电

压D

C3

~12

V数据传输模块在运行时使用表面声波共振频率稳定,频率稳定度较高,频率仅为3PPM/度。特别地,一个多无线远程控制和数据传输系统的集合。频率稳定后的晶体谐振器,比LC振荡器的平均频率稳定和一致性差,即使在高质量的padder中,由于温度和振动的变化,也很难保证不发生迁移发生频率的调整。发射机模块没有设置编码IC和数据调制晶体管Q1的增加,这种结构可以轻易地和其他固定编码电路、滚动编码电路和单片机接口,而不考虑编码电路电压和信号振幅值的输出幅度。例如,使用PT2262和其他编码的IC连接,您可以直接将它们的数据输出终端连接到数据模块的输入端,过程就完成了。数据模块具有宽的工作电压范围为3〜12V,当电压变化基本上是相同的发送频率,并发送器模块,支持所述接收模块无需任何调节可以稳定地接收。当发射机电压为3V时,需要约20至50米的传输距离,其传输功率小,当电压为5V时约需要100至200米的传输距离,当为9V的电压时约需要300至500米的传输距离,当传输电压为12V时事最佳工作电压,具有较好的发射效应,约为60毫安,发射电流为700至800米空旷传输距离和传输功率大约为500毫瓦。当电压低于l2V的功率消耗增加时,有效辐射功率不显著改善。这个模块的特征是发送功率较大,相对传输距离远,更适合于恶劣的条件下的通信。因为天线导线有25厘米长,那么最好在远距离传输的时候将它竖立起来,因为会有许多因素会影响到无线电信号发送的收入的最佳选择,但事实上距离是只有一半的标称距离或更小,并且需要时间去开发传输。减少电力消耗的数据可以使用ASK调制模式来达到其目的,当数据信号被停止时发射电流就会降低到零的状态,该数据信号和发送模块的输入电阻器或可使用电容耦合,而不是直接连接,或发射器模块不会工作。接近实际工作电压数据模块应该是数据级,为了获得更好的调制效果。发射机发射模块最好垂直安装在主板边缘,设备应乱放5mm以上,以防止分布参数影晌。比如说传输距离、信号的频率和幅度调制模块、发射电压及电池容量、发射天线、灵敏度、相关接收机收发环境等因素。通常开阔地带最大发射约800米,不同的传输距离会因为折射和反射的传输过程缩短到无线电信号将会出现不稳定的情况,需要根据不同的环境制定不同的收发器以及收发距离[5]。3.3.2PT2262/PT2272编解码集成电路原理说明PT2262/2272是来自台湾普林斯顿公司生产,具有低功耗CMOS工艺以及低成本通用编解码电路,PT2262/2272最多含有12个侧三态地址引脚是A0-A11引脚,接线方式有悬空、接高、接低电平,任何可用的组合如531441地址码,PT2262最多可以有6个数据终端,设定的地址码和数据码是从17脚串行输出的,由芯片PT2262发射编码信号有:地址代码、数据代码、同步代码,可以用来形成一个完整的代码。PT2272解码芯片有两个比较检查接收信号和它的地址代码,VT脚输出的是高电平,并在同一时间数据脚输出高电平,如果发送端一直按住该按钮那么芯片将连续发射编码。不管有没有按下发射按钮,PT2262都无需电源。其17脚为低电平,高频发射电路工作频率为315MHz并且没有按下按钮时,那么PT2262电器是处于工作的状态,然而17脚输出的是调制的串行数据信号,当17脚输出315MHz的高频传输电路就可以看到在启动和发出的高频信号的幅度,当315MHz的高频传输电路停止那么17脚振荡,并且高频传输电路会完全关闭,用来控制数字信号PT226217脚输出,因而高频电路完整幅移键控(ASK调制)调制等效于100%的调幅。表3.3PT2262特

点CMOS工艺特点低功耗工作电压范围2.6-15v数据位数0-

6位地址码数531

441

种PT2262的应用范围有:车辆防盗系统

;家庭防

盗系统;遥控玩具;其他电器遥控。在特定的应用中,外部振动阻力可以适当地根据需要进行调整,电阻越大,越慢的振荡频率,更大的码发送时间长的编码宽度。大多数产品均采用2262/1.2M=2272/200K组合,该模块的另一个重要用途是与单片机数据通信来实现,然后有一些小窍门:1、合理的通讯速率数据模块的最大传输数据速率为9.6KBs,通常在约2.5K控制的高数据率的增加会降低接收器的灵敏度和误码率或者甚至不可能工作。2、合理的信息码格式当单片机模块工作时,它会定义自己的传输协议,不管使用哪一种调制的方案,信息编码格式的传递是非常重要的,它将会直接影响数据收发的可靠性。推荐方案:格式是前导码+同步码+数据帧,前导码长度要大。设置前导码的长度为10ms,以避免背景噪声,因为所接收的数据根据一个容易受到干扰(即,零级干扰)接收模块所引起的接收到的数据错误。所以,我使用的是CPU编解码器并增加一些乱码数据识别,用来抑制干扰因素。前导码的长度不同其主要应用于数据中,并有一定的特性,使得该软件可以通过一定的算法同步码被识别,同时准备好接收数据。数据帧不应使用NRZ,不长0和1长。采用曼彻斯特编码或编码POCSAG。3、单片机对接收模块的干扰2262单片机仿真时间是正常的,但是在2272单片机模拟在解码的过程中会发现有很多短距离远程控制,这是一个单片机时钟倍频器造成的干扰和接收模块,51系列单片机2051度的电磁干扰和电磁干扰对PIC系列电磁干扰相对较小,因此,我们需要采取一些抗干扰措施来减少干扰。如微控制器和远程控制接收电路有两个5v电源,接收板独立电源78l05单片机时钟区域从接收模块,降低微控制器的工作频率,增加块的中间。接收模块和51系列是最好的隔离电路接口,可以更好地抑制单片机模块,主要起到电磁干扰的作用。输出脉冲接收机模块工作一般是高的,而不是直流电平,所以我们不能用万用表来测试,可以通过led来调试在输出状态下使用的3k串联电阻监测模块。基于无线数据模块和PT2262/PT2272解码芯片特殊目的,只是为了简单的连接,并且可以直接连接到传输距离是比较理想的,一般600米,如果使用单片机或微处理器、微控制器和微处理器时钟干扰,导致减少传输距离远,一般实用200米以内。3.3.3遥控电路设计遥控电路的设计主要运用了,2262与2272芯片作为遥控的接收编码与译码芯片,遥控电路图如图3.3所示。图3.3遥控器原理图

用12V电池的远程控制部分,电源按钮电池正结束后按压和将芯片和发射模块和通信信号,所以还设计以确保电池的耐久性。接收部分的电路图如图3.4所示。图3.4接收原理图接收电路是通过SC2272先译码,然后通过NPN三极管9013将芯片输出的的高电平转化为低电平,这样单片机就可以更好地识别变化。3.4正反转控制模块电机的驱动模块主要采用的是两个继电器来控制直流电机的两端电压,从而控制电机的正反转,带动窗帘的开合,两个继电器采用5V继电器,通过两个PNP三极管9012驱动继电器的吸和。模块的电路图如图3.5所示。图3.5电机正反转模块3.5显示模块显示主要采用3个红黄蓝LED灯指示系统工作状态,红色LED亮时系统是智能模式,就是当室光线变亮时,窗帘自动打开,当室外光线变暗时,窗帘自动关闭。当蓝色LED亮时表示电机正传,黄色LED亮时表示电机反转,当限位开关闭合时,相应LED灯慢闪3下,同时停止电动机,电路图如图3.6所示。图3.6显示模块接线图第四章系统软件设计对于AT89C51系列的单片机,通常都是兼容c语言与汇编语言,也有的汇编和c交替使用的。汇编语言程序设计也将在SCM给出被广泛使用,具有简单,实用,灵活的控制,还具有实时的性质,大大的提高了程序的效率和利用率。汇编语言具有非常强的控制硬件,可以实现与其他高级语言的软件和硬件的信息不能在汇编语言来控制,但编程的复杂性非常高,而且不容易理解。综合来看,软件设计语言选择C语言。4.1程序设计这次设计主要运用的是C语言编程,主要使用了ifelse语句,while循环等判断语句,比如遥控板有一个按钮按下时,编码芯片将减少相应的关键代码,通过导线被发送到无线模块,无线传输模块将信号传输,通过调幅接收机模块将接收的信号,该芯片将自动解码,解码输出对应的电压通过三极管放大器,单片机接收数据和相应的功能响应。当限位开关关闭时,窗帘已达到指定位置并停止转动。4.2系统程序流程图4.2.1系统基本操作顺序本文设计的

智能遥控窗帘,拥有无线遥控和智能光感两种运行模式,用户可以自由选择运行模式来控制窗帘的开和关。图4.1操作顺序图4.2.2智能模式流程系统可以实现实时监控外部光的强度,从而控制窗帘的自动开启和关闭,过窗帘的开启和关闭,使室内光线和温度达到理想状态图4.2智能模式流程图4.2.3无线模式流程为了更人性化,本设计通过红外线发送和接收,可以根据用户的意愿实现窗帘的开启和关闭的远程控制。图4.3无线模式流程图

4.2.4程序总流程该系统总体分为智能光感和无线遥控两种模式,用户可根据自身需求来随意设置运行哪一种模式。其中智能模式是为了解放人们的双手,随着外界光线的强弱自动调节窗帘。而遥控模式则是为了方便用户的不同需求来调节窗帘。是是是是打开窗帘关闭窗帘停止动作关闭限位是否闭合打开限位是否闭合关闭窗帘打开窗帘关闭按钮是否按下打开按钮是否按下光线明暗开始系统是否是智能模式是是是是打开窗帘关闭窗帘停止动作关闭限位是否闭合打开限位是否闭合关闭窗帘打开窗帘关闭按钮是否按下打开按钮是否按下光线明暗开始系统是否是智能模式 否 否否否否 亮 暗否否否否 结束结束图4.4总程序流程图

总结本文通过分析自动窗帘系统的现状和人们对自动窗帘系统功能的要求,设计了自动窗帘系统控制器的设计。整体设计采用步进电机作为单片机的控制元件,完成了幕布开启和关闭的主要任务。利用光敏电阻作为检测元件,提供单片机的外部照明。采用红外检测电路实现手动控制。以AT89C51单片机为主控芯片,控制整个系统的运行;此外,在按钮和显示电路的帮助下,在各模块的配合下,最终实现了自动窗帘控制系统的智能化要求。自动窗帘控制系统具有以下基本功能:光感控制:根据传感器采集的光强值自动开启或关闭窗帘。也就是说,当晨光强度增加到设定值时,通过光感受器采集,单片机控制步进电机拉开窗帘;当夜晚的光强降低到设定值时,通过传感器采集,单片机控制步进电机关闭窗帘。无线控制:当光强不达到设定值时,手动操作红外遥控,接收红外接收系统的信号。单片机控制步进电机开启或关闭窗帘。参考文献[1]李朝青.单片机原理及接口技术[M].北京:北京航天航空大学出版色,2014.22-26.[2]胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,2014.55-56.[3]阎石.数字电子技术基础[M].北京:高等教育出版社,2015.19-58.[4]熊超美.步进电机的单片机控制硬件系统设计[J].湖南有色金属.2017(02).2-3.[5]董晓庆.基于单片机的红外线传输系统设计及实现[J].科技资讯.2018(21).1-2.[6]王海波,吴晓光,李沛,余祎琴.基于AT89S52单片机步进电机控制系统设计[J].机电产品开发与创新.2016(06).3-4.[7]杨东,轩克辉,董雪峰.光敏电阻的特性及应用研究[J].山东轻工业学院学报(自然科学版).2013(02).2-3.[8]谌容,胡泽,张扯拉,汪维.基于单片机控制的智能光控窗帘系统研究[J].电子世界.2015(09).3-5.[9]张天鹏,徐磊.L298N控制直流电机正反转[J].工业设计.2017(03).5-6.[10]V.Yu.Teplov,A.V.Anisimov.ThermostattingSystemUsingaSingle-ChipMicrocomputerandThermoelectricModulesBasedonthePeltierEffect[J].2017:8-11.[11]王述彦,师宇,冯忠绪.基于模糊PID控制器的控制方法研究[J].机械科学与技术.2018(01)[12]黎琼.低功耗中红外遥控系统的设计与实现[D].华中科技大学2017.14-40.[13]Yu,

Zhou,

Gao,

Weizeng,

Zuo,

Xiangang.Design

of

Novel

Intelligent

Transportation

System

based

on

Wireless

Sensor

Network

and

ZigBee

Technology[D].

Sensors

&

Transducers,

2015,

Vol.156

(9),

pp.95-102

附录A原理图啊收到哦啊搜房家万佛IQ就奥斯卡来得及啊居虚拟机上旬梦想偶尔他离开农村中学举行了看见爱的离开房间啊短时考虑到驾驶人看到佳世客来得及卡视角贷款流程进行直接回去偶尔合理且会尽快处理基础竹西佳处单发进出口自行车哪款就舒服IQ我就会IQ见覅案件是的骄傲是的骄傲是人口基础装修啦起拍价琥珀金爱打架啥空间打开拉三等奖阿萨德积分IQ我很厉害能看出来装修材料电气工鞥过控制虚假活动和大数据从这些可能出了最新处理器为了加强玩具卡罗拉的考虑了这些每次连续两次了慢慢实打实看啥看大结局奥斯卡拿手机打开那时间的离开静安寺你看得见那是假的家万佛IQ就奥斯卡来得及啊居虚拟机上旬梦想偶尔他离开农村中学举行了看见爱的离开房间啊短时考虑到驾驶人看到佳世客来得及卡视角贷款流程进行直接回去偶尔合理且会尽快处理基础竹西佳处单发进出口自行车哪款就舒服IQ我就会IQ见覅案件是的骄傲是的骄傲是人口基础装修啦起拍价琥珀金爱打架啥空间打开拉三等奖阿萨德积分IQ我很厉ksldkaslkdjasf打扫房间爱上咖啡机埃里克家可能是大家开始放假阿克苏计划卡手机号卡洛斯的记录卡时间很可能从初级中学出来这么想为其为哦按王企鹅UI偶家按时打卡时间了按实际贷款拿手机打开啦起围墙外IE偶家奥斯卡来得及奥斯卡你的阿斯加德卡拉胶圣诞PCB图附录B#include<reg52.h>#include<intrins.h>#defineucharunsignedchar //以后unsignedchar就可以用uchar代替#defineuintunsignedint //以后unsignedint就可以用uint代替sbitADC_CS=P1^6; //ADC0832的CS引脚sbitADC_CLK=P1^7; //ADC0832的CLK引脚sbitADC_DAT=P3^2; //ADC0832的DI/DO引脚sbitSCK_P=P1^0; //时钟芯片DS1302的SCK管脚sbitSDA_P=P1^1; //时钟芯片DS1302的SDA管脚sbitRST_P=P1^2; //时钟芯片DS1302的RST管脚sbitLcdRs_P=P1^3; //1602液晶的RS管脚sbitLcdRw_P=P1^4;//1602液晶的RW管脚sbitLcdEn_P=P1^5; //1602液晶的EN管脚sbitKeyMode_P=P3^3; //模式切换sbitKeySet_P=P3^4; //设置时间按键sbitKeySet2_P=P3^5; //设置时间模式的开关时间和光照控制强度sbitKeyDown_P=P3^6; //减按键sbitKeyUp_P=P3^7; //加按键sbitLed_P=P2^0; //指示灯uchargMode=1; //1是手动模式,2是时间自动模式,3是亮度自动模式ucharOpenHour=18; //开启窗帘的小时ucharOpenMinute=20; //开启窗帘的分钟ucharCloseHour=10; //关闭窗帘的小时ucharCloseMinute=30; //关闭窗帘的分钟uchargLight=40; //窗帘开关的阈值ucharcodeClock[]={0x80,0x40,0x20,0x10}; //步进电机顺时针旋转数组ucharcodeAntiClock[]={0x10,0x20,0x40,0x80}; //步进电机逆时针旋转数组ucharTimeBuff[7]={17,9,1,6,18,30,40}; //时间数组//TimeBuff[0]代表年份,范围00-99//TimeBuff[1]代表月份,范围1-12//TimeBuff[2]代表日期,范围1-31//TimeBuff[3]代表星期,范围1-7//TimeBuff[4]代表小时,范围00-23//TimeBuff[5]代表分钟,范围00-59//TimeBuff[6]代表秒钟,范围00-59/*********************************************************///毫秒级的延时函数,time是要延时的毫秒数/*********************************************************/voidDelayMs(uinttime){ uinti,j; for(i=0;i<time;i++) for(j=0;j<112;j++);}/*********************************************************///1602液晶写命令函数,cmd就是要写入的命令/*********************************************************/voidLcdWriteCmd(ucharcmd){ LcdRs_P=0; LcdRw_P=0; LcdEn_P=0; P0=cmd; DelayMs(2); LcdEn_P=1; DelayMs(2); LcdEn_P=0; }/*********************************************************///1602液晶写数据函数,dat就是要写入的数据/*********************************************************/voidLcdWriteData(uchardat){ LcdRs_P=1; LcdRw_P=0; LcdEn_P=0; P0=dat; DelayMs(2); LcdEn_P=1; DelayMs(2); LcdEn_P=0;}/*********************************************************///1602液晶初始化函数/*********************************************************/voidLcdInit(){ LcdWriteCmd(0x38);//16*2显示,5*7点阵,8位数据口 LcdWriteCmd(0x0C);//开显示,不显示光标 LcdWriteCmd(0x06);//地址加1,当写入数据后光标右移 LcdWriteCmd(0x01);//清屏}/*********************************************************///液晶光标定位函数/*********************************************************/voidLcdGotoXY(ucharline,ucharcolumn){ //第一行 if(line==0) LcdWriteCmd(0x80+column); //第二行 if(line==1) LcdWriteCmd(0x80+0x40+column);}/*********************************************************///液晶输出字符串函数/*********************************************************/voidLcdPrintStr(uchar*str){ while(*str!='\0') LcdWriteData(*str++);}/*********************************************************///液晶输出数字(0-99)/*********************************************************/voidLcdPrintNum(ucharnum){ LcdWriteData(num/10+48); //十位 LcdWriteData(num%10+48); //个位}/*********************************************************///显示模式/*********************************************************/voidLcdPrintMode(ucharnum){ switch(num) { case1:LcdPrintStr("Manual"); break; case2:LcdPrintStr("Timing"); break; case3:LcdPrintStr("Liging"); break; default: break; }}/*********************************************************///液晶显示内容的初始化/*********************************************************/voidLcdShowInit(){ LcdGotoXY(0,0); LcdPrintStr("20--:"); LcdGotoXY(1,0); LcdPrintStr("gz:"); LcdGotoXY(1,0); LcdPrintMode(gMode);}/*********************************************************///刷新时间显示/*********************************************************/voidFlashTime(){ LcdGotoXY(0,2); //年份 LcdPrintNum(TimeBuff[0]); LcdGotoXY(0,5); //月份 LcdPrintNum(TimeBuff[1]); LcdGotoXY(0,8); //日期 LcdPrintNum(TimeBuff[2]); LcdGotoXY(0,11); //小时 LcdPrintNum(TimeBuff[4]); LcdGotoXY(0,14); //分钟 LcdPrintNum(TimeBuff[5]); LcdGotoXY(0,13); //秒钟 if(TimeBuff[6]%2==0) //秒钟是偶数显示冒号 LcdWriteData(':'); else //秒钟是奇数显示空格 LcdWriteData('');}/*********************************************************///初始化DS1302/*********************************************************/voidDS1302_Init(void){ RST_P=0; //RST脚置低 SCK_P=0; //SCK脚置低 SDA_P=0; //SDA脚置低 }/*********************************************************///从DS1302读出一字节数据/*********************************************************/ucharDS1302_Read_Byte(ucharaddr){ uchari; uchartemp; RST_P=1; /*写入目标地址:addr*/ for(i=0;i<8;i++) { if(addr&0x01) SDA_P=1; else SDA_P=0; SCK_P=1; _nop_(); SCK_P=0; _nop_(); addr=addr>>1; } /*读出该地址的数据*/ for(i=0;i<8;i++) { temp=temp>>1; if(SDA_P) temp|=0x80; else temp&=0x7F; SCK_P=1; _nop_(); SCK_P=0; _nop_(); } RST_P=0; returntemp;}/*********************************************************///向DS1302写入一字节数据/*********************************************************/voidDS1302_Write_Byte(ucharaddr,uchardat){ uchari; RST_P=1; /*写入目标地址:addr*/ for(i=0;i<8;i++) { if(addr&0x01) SDA_P=1; else SDA_P=0; SCK_P=1; _nop_(); SCK_P=0; _nop_(); addr=addr>>1; } /*写入数据:dat*/ for(i=0;i<8;i++) { if(dat&0x01) SDA_P=1; else SDA_P=0; SCK_P=1; _nop_(); SCK_P=0; _nop_(); dat=dat>>1; } RST_P=0; }/*********************************************************///向DS1302写入时间数据/*********************************************************/voidDS1302_Write_Time(){uchari; uchartemp1; uchartemp2; for(i=0;i<7;i++) //十进制转BCD码 { temp1=(TimeBuff[i]/10)<<4; temp2=TimeBuff[i]%10; TimeBuff[i]=temp1+temp2; } DS1302_Write_Byte(0x8E,0x00); //关闭写保护 DS1302_Write_Byte(0x80,0x80); //暂停时钟 DS1302_Write_Byte(0x8C,TimeBuff[0]); //年 DS1302_Write_Byte(0x88,TimeBuff[1]); //月 DS1302_Write_Byte(0x86,TimeBuff[2]); //日 DS1302_Write_Byte(0x8A,TimeBuff[3]); //星期 DS1302_Write_Byte(0x84,TimeBuff[4]); //时 DS1302_Write_Byte(0x82,TimeBuff[5]); //分 DS1302_Write_Byte(0x80,TimeBuff[6]); //秒 DS1302_Write_Byte(0x80,TimeBuff[6]&0x7F); //运行时钟 DS1302_Write_Byte(0x8E,0x80); //打开写保护}/*********************************************************///从DS1302读出时间数据/*********************************************************/voidDS1302_Read_Time(){ uchari; TimeBuff[0]=DS1302_Read_Byte(0x8D); //年 TimeBuff[1]=DS1302_Read_Byte(0x89); //月 TimeBuff[2]=DS1302_Read_Byte(0x87); //日 TimeBuff[3]=DS1302_Read_Byte(0x8B); //星期 TimeBuff[4]=DS1302_Read_Byte(0x85); //时 TimeBuff[5]=DS1302_Read_Byte(0x83); //分 TimeBuff[6]=(DS1302_Read_Byte(0x81))&0x7F; //秒 for(i=0;i<7;i++) //BCD转十进制 { TimeBuff[i]=(TimeBuff[i]/16)*10+TimeBuff[i]%16; }}/*********************************************************///ADC0832的时钟脉冲/*********************************************************/voidWavePlus(){ _nop_(); ADC_CLK=1; _nop_(); ADC_CLK=0;}/*********************************************************///获取指定通道的A/D转换结果/*********************************************************/ucharGet_ADC0832(){ uchari; uchardat1=0; uchardat2=0; ADC_CLK=0; //电平初始化 ADC_DAT=1; _nop_(); ADC_CS=0; WavePlus(); //起始信号 ADC_DAT=1; WavePlus(); //通道选择的第一位 ADC_DAT=0; WavePlus(); //通道选择的第二位 ADC_DAT=1; for(i=0;i<8;i++) //第一次读取 { dat1<<=1; WavePlus(); if(ADC_DAT) dat1=dat1|0x01; else dat1=dat1|0x00; } for(i=0;i<8;i++) //第二次读取 { dat2>>=1; if(ADC_DAT) dat2=dat2|0x80; else dat2=dat2|0x00; WavePlus(); } _nop_(); //结束此次传输 ADC_DAT=1; ADC_CLK=1; ADC_CS=1; if(dat1==dat2) //返回采集结果 returndat1; else return0;}/*********************************************************///按键扫描(设置当前时间)/*********************************************************/voidKeyScanf1(){ if(KeySet_P==0) { LcdGotoXY(0,13); //显示秒钟的冒号 LcdWriteData(':'); LcdWriteCmd(0x0f); //启动光标闪烁 LcdGotoXY(0,3); //定位光标到年份闪烁 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整年份*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(TimeBuff[0]>0) //判断年份是否大于0 TimeBuff[0]--; //是的话就减去1 LcdGotoXY(0,2); //光标定位到年份的位置 LcdPrintNum(TimeBuff[0]); //刷新显示改变后的年份 LcdGotoXY(0,3); //定位光标到年份闪烁 DelayMs(300); //延时0.3秒左右 } if(KeyUp_P==0) //如果加按键被下去 { if(TimeBuff[0]<99) //判断年份是否小于99 TimeBuff[0]++; //是的话就加上1 LcdGotoXY(0,2); //光标定位到年份的位置 LcdPrintNum(TimeBuff[0]); //刷新显示改变后的年份 LcdGotoXY(0,3); //定位光标到年份闪烁 DelayMs(300); //延时0.3秒左右 } if(KeySet_P==0) { break; } } LcdGotoXY(0,6); //定位光标到月份闪烁 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整月份*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(TimeBuff[1]>1) //判断月份是否大于1 TimeBuff[1]--; //是的话就减去1 LcdGotoXY(0,5); //光标定位到月份的位置 LcdPrintNum(TimeBuff[1]); //刷新显示改变后的月份 LcdGotoXY(0,6); //定位光标到月份闪烁 DelayMs(300); //延时0.3秒左右 } if(KeyUp_P==0) //如果加按键被下去 { if(TimeBuff[1]<12) //判断月份是否小于12 TimeBuff[1]++; //是的话就加上1 LcdGotoXY(0,5); //光标定位到月份的位置 LcdPrintNum(TimeBuff[1]); //刷新显示改变后的月份 LcdGotoXY(0,6); //定位光标到月份闪烁 DelayMs(300); //延时0.3秒左右 } if(KeySet_P==0) { break; } } LcdGotoXY(0,9); //定位光标到日期闪烁 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整日期*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(TimeBuff[2]>1) //判断日期是否大于1 TimeBuff[2]--; //是的话就减去1 LcdGotoXY(0,8); //光标定位到日期的位置 LcdPrintNum(TimeBuff[2]); //刷新显示改变后的日期 LcdGotoXY(0,9); //定位光标到日期闪烁 DelayMs(300); //延时0.3秒左右 } if(KeyUp_P==0) //如果加按键被下去 { if(TimeBuff[2]<31) //判断日期是否小于31 TimeBuff[2]++; //是的话就加上1 LcdGotoXY(0,8); //光标定位到日期的位置 LcdPrintNum(TimeBuff[2]); //刷新显示改变后的日期 LcdGotoXY(0,9); //定位光标到日期闪烁 DelayMs(300); //延时0.3秒左右 } if(KeySet_P==0) { break; } } LcdGotoXY(0,12); //定位光标到小时闪烁 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整小时*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(TimeBuff[4]>0) //判断小时是否大于0 TimeBuff[4]--; //是的话就减去1 LcdGotoXY(0,11); //光标定位到小时的位置 LcdPrintNum(TimeBuff[4]); //刷新显示改变后的小时 LcdGotoXY(0,12); //定位光标到小时闪烁 DelayMs(300); //延时0.3秒左右 } if(KeyUp_P==0) //如果加按键被下去 { if(TimeBuff[4]<23) //判断小时是否小于23 TimeBuff[4]++; //是的话就加上1 LcdGotoXY(0,11); //光标定位到小时的位置 LcdPrintNum(TimeBuff[4]); //刷新显示改变后的小时 LcdGotoXY(0,12); //定位光标到小时闪烁 DelayMs(300); //延时0.3秒左右 } if(KeySet_P==0) { break; } } LcdGotoXY(0,15); //定位光标到分钟闪烁 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整分钟*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(TimeBuff[5]>0) //判断分钟是否大于0 TimeBuff[5]--; //是的话就减去1 LcdGotoXY(0,14); //光标定位到分钟的位置 LcdPrintNum(TimeBuff[5]); //刷新显示改变后的分钟 LcdGotoXY(0,15); //定位光标到分钟闪烁 DelayMs(300); //延时0.3秒左右 } if(KeyUp_P==0) //如果加按键被下去 { if(TimeBuff[5]<59) //判断分钟是否小于59 TimeBuff[5]++; //是的话就加上1 LcdGotoXY(0,14); //光标定位到分钟的位置 LcdPrintNum(TimeBuff[5]); //刷新显示改变后的分钟 LcdGotoXY(0,15); //定位光标到分钟闪烁 DelayMs(300); //延时0.3秒左右 } if(KeySet_P==0) { break; } } /*退出前的设置*/ LcdWriteCmd(0x0C); //关闭光标闪烁 DS1302_Write_Time(); //把新设置的时间值存入DS1302芯片 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 }}/*********************************************************///按键扫描(设置窗帘的动作)/*********************************************************/voidKeyScanf2(){ if(KeySet2_P==0) { LcdGotoXY(0,0); //光标定位 LcdPrintStr("OpenTime:"); //显示第1行内容 LcdGotoXY(1,0); //光标定位 LcdPrintStr("CloseTime:"); //显示第2行内容 LcdGotoXY(0,10); //光标定位 LcdPrintNum(OpenHour); //显示开启窗帘的小时 LcdGotoXY(0,13); //光标定位 LcdPrintNum(OpenMinute); //显示开启窗帘的分钟 LcdGotoXY(1,10); //光标定位 LcdPrintNum(CloseHour); //显示关闭窗帘的小时 LcdGotoXY(1,13); //光标定位 LcdPrintNum(CloseMinute); //显示关闭窗帘的分钟 LcdWriteCmd(0x0f); //启动光标闪烁 LcdGotoXY(0,11); //定位光标 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet2_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整开启的小时*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(OpenHour>0) //判断小时是否大于0 OpenHour--; //是的话就减去1 LcdGotoXY(0,10); //光标定位 LcdPrintNum(OpenHour); //刷新显示改变后的小时 LcdGotoXY(0,11); //定位光标 DelayMs(300); //延时0.3秒左右 } if(KeyUp_P==0) //如果加按键被下去 { if(OpenHour<23) //判断小时是否小于23 OpenHour++; //是的话就加上1 LcdGotoXY(0,10); //光标定位 LcdPrintNum(OpenHour); //刷新显示改变后的小时 LcdGotoXY(0,11); //定位光标 DelayMs(300); //延时0.3秒左右 } if(KeySet2_P==0) { break; } } LcdGotoXY(0,14); //定位光标 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet2_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整开启的分钟*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(OpenMinute>0) //判断分钟是否大于0 OpenMinute--; //是的话就减去1 LcdGotoXY(0,13); //光标定位 LcdPrintNum(OpenMinute); //刷新显示改变后的分钟 LcdGotoXY(0,14); //定位光标 DelayMs(300); //延时0.3秒左右 } if(KeyUp_P==0) //如果加按键被下去 { if(OpenMinute<59) //判断分钟是否小于59 OpenMinute++; //是的话就加上1 LcdGotoXY(0,13); //光标定位 LcdPrintNum(OpenMinute); //刷新显示改变后的分钟 LcdGotoXY(0,14); //定位光标 DelayMs(300); //延时0.3秒左右 } if(KeySet2_P==0) { break; } } LcdGotoXY(1,11); //定位光标 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet2_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整关闭的小时*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(CloseHour>0) //判断小时是否大于0 CloseHour--; //是的话就减去1 LcdGotoXY(1,10); //光标定位 LcdPrintNum(CloseHour); //刷新显示改变后的小时 LcdGotoXY(1,11); //定位光标 DelayMs(300); //延时0.3秒左右 } if(KeyUp_P==0) //如果加按键被下去 { if(CloseHour<23) //判断小时是否小于23 CloseHour++; //是的话就加上1 LcdGotoXY(1,10); //光标定位 LcdPrintNum(CloseHour); //刷新显示改变后的小时 LcdGotoXY(1,11); //定位光标 DelayMs(300); //延时0.3秒左右 } if(KeySet2_P==0) { break; } } LcdGotoXY(1,14); //定位光标 DelayMs(10); //延时等待,消除按键按下的抖动 while(!KeySet2_P); //等待按键释放 DelayMs(10); //延时等待,消除按键松开的抖动 /*调整关闭的分钟*/ while(1) { if(KeyDown_P==0) //如果减按键被下去 { if(CloseMinute>0) //判断分钟是否大于0 CloseMinute--; //是的话就减去1 LcdGotoXY(1,13); //光标定位 LcdPrintNum(CloseMinute); //刷新显示改变后的分钟 LcdGotoXY(1,14); //定位光标 DelayMs(300);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论