本 科 生 毕 业 设计 (申请学士学位) 论文题目基于红外遥控技术的智能电风扇 作者姓名 谢志鹏 所学专业名称 自动化 指导教师 邹国柱 2017年 4 月
学 生: (签字) 学 号: 答 辩 日 期: 年 月 日 指 导 教 师: (签字) 目录
摘要 1 1 绪论 2 1.1 选题意义 2 1.2 研究现状 2 1.3 研究内容 2 2 系统总体设计方案 3 2.1设计思路 3 2.2 系统实现的主要功能 3 3 系统硬件设计 4 3.1 STC89C52单片机 4 3.1.1 主要特效 4 3.2 STC89C52外围基本电路设计 5 3.2.1 电源电路 5 3.2.2 晶振电路 5 3.2.3 复位电路 6 3.2.4 串口下载回路 6 3.2.5 LED数码显示电路 7 3.2.6 蜂鸣器报警电路 8 3.2.7 按键电路 9 3.2.8 DS18B20温度采集电路 9 3.2.9 红外收发控制电路 10 3.2.10 电风扇电极驱动电路 11 4 系统软件设计 11 4.1 软件程序设计概述 11 4.2 主流程图 12 4.3 DS18B20温度采集和设置流程图 13 4.4 电机驱动流程 13 5 系统的调试 14 5.1 硬件调试 14 5.1.1 调试步骤 14 5.2 系统的软件调试 15 5.3 实物功能分析 15 结论 17 参考文献 18 附录 19 附录1 19 附录2 20 致谢 39
基于红外遥控技术的智能电风扇
摘要:本论文是基于STC89C52单片机为核心,设计了一种新型智能红外遥控电风扇控制系统。本系统由红外发射接收模块、液晶显示模块、按键控制模块、声音播报模块、温度检测模块以及电机控制模块组成。该系统能够利用遥控或者按键形式实现对电风扇不同档位的设置。电风扇的控制是通过遥控实现的,它是基于红外通信的原理,并且风速高低是利用PWM信号进行调节的。在按键控制下,系统能够实现声音提示,液晶显示单元能够显示系统运行的状态数据,充分展示了良好的人机交互界面。本系统实现了电风扇的自动调速等智能化功能,让使用者能够依据实际使用情况对电风扇的运行方式进行设置,同时能够依据温度变化进行风速的自动调整。
1 绪论 1.1 选题意义 电风扇是一种普及程度非常广泛且年代较长的家用电器,由于空调的发展和普及,电风扇越来越不受关注且市场越来越小。但是电风扇的优点仍然是空调目前所无法替代的。简单的高中低速已经无法满足人们的生活需求了,操作方便,体积小巧再加上更多智能化人性化的功能相信是如今电风扇的发展趋势和出路,由于红外线远程遥控的普及以及单片机技术的发展,电风扇结合智能红外线远程遥控系统必然会得到优秀的产品为人们所喜爱。 1.2 研究现状 科技日新月异,人们生活节奏也是越来越快来愈快,同时对生活用品的智能需求也在不断的提高。无线通信其中之一的产品遥控器的问世,使得各种各样的遥控设备一一出现,比如各种各样的空调、电视、功放、智能冰箱等。这些形形色色的设备一定程度上给予了人类不断增长的各种需求。遥控器设备已经出现了六七十年了,而现在普遍使用的红外遥控则是在上个实际70年代逐渐发展起来的一种无线远程智能控制技术,红外线遥控的原理是通过红外线来传输被控设备的逻辑信号,以此来实现对被控对象的远距离操作。具体指的就是由红外线遥控器的发射器发出红外控制指令信息,之后被控设备的红外线接收器件接收到相应指令信息后对接收到的相应信号进行解码计算和处理,从而实现红外线遥控对相应设备的各种各样用途的远程操作和控制。红外线智能遥控优点很多,比如它的相对的独立特性、物理学特性、可见光相似性和一定强度的隐蔽特性。目前,随着红外遥控无线技术的迅速发展,红外遥控无线技术已经十分广泛地应用在各种智能电气设备上,并且具有不可或缺的最基本的作用,当然本设计中要研究的红外遥控智能控制电风扇也是基于于此的。红外遥控技术的迅速成熟和十分广泛应用,外加现在的51增强型单片机技术不断扩展成熟,也使得电风扇的红外遥控成为不久将来的发展大趋势。实现红外遥控技术的方法有很多种,如利用常用的51单片机实现、利用DSP实现等!本设计则着重考虑使用STC89C52单片机来实现。 1.3 研究内容 本课题设计的是一款基于STC89C52单片机的智能化红外遥控电风扇。该设计最突出的特点就是更加人性化。具体功能如下:智能风扇的档位控制可通过两种方式实现,一是通过功能键来实现档位的设置,通过设置风扇座上的三个键,来调节不同的风速。其次就是通过无线的方式来实现对档位的设置,本设计中采用的是红外通信的方式实现多档位风速的设置,使用者可以用遥控来控制风扇的风速。以往的电风扇仍然以机械旋钮或者简单红外遥控方式为主,无较好的人机界面。本次设计增加了显示功能和声音提示功能,LED数码管可以将风扇的各种运行状态显示出来,在风扇的控制过程有提示音,使用户可以更加舒适、方便地使用。考虑到不同环境下的各种情况,本设计增加了自动调速系统,风扇可以根据室内的温度变速运行,当温度低于一定温度时,就自动关闭,高于该温度值就会继续工作。
2 系统总体设计方案 2.1设计思路 基于宏晶公司生产的STC89C52系列单片机为控制核心的红外智能遥控电风扇系统最主要的功能是实现电风扇风速的调节控制,基于宏晶公司生产的STC89C52系列单片机为控制核心的红外智能遥控电风扇系统上电运行后,如果调到自动模式,系统会先判断根据DS18B20温度传感器采集到的实际温度值是否低于温度低限值,如果低于温度低限值,风扇停止转动;如果当前环境温度值处在温度低限值和温度高限值之间,风速低速转动;如果当前环境温度值高于温度高限值,风速高速转动。如果选择的是手动模式,则整个风扇的转速则有三档风速可供选择。风扇电机驱动则都是依靠PWM信号来进行控制,同时整个风速自动和手动模式选择、温度高限值和低限值的设置和手动模式下风扇风速的选择都可以选择本地按键方式或者红外遥控方式进行设置,且当采集到的环境温度高于温度的设置高限值,蜂鸣器就会发出报警信号。设计出这样的系统同时也具有低功耗、节约能源等特点,也最大化的方便了用户使用。综上所述此系统主要包括单片机核心控制器、单片机电源电路、单片机晶振电路、单片机复位电路、单片机串口通信电路、DS18B20温度采集电路、红外收发控制部分、按键电路、蜂鸣器输出电路、LED数码管显示电路、电风扇电机驱动电路等。其基本系统框图如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsCFEF.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD000.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD001.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD002.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD003.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD004.tmp.png温 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD014.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD015.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD016.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD017.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD018.tmp.png
图2-1基本系统框图 2.2 系统实现的主要功能 (1)通过DS18B20温度传感器采集温度并在LED数码管上予以显示; (2)通过按键或者红外遥控器可以对温度上下限值进行设置; (3)亦可通过按键或者红外遥控器可以对系统工作模式进行选择; (4)通过蜂鸣器输出报警信号; (5)通过PWM信号对电风扇电机进行有效控制。 3 系统硬件设计 3.1 STC89C52单片机 STC89C52RC控制器是一个叫STC的公司制造的一种功耗低、性能好的CMOS8位微控制器, 8K字节的系统可以使用Flash存储器。STC89C52应用的是典型的MCS-51内核,不过通过了很多的改善让芯片拥有了传统51单片机没有的的功能和特性。单芯片上,拥有灵活的8 位数的CPU 和在系统可编程Flash,让STC89C52给很多的嵌入式控制系统给予了灵活程度高,效果好的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,总共有3个16 位数的定时器和计数器,一个7向量的4级中断结构(同时容纳典型51的5向量2级中断结构),还有4个外部中断,全双工串行口。同时 STC89C52 还可以降低到0Hz 的静态逻辑操作,有2种软件被支持可以选择的模式是节电的模式。在空闲的模式时,CPU 是不在运行的,不过RAM、定时器/计数器、串口、中断依然在运行。在选择掉电保护这种模式时,RAM内容被保存,振荡器被固定住了,单片机说有的运行被截止,一直到下一个中断或硬件层面的恢复。最高运作频率35MHz,6T/12T可选。 3.1.1 主要特效 (1)8K字节程序存储空间; (2)512字节数据存储空间; (3)内带4K字节EEPROM存储空间; (4)可直接使用串口下载。 PDIP封装,其封装图如下图所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD029.tmp.jpg 图 3-1STC89C52RC引脚图 3.2 STC89C52外围基本电路设计 3.2.1 电源电路 电源电路也就是给耗电器件提供电力的电源部分的电路设计,应用的的电路特点以及方式。经常碰到的电源电路有交流和直流电源电路等等。该STC89C52系列单片机电源采用直流5V供电,供电电源可采用USB供电或者外部电池盒供电,设计的电路如下图所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD02A.tmp.jpg 图3-2电源电路图 3.2.2 晶振电路 单片机的系统里晶振是不可或缺的,晶体震荡器是它的全称,晶振的作用在单片机里非常大,他通过与内部电路的配合,时钟频率在单片机系统里由此产生,在这个基础之上,单片机的所有指令得以运转,晶振的提供的时钟频率越高,要想单片机的运转速度快,那么晶振给予的时钟频率就有够高。 晶振通过一类晶体,这种晶体能使机械能和电能互相转化,并且在共振的状态下运行,由此保持稳定,精准的单频振荡。在一般的情况下,一般的晶振频率可以达到百分之五十的绝对精度。高级的精度更高。还有的晶振能通过外加电压调整频率,不过要在一定的范围内,名字就叫压控振荡器。 晶振的能力是给系统基础的时钟讯号。一个晶振一般情况下被一个系统共同使用,这样各部分的同步能有所保障。但是有的通讯系统的射频和基频是被不同的晶振提供的时钟信号的,电子调频是用来保持同步的方式。锁相环电路一般情况下与晶振结合应用,系统需要的时钟频率由此提供。要是差异的子系统要用到不同频率的时钟信号,能让与同一个晶振相配合的不同锁相环来供应。 本系统中晶振电路设计如下: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03B.tmp.jpg 图3-3晶振电路图 3.2.3 复位电路 复位电路,能让电路回到到一开始的情况。犹如计算器的清零功能,方便回归到起始状况,重新进行其他操作。但是与之不一样的是,复位电路开启的方式不太一样。一种是在电路一通电就立即复位;二是在必要时可以由手动操作;还有就是在系统需要的时候进行。大多数的复位电路一般较为容易,很多电阻电容相结合就能做到,复杂一点的能就是用程序和三极管以及其他的器件来运行。 为了能让微机系统的电路不乱可靠的运行,复位电路是必不可少的一方面,复位电路首先就是要能够上电复位。普通的微机电路在一般情况下运行用电电压是5V±5%,也就是4.75~5.25V。因为微机电路是一种时序电路,不乱的时钟信号是必不可少的,所有打开电源的时候,只能在VCC低于5.25V高于4.75V并且晶体振荡器也在正常运行的时候,微机电路才能正常运行,复位信号也撤销了。 当今,单片机的复位电路一般有四种: (1)微分型复位电路; (2)积分型复位电路; (3)比较器型复位电路; (4)看门狗型复位电路。 单片机系统的复位方式有:手动按钮复位和上电复位。 本系统设计的复位电路如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03C.tmp.jpg 图3-4复位电路图 3.2.4 串口下载回路 STC89C52系列单片机可以直接通过串口或者使用USB转TTL即可下载程序,优点是省去购买通用编程器,单片机在用户系统上就能下载或者烧录用户程序,并且还不要把单片机卸下来,直接就能把程序代码烧录进单片机里面。从 RxD/P3.0 检验到合理的下载指令流就下载用户程序,如果检验不到就自动复位到用户的程序区。设计的电路图如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03D.tmp.jpg 图3-5串口下载电路图 下载软件则使用宏晶公司研发的STC-ISP软件,软件截图如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03E.tmp.jpg 图3-7STC-ISP软件界面 3.2.5 LED数码显示电路 LED数码显示电路用来显示当前环境实时温度值,当进入设置界面时,则用来显示设置的温度高限值和低限值以及手动模式下的三档风速。该设计中的LED数码管显示电路使用的是4位8段共阳极数码管,各位数码管分别使用三极管9012进行信号放大,其中段选信号的A、B、C、D、E、F、G、DP分别使用P1.2、P1.0、P1.4、P1.6、P1.7、P1.1、P1.3、P1.5,位选信号分别使用P3.4、P3.5、P3.6、P3.7口。设计的电路图如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD04E.tmp.jpg 图3-8 LED数码管显示电路 3.2.6 蜂鸣器报警电路 蜂鸣器简单来说就是电子讯响器,结构是一体化的,供电方式是直流电压的供电方式,通常能在于各种生活中常见的电子物件中找到作发声器件比如电视机洗衣机等等。蜂鸣器有两种类型,电磁式蜂鸣器和压电式蜂鸣器。 本设计中采用有缘蜂鸣器,采用三极管9012进行驱动放大,供电电源为直流5V,其设计电路如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD04F.tmp.jpg 图3-9蜂鸣器报警电路图 3.2.7 按键电路 按键在我们的生活中也非常常见,是一种控制用的元件,一般都是用来通断‘控制电路’(一般电流都很小),然后使得电动机等等各种各样的设备根据人的命令运行的器件。可分为常开按键、常闭按键、常开常闭按键和动作点击按键等。按键这种器件在很多地方都能得到运用,比如车床的停机与起动、反转与正转等;塔吊的停止,启动,还有下降,上升,以及速度的各种控制等等时代的进步,社会的发展,创新水平的提升,按键一直都是大量产品的最基本人机接口工具,外形的也变的美观个性化。本设计中采用的4脚常开直径为6mm的按键,使用P2.0、P2.1、P2.2三个IO口,第一个按键用来切换模式,第二个按键和第三个按键用来设置温度上下限时增加或减少,其设计的电路图如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD050.tmp.jpg 图3-10按键电路图 3.2.8 DS18B20温度采集电路 DS18B20是普遍的温度传感器,小巧轻便,价格便宜,抗干扰能力极强,精度也很高!它的输入输出时序和测温方法和DS18B20差不多,不过由此得到的温度数值有几位会被分辨率影响,而且温度转变的时间也减小了很多。 DS18B20数字温度传感器在安装的时候也很容易,做好后能在很多地方用到,比如不锈钢封装式,磁铁吸附式等等等等型号很多,有LTM8874,LTM8877等。主要根据应用场合的不同而改变其外观。装好的DS18B20能被应用在高炉水循环测温,机房测温,锅炉测温,农业大棚测温,弹药库测温等各种各样的温度差异不是非常大的地方。小巧轻便,非常耐用,用起来也很容易,封装的方式也很多,适用于各种各样的非常复杂的场合的空间设备数字测温和控制场合。 DS18B20的控制方法如下所示: (1)温度转换 44H 启动DS18B20进行温度转换 (2)读暂存器 BEH 读暂存器9字节二进制数字 (3)写暂存器 4EH 将数据写入暂存器的TH、TL字节 (4)复制暂存器 48H 把暂存器的TH、TL字节写到E2PROM中 (5)重新调E2PROM B8H 把E2PROM中的TH、TL字节写到暂存器TH、TL字节 (6)读电源供电方式 B4H 启动DS18B20发送电源供电方式的信号给主CPU 设计的电路中使用P2.4口,电路设计如下: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD061.tmp.jpg 图3-11温度采集电路图 3.2.9 红外收发控制电路 红外线编码是传导信号还有日常使用的电器远程控制的典型的一种控制操作方法,它实际上就是一种脉宽调制的串行通讯。常用的家用远程控制一般用的红外编码电路是μPD6121G型7461型和HT622型。本设计就是通过这些电路相应的编码格式太探讨如何运用单片机来让它解码的,其中用到了单片机的捕获中断功能。 红外信号的发送方面大部分是通过让待发送的信号转变成一种脉冲,之后控制红外发光管发送信号。收到信号的方面就是实现红外的放大、接受然后解调,再变回同步发射格式相同(但高、低电位刚好相反的脉冲信号。这些操作一般都是通过接收头来实现,这种接收头是一体化的。一般放出TTL兼容电平。之后经由解码使脉冲信号变成数据,然后就使得数据的传送。如图所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD062.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD063.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD064.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD065.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD066.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD076.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD077.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD078.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD079.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07A.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07B.tmp.png
图3-12红外收发系统框图 本设计中使用的IO口为P3.2口,设计的电路如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07C.tmp.jpg 图3-13红外收发控制电路图 3.2.10 电风扇电极驱动电路 使用三极管9012进行信号放大,所用IO口P2.3用来输出PWM信号,根据信号最后控制电风扇完成各个档位风速的运行。设计的电路如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07D.tmp.jpg 图3-14电风扇电机驱动电路图 4 系统软件设计 4.1 软件程序设计概述 在单片机系统程序的设计开发中,单片机是整个系统的核心部分,各个部分模块化的程序就是整个系统的组成成份。软件编写的好不好,运用的语句有没有简单明了会影响单片机的运行效果。在每一个模块化的运行程序里面一定要用简洁少的语句做尽量多的任务,不要使语句表达出有问题的意思,如此这般就能让整个系统更好的运转,让单片机工作能力很大的提升。现在就对这次的毕业设计的软件方面作些阐述。 4.2 主流程图 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD08E.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD08F.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD090.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD091.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD092.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD093.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD094.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A5.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A6.tmp.png 是 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A7.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A8.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A9.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AA.tmp.png 是 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AB.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AC.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AD.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AE.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0BE.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0BF.tmp.png 是 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C0.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C1.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C2.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C3.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C4.tmp.png 图4-1主流程框图
4.3 DS18B20温度采集和设置流程图 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C5.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C6.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0D7.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0D8.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0D9.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DA.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DB.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DC.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DD.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DE.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DF.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0E0.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F1.tmp.png 异常 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F2.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F3.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F4.tmp.png 正常 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F5.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F6.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F7.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F8.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F9.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0FA.tmp.png
图4-2 DS18B20温度采集和设置流程图
4.4 电机驱动流程 逻辑判断十分简单,当前温度低于温度下限值时,风速停止运转;当前温度值处于温度低限值和温度高限值之间时,风扇低速运转;当前温度值高于温度高限值时,风速高速运转,其设计的电机驱动程序如下所示: void fengshan_kz() { if(temperature >= t_high) //风扇全开 { TR1 = 0; pwm = 0; } else if((temperature < t_high) && (temperature >= t_low)) //风扇缓慢 { f_pwm_l = 60; TR1 = 1; } else if(temperature < t_low) //关闭风扇 { TR1 = 0; pwm = 1; } } 5 系统的调试 电路板的焊接安装以及调试在整个硬件制作里面是非常重要的,其是从理论上向实际迈步的关键,也是把理论变为实际所必不可少的。对于初步的电路板的制作主要是两种方法:焊接或者面包板焊接。面包板焊接相对要更加的简易一些,方便替换一些器件,并且能多次使用。这次设计主要要用到的设备有:信号发生器、万用表、示波器等。 5.1 硬件调试 5.1.1 调试步骤 (1)不加电源的检查 首先对应电路图,电路的连线有没有错误的地方,有没有多余接线、错误接线、应该接却没有接线的情况等。用万用表检查接线的优良程度,各个器件的连接有没有问题。通过细心的检查,发现并且解决了很多的问题,避免了很多的麻烦。 (2)静态检测与调试 将信号源断开,把正确的电源接入电路,将万用表调到电压档,来监测电源电压,看是否有异常现象,如:手摸元器件发烫、异常气味、电源短路、冒烟等,如果发现有异常状况,应立即切断电源,然后排除故障。如果电路在测试后无上述异常情况,然后测量关键处的直流电压,如:放大电路输入、输出端直流电压、静态工作点等,看是否在正常工作状态下,如果有个别电路不符,经过调整电路元器件参数、更换元器件,使电路最终工作在合适的工作状态。 对于放大电路我们还用示波器观察是否有自激发生。结果一切正常。 (3)动态检测与调试 动态调试是在静态调试的基础上进行的,调试的方法地在电路的输入端加上所需的信号源,并循着信号的注射逐级检测各有关点的波形、参数和性能指标是满足设计要求,如必要,要对电路参数作进一步调整。发现问题,要设法找出原因,排除故障,继续进行。我们所设计的遥控器电路是采用码分制遥控方式,我们用示波器对发射电路输出端及接收电路输入端的信号波型的进行了检查,发现当按下不同的开关按钮时所显示的波型是不同的。这说明了此电路是工作在正常状态的。 5.2 系统的软件调试 在完成系统硬件的检查后主要是对软件进行调试,对遥控器的调试主要是用示波器观察能否在遥控接收器中输出相应的波形,调整发射电阻的大小可以改变红外线发射的作用距离。其性能指标调试后系统性能指标测试如下:最大遥控距离:10m 发射接收角:水平最大90度 硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。 5.3 实物功能分析 如图所示,按下电源键后,智能电风扇启动,如下图为初始化界面,数码管显示当前环境温度,且为自动调速模式。当温度低于最小值是风扇不转,当温度高于最小值且低于最大值时风扇低速转速运转,当温度高于最大值时高速运转。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10A.tmp.jpg 图5-1智能温控模式工作图 按下设置键,电风扇处于最大值的设定界面如图,此时可以用加减键设定最大温度设定值。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10B.tmp.jpg
图5-2最大温度值设置图 再次按下设置键,电风扇处于最小值的设定界面如图,此时可以用加减键设定最小温度设定值。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10C.tmp.jpg
5-3最小温度值设置图 再次按下设置键,电风扇切换为手动挡时,界面如下,此时可以通过加减键选择三个风速的档位。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD11D.tmp.jpg
图5-4手动挡工作图 以上所有的功能选择或设置都可以用按键或者红外遥控器完成。
结论
本文章主要设计了一种智能的红外线遥控电风扇,整个系统通过红外线接收发射模块、电机控制模块、温度检测模块、按键操作控制模块、还有液晶屏幕显示模块组成。整个电风扇系统是通过STC12系列单片机形成了用三个按键操控多种工作模式的切换以及风速的切换,三个按键分别为增加键,功能键和减小键,能够由需要配置电风扇的工作模式。而且,在设置的时候,在电风扇基础功能的前提下,还配置了声音提醒等功能。本文还描述了用红外线远程操控档位,如此这般就能够实现舒适地用遥控器来操控风扇的启动与停止了,操作使用非常方便。电风扇的操控是经由遥控器实现的,它的基础是红外线通信的原理,且风速的大小也是通过PWM信号来调节控制的。电风扇还有良好的显示界面,电风扇和人的交互方面也非常好。本设计通过对智能电风扇的简单的功能增加,例如风速自动控制等,让电风扇更加的齐全可靠,使用更加舒适。
参考文献
[1]陈静, 史雪飞. “模拟电子技术”课程中若干关键问题的探讨[J]. 电气电子教学学报,2014, 36(1):59-60. [2]张毅刚 王少军 付宁. 单片机原理及接口技术[M]. 人民邮电出版社, 2015. [3]波形发生器.历届全国大学生电子竞赛SPCE061A实现方案.北京北阳电子技术有限公司,2014 [4]吴凌鹂. 微机备用电源自动投入装置现场运行分析[J]. 中国电子商务,2014(22):269-270. [5] Vajpayee P. An ultra-high gain low power two stage CMOS op-amp based on inverse aspect ratio self cascode structures[J]. Analog Integrated Circuits & Signal Processing, 2014, 81(2):349-359. [6]Marchisio M A. In silico, design and in vivo, implementation of yeast gene Boolean gates[J]. Journal of Biological Engineering, 2014, 8(1):6-6. [7]刘慧勇 .杨虹,基于STM32的智能电风扇设计[M].2014 [8]佚名. 电子线路设计·实验·测试[M]. 电子工业出版社, 2014. [9]王爽.英飞凌XE166/XC2000单片机开发与应用实例[M].电子工业出版社,2014.6. [10]陆超逸 石杰元 基于MSP430和Android温控距控智能电风扇设计.电子世界.2016.10. [11]唐晓珊.管琼.李运彪.王欢 电风扇自动温控装置设计.电子设计工程.2016.12 [12]蒋小军.基于单片机的智能温控风扇.科技展望.2016.13 [13王文江.]基于物联网技术的教室智能用电系统设计与实现.中国科技信息.2016.2.
附录 附录1 系统总电路图: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD11E.tmp.jpg
附录2 完整的程序: #include <reg52.h> //调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
//数码管段选定义 0 1 2 3 4 5 6 7 8 9 uchar code smg_du[]={0x28,0xee,0x32,0xa7,0xe4,0xa1,0x51,0xea,0x80,0xa0, 0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码 //数码管位选定义 uchar code smg_we[]={0xef,0xdf,0xbf,0x7f}; uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8}; uchar smg_i = 3; //显示数码管的个位数 sbit dq = P2^4; //18b20 IO口的定义 sbit beep = P3^3;
bit flag_lj_en; //按键连加使能 bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了 uchar key_time,key_value; //用做连加的中间变量 bit key_500ms ; sbit pwm = P2^3; uchar f_pwm_l ; //越小越暗
uint temperature ; // bit flag_300ms ; uchar menu_1; //菜单设计的变量 uint t_high = 300,t_low = 100; //温度上下限报警值
//数码管位选定义 sbit smg_we1 = P3^7; //数码管位选定义 sbit smg_we2 = P3^6; sbit smg_we3 = P3^5; sbit smg_we4 = P3^4;
uchar danwei;
/***********************1ms延时函数*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i<q;i++) for(j=0;j<120;j++); }
/***********************小延时函数*****************************/ void delay_uint(uint q) { while(q--); }
/***********************数码位选函数*****************************/ void smg_we_switch(uchar i) { switch(i) { case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break; case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 0; break; case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break; case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break; } }
/***********100us的延时函数***12M晶振**************/ void delay_100us(uchar z) { //12M uchar x,y; for(x=0;x<z;x++) for(y=0;y<20;y++); }
uchar flag_moshi;
sbit hw_P32=P3^2; //红外遥控IO口的定义 bit flag_jiema_en = 0; //红外解码成功标志位 uchar hw_table[4]; //红外解码数据缓冲区
/***********************数码显示函数*****************************/ void display() { static uchar i; i++; if(i >= smg_i) i = 0; P1 = 0xff; //消隐 smg_we_switch(i); //位选 P1 = dis_smg; //段选
}
/***********************18b20初始化函数*****************************/ void init_18b20() { bit q; dq = 1; //把总线拿高 delay_uint(1); //15us dq = 0; //给复位脉冲 delay_uint(80); //750us dq = 1; //把总线拿高 等待 delay_uint(10); //110us q = dq; //读取18b20初始化信号 delay_uint(20); //200us dq = 1; //把总线拿高 释放总线 }
/*************写18b20内的数据***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 1; //释放总线 dat >>= 1; } }
/*************读取18b20内的数据***************/ uchar read_18b20() { uchar i,value; for(i=0;i<8;i++) { dq = 0; //把总线拿低读时间隙开始 value >>= 1; //读数据是低位开始 dq = 1; //释放总线 if(dq == 1) //开始读写数据 value |= 0x80; delay_uint(5); //60us 读一个时间隙最少要保持60us的时间 } return value; //返回数据 }
/*************读取温度的值 读出来的是小数***************/ uint read_temp() { uint value; uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令
low = read_18b20(); //读温度低字节 value = read_18b20(); //读温度高字节
value <<= 8; //把温度的高位左移8位 value |= low; //把读出的温度低位放到value的低八位中 value *= 0.625; //转换到温度值 小数 return value; //返回读出的温度 带小数 }
/*************定时器0初始化程序***************/ void time_init() { EA = 1; //开总中断 TMOD = 0X11; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时
ET1 = 1; //开定时器0中断 }
/********************独立按键程序*****************/ uchar key_can; //按键值
void key() //独立按键程序 { static uchar key_new; key_can = 20; //按键值还原 P2 |= 0x07; if((P2 & 0x07) != 0x07) //按键按下 { if(key_500ms == 1) //连加 { key_500ms = 0; key_new = 1; } delay_1ms(1); //按键消抖动 if(((P2 & 0x07) != 0x07) && (key_new == 1)) { //确认是按键按下 key_new = 0; switch(P2 & 0x07) { case 0x06: key_can = 1; break; //得到k2键值 case 0x05: key_can = 2; break; //得到k3键值 case 0x01: key_can = 3; break; //得到k4键值 } flag_lj_en = 1; //连加使能 } } else { if(key_new == 0) { key_new = 1; flag_lj_en = 0; //关闭连加使能 flag_lj_3_en = 0; //关闭3秒后使能 key_value = 0; //清零 key_500ms = 0; } } }
/****************按键处理数码管显示函数***************/ void key_with() {
if(key_can == 1) //设置键 { f_pwm_l = 30; menu_1 ++; flag_moshi = 0; //自动模式 if(menu_1 >= 4) { menu_1 = 0; smg_i = 3; //数码管显示3位 } } if(menu_1 == 1) //设置高温报警 { smg_i = 4; //数码管显示4位 if(key_can == 2) { if(flag_lj_3_en == 0) t_high ++ ; //按键按下未松开自动加三次 else t_high += 10; //按键按下未松开自动加三次之后每次自动加10 if(t_high > 990) t_high = 990; } if(key_can == 3) { if(flag_lj_3_en == 0) t_high -- ; //按键按下未松开自动减三次 else t_high -= 10; //按键按下未松开自动减三次之后每次自动减10 if(t_high <= t_low) t_high = t_low + 1; } dis_smg[0] = smg_du[t_high % 10]; //取小数显示 dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf; //取个位显示 dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示 dis_smg[3] = 0x64; //H } if(menu_1 == 2) //设置低温报警 { smg_i = 4; //数码管显示4位 if(key_can == 2) { if(flag_lj_3_en == 0) t_low ++ ; //按键按下未松开自动加三次 else t_low += 10; //按键按下未松开自动加三次之后每次自动加10 if(t_low >= t_high) t_low = t_high - 1; } if(key_can == 3) { if(flag_lj_3_en == 0) t_low -- ; //按键按下未松开自动减三次 else t_low -= 10; //按键按下未松开自动加三次之后每次自动加10 if(t_low <= 10) t_low = 10; } dis_smg[0] = smg_du[t_low % 10]; //取小数显示 dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf; //取个位显示 dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示 dis_smg[3] = 0x3D; //L } if(menu_1 == 3) { flag_moshi = 1; //手动模式 smg_i = 4; //数码管显示4位 if(key_can == 2) //加档 { danwei ++; if(danwei >= 4) danwei = 0; } if(key_can == 3) //减档 { if(danwei == 0) danwei = 4; danwei --; } if(danwei == 0) //风扇停止 { TR1 = 0; pwm = 1; } if(danwei == 1) //1档 { TR1 = 1; f_pwm_l = 69; } if(danwei == 2) //2档 { TR1 = 1; f_pwm_l = 30; } if(danwei == 3) //3档 { TR1 = 0; pwm = 0; }
dis_smg[0] = smg_du[temperature / 10 % 10]; //取小数显示 dis_smg[1] = smg_du[temperature / 100 % 10]; //取个位显示 dis_smg[2] = 0xf7; dis_smg[3] = smg_du[danwei]; } }
/****************风扇控制函数***************/ void fengshan_kz() { if(temperature >= t_high) //风扇全开 { TR1 = 0; pwm = 0; } else if((temperature < t_high) && (temperature >= t_low)) //风扇缓慢 { f_pwm_l = 60; TR1 = 1; } else if(temperature < t_low) //关闭风扇 { TR1 = 0; pwm = 1; } }
/***********外部中断0初始化程序****************/ void init_int0() //外部中断0初始化程序 { EX0=1; //允许外部中断0中断 EA=1; //开总中断 IT0 = 1; //外部中断0负跳变中断 }
/***********红外遥控程序**************/ void hongwai_dis() { if(flag_jiema_en == 1) { flag_jiema_en = 0; beep = 0 ; delay_1ms(100); beep = 1; if(hw_table[2] == 0x47) //设置键 { key_can = 1; } if(hw_table[2] == 0x40) //加键 { key_can = 2; } if(hw_table[2] == 0x19) //减键 { key_can = 3; } if(hw_table[2] == 0x16) //0档 { TR1 = 0; pwm = 1; danwei = 0; } if(hw_table[2] == 0x0c) //1档 { TR1 = 1; f_pwm_l = 69; danwei = 1; } if(hw_table[2] == 0x18) //2档 { TR1 = 1; f_pwm_l = 30; danwei = 2; } if(hw_table[2] == 0x5e) //3档 { TR1 = 0; pwm = 0; danwei = 3; }
hw_table[2] = 0; //把数据清零
} }
/****************主函数***************/ void main() { uchar value; time_init(); f_pwm_l = 50; init_int0(); //外部中断0初始化程序 while(1) { key(); //按键程序 hongwai_dis(); //红外遥控程序 if(key_can < 10) { key_with(); //设置报警温度 } if(flag_300ms == 1) //300ms 处理一次温度程序 { flag_300ms = 0; temperature = read_temp(); //先读出温度的值 if(temperature >= t_high) { value ++; if(value >= 2) beep = ~beep; //报警 } else { beep = 1; value = 0; } if(menu_1 == 0) { smg_i = 3; dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示 dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示 dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示 } if(menu_1 == 3) { dis_smg[0] = smg_du[temperature / 10 % 10]; //取小数显示 dis_smg[1] = smg_du[temperature / 100 % 10]; //取个位显示 dis_smg[2] = 0xf7; dis_smg[3] = smg_du[danwei]; } } if(flag_moshi == 0) fengshan_kz(); //风扇控制函数
} }
/*****************红外解码程序********************/ void int0() interrupt 0 { unsigned char i,j; delay_100us(40); //防止干扰 if(hw_P32 == 0) { //引导码9+4.5=13.5ms while(hw_P32 == 0); //等待9ms的低电平过完 delay_100us(27); //2.7ms if(hw_P32 == 1) //引码结束 { delay_100us(20); //2.7ms+2.0ms=4.7ms 说明4.5ms的高电平已经过完 引导码已经结束 for(i=0;i<4;i++) for(j=0;j<8;j++) { while(hw_P32 == 0); //等待过完0.56ms delay_100us(9); if(hw_P32 == 0) //数据0的时间=0.56+0.565=1.125ms { //数据1的时间=0.56+1.685=2.245ms hw_table >>= 1; //低位在前 } else { delay_100us(10); //0.9+1.0=1.9ms 延时让1.685高电平的时间过完 hw_table >>= 1; //低位在前 hw_table |= 0x80; //1.9ms过完后 数据线已经是低电平了 } } flag_jiema_en = 1; //红外解码成功 } } }
/*************定时器0中断服务程序***************/ void time0_int() interrupt 1 { static uchar value; //定时2ms中断一次 TH0 = 0xf8; TL0 = 0x30; //2ms display(); //数码管显示函数 value++; if(value >= 150) { value = 0; flag_300ms = 1; } if(flag_lj_en == 1) //按下按键使能 { key_time ++; if(key_time >= 250) //500ms { key_time = 0; key_500ms = 1; //500ms key_value ++; if(key_value > 3) { key_value = 10; flag_lj_3_en = 1; //3次后1.5秒连加大些 } } } }
/*******************定时器1用做单片机模拟PWM 调节***********************/ void Timer1() interrupt 3 //调用定时器1 { static uchar value_l; TH1=0xbe; // 定时10ms中断一次 TL1=0x0c; //500us if(pwm==1) { value_l+=1; if(value_l > f_pwm_l) //高电平 { value_l=0; if(f_pwm_l != 0) pwm=0; } } else { value_l+=1; if(value_l > 100 - f_pwm_l) { value_l=0; pwm=1; } } }
致谢
在写作本毕业设计的期间,遇到了非常多的没有预料到的各种问题,不过在邹国柱老师的不厌其烦的指导和监督下,并且经由我个人的勤奋努力下,做出了这篇毕业设计。这篇论文的完成不仅仅是我自己个人的,还有很多帮助我的人,我要感谢他们。假如得不到指导老师的指引,假如得不到父母和同学们的解惑和提示,这篇毕业设计根本没有办法做出来。我要对我的指导老师师致深深的鞠躬,感谢老师在这段时间的帮助和引领!由于这次毕业设计,我使用和学习了非常多的知识和工具,而且经过查看一定的资料文献,学到了大量的课本上不能得到的的知识和能力,从里面取得了很大的收获。还要感谢的就是我即将要离开的母校,就是因为有了母校给我提供的条件和环境,我才会有机会锻炼和展示的平台;最后要感谢的就是身边的同学们,是你们在我遇到问题百思不得其解的时候在我身边帮助我一起攻克难题。
|