基于单片机的智能遥控感应风扇设计

时间:2020-09-01 20:08:53 浏览量:

基于单片机的智能遥控感应风扇设计 摘 要 本设计为一种智能温控和湿控风扇系统,具有灵敏的温度感测、湿度感测和显示功能,系统STC89C52单片机作为控制平台对风扇转速进行控制。可由用户设置高、低温度值,测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度时自动关闭风扇,控制状态随外界温度而定。所设高低温值保存在温度传感器DS18B20内部E2ROM中,掉电后仍然能保存上次设定值,性能稳定,控制准确。通过温湿度传感器DHT11监测温度,当湿度超过所设定的高湿度值时自动打开加热片去湿,当湿度小于所设定的低湿度值时自动打开水泵加湿。

关键词:STC89C51单片机;STC89C52单片机;
温湿度传感器;
智能控制。

Abstract This design is an intelligent temperature control and humidity control fan system, with sensitive temperature sensing, humidity sensing and display functions, the system STC89C52 microcontroller as a control platform to control the fan speed. High and low temperature values can be set by the user. When the measured temperature value is between high and low temperature, the weak wind shield of the fan will be opened. When the temperature rises beyond the set temperature, the fan will be automatically switched to the high wind shield. The set high and low temperature value is saved in the internal E2ROM of the temperature sensor DS18B20 . After power off, the last set value can still be saved with stable performance and accurate control. The temperature is monitored through the temperature and humidity sensor DHT11. When the humidity exceeds the set high humidity value, the heating element is automatically opened to dehumidify; when the humidity is less than the set low humidity value, the water pump is automatically opened to humidify. Key words: STC89C51 single-chip microcomputer; STC89C52 single chip microcomputer; Temperature and humidity sensor; Intelligent control. 目 录 摘要 I Abstract II 第1章 绪 论 1 第1节 智能遥控感应风扇的背景 1 第2节 智能遥控感应风扇的内容 1 第3节 智能遥控感应风扇的创新点 2 第2章 智能遥控感应风扇设计过程 3 第1节 风扇硬件设计 5 第2节 风扇软件设计 9 第3章 智能遥控感应风扇的功能与测试结果 14 第1节 智能遥控感应风扇的功能 14 第2节 智能遥控感应风扇功能测试结果 15 结 论 18 参考文献 19 致 谢 20 附 录 21 第一章 绪论 第1节 智能遥控感应风扇的背景    近年来,虽然空调以其强大的制冷效果赶超过电风扇,但随着绿色生活,低碳生活意识的普及,空调的高耗电量、加剧温室效应、破坏臭氧层等弊端,使得低功耗低污染的电风扇仍有很大市场需求。传统电风扇采用机械方式进行控制,大部分只有手动调速,功能单一,存在隐患或不足。使用电风扇作为降温防暑设备,春夏(夏秋)交替时节,白天温度依旧很高,电风扇应高转速、大风量,使人感到清凉;到了晚上,气温降低,当人入睡后,应该逐步减小转速,以免使人感冒。虽然风扇都有调节不同档位的功能,但必须要人手动换档,睡着了就无能为力了,而普遍采用的定时器关闭的做法,一.方面是定时时间长短有限制,一般是一-两个小时;另一方面可能在一-两个小时后气温依旧没有降低很多,而风扇就关闭了,使人在睡梦中热醒而不得不起床重新打开风扇,增加,定时器时间,非常麻烦,而且可能多次定时后最后一次定时时间太长,在温度降低以后风扇依旧继续吹风,使人感冒;第三方面是只有简单的到了定时时间就关闭风扇电源的单-一功能,不能满足气温变化对风扇风速大小的不同要求。又比如在较大功率的电子产品散热方面,现在绝大多数都采用了风冷系统,利用风扇引起空气流动,带走热量,使电子产品不至于发热烧坏。要使电子产品保持较低的温度,必须用大功率、高转速、大风量的风扇,而风扇的噪音与其功率成正比。如果要低噪音,则要减小风扇转速,又会引起电子设备温度上升,不能两全其美。为解决上述问题,我们设计了这套温控自动风扇系统。

本系统采用高精度集成温湿度传感器,用单片机控制,能显示实时温度,并根据使用者设定的温度自动在相应温度时作出小风、大风、停机动作,精确度高,动作准确。它的广泛应用和普及将给人们的日常生活带来极大的方便,其发展趋势可根据其性质进行相应的改进可以运用与不同场合的温度监测控制,并带来大量的经济效益。

第2节 智能遥控感应风扇完成的内容 本文以STC89C52单片机为核心,通过数字温度传感器对外界环境温度进行数据采集,从而建立一个控制系统,使电风扇随温度的变化而自动调节档位,实现“温度高、风力大、温度低、风力弱”的性能。另外,通过红外发射和接收装置及按键实现各种功能的启动与关闭,并且可对各种功能实现遥控,用户可以在一定范围内设置电风扇的最低工作温度,当温度低于所设置温度时,电风扇将自动关闭,当高于此温度时电风扇又将重新启动。通过DHT11温湿度传感器检测湿度,当湿度超过所设定的最大湿度值时自动打开水泵(加湿),当温度小于所设定的最小湿度值时自动打开加热片(去湿),控制状态随外界湿度而定。

本设计主要内容如下:
(1)风速设为从低到高共2个档位,可由用户通过键盘设定。

(2)每当温度低于下限值时,则电风扇风速关闭。

(3)每当温度在下限和上限之间时,则电风扇转速缓慢。

(4)每当温度高于上限值时,则电风扇风速全速运转。

(5)每当室内湿度高于上限值时,则电风扇运转去湿。

(6)每当室内湿度低于下限值时,则电风扇运转加湿。

第3节 智能遥控感应风扇的创新点 此次智能遥控感应风扇设计的优点,主要由18B20温度传感器、红外接收、LCD1602显示系统、STC89C52单片机和独立式按键等组成。主要创新点如下所示:
1. 风扇可监测室内的湿度并具有去湿和加湿功能;

2. 使用者可以通过红外遥控设置温度上、下限;

3. 采用PWM调速原理实现风扇速度的控制;

4. 温度精确到小数点显示,并可以通过LCD1602显示出来。

第2章 智能遥控感应风扇设计过程 第一节 风扇硬件设计 1.1 STC89C52单片机简介 STC89C52是美国ATMEL公司生产的低电压、高性能CMOS8位单片机,片内4bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置用8位中央处理器(CPU)和Flash存储单元,功能强大。STC89C52单片机可灵活应用于各种控制领域。

STC89C52单片机提供以下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时、计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,STC89C52单片机可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时、计数器,串行通行口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

1.2 DS18B20温度传感器简介 DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(2)在使用中不需要任何外围元件。

(3)可用数据线供电,电压范围:+3.0~ +5.5 V。

(4)测温范围:-55 ~+125 ℃。固有测温分辨率为0.5 ℃。

(5)通过编程可实现9~12位的数字读数方式。

(6)用户可自设定非易失性的报警上下限值。

(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。

(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

单线(1—wire)技术:
该技术采用单根信号线,既可传输时钟,也能传输数据,而且是双向传输。适用于单主机系统,主机能够控制一个或多个从机设备,通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能释放该线,而让其他设备使用。单线通常要求外接一个5K的上拉电阻,这样当该线空闲时,其状态为高电平。

主机和从机之间的通讯分成三个步骤:初始化单线器件、识别单线器件和单线数据传输。

单线1—wire协议由复位脉冲、应答脉冲、写0、写1、读0、读1,这几种信号类型实现,这些信号中除了应答脉冲其他都由主机发起,并且所有指令和数据字节都是低位在前。

温度值/℃ 数字输出(二进制) 数字输出(十六进制) +125 0000 0111 1101 0000 07D0H +85 0000 0101 0101 0000 0550H +25.625 0000 0001 1001 0001 0191H +10.125 0000 0000 1010 0010 00A2H +0.5 0000 0000 0000 1000 0008H 0 0000 0000 0000 0000 0000H -0.5 1111 1111 1111 1000 FFF8H -10.125 1111 1111 0110 1110 FF5EH -25.625 1111 1111 0110 1111 FF6FH -55 1111 1100 1001 0000 FC90H DS18B20直接将测量温度值转化为数字量提交给单片机,工作时必须严格遵守单总线器件的工作时序。

表2-1 部分温度值与DS18B20输出的数字量对照表 1.3 DHT11数字温湿度传感器介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有 品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。

1.4 系统总体设计 键盘输入 温湿度显示 单片机系统 电机控制模块 温湿度传感模块 图2-1 系统总体结构框图 1.5 控制装置设计原理 传统电风扇供电采用的是220V交流电,电机转速分为几个档位,通过人工手动调整电机转速达到改变风速的目的,亦即,每改变一次风力,必然有人参与操作,功能单一,这样就会带来诸多不便。

本设计一种基于单片机的智能电风扇调速器的设计,该设计巧妙利用红外线遥控技术、单片机控制技术、无级调速技术和温度传感技术,把智能控制技术应用于家用电器的控制中,将电风扇的电机转速作为被控制量,由单片机分析采集到的数字温度信号,再通过可控硅对风扇电机进行调速。从而达到无须人为控制便可自动调整风扇速度和控制温湿度的效果。

1.6 温湿度传感器和显示电路组成 本模块用更为优秀的DS18B20温度传感器和DHT11温湿度传感器,STC89C52单片机作为处理器,配以温度显示作为温度控制输出单元。整个系统力求结构简单,功能完善。电路图如图1-2所示。

系统工作原理如下:
DS18B20数字温度传感器采集现场温度,将测量到的数据送入STC89C52单片机的P2.4口,经过单片机处理后显示当前温度值,并与设定温度值的上下限值作比较,若高于设定上限值或低于设定下限值则控制电机转速进行自动调整。

DHT11温湿度传感器检测湿度,当湿度超过所设定的最大湿度值时自动打开水泵(加湿),当温度小于所设定的最小湿度值时自动打开加热片(去湿),控制状态随外界湿度而定。

图2-2 DS18B20温湿度原理图 图2-3 LCD1602原理图 1.7 电机调速电路 电机调速是整个控制装置中的一个相当重要的方面。通过控制改变三极翻出的导,使输出端电压发生改变,从而使施加在电风扇的输入电压发生改变,以调节风扇的转速,实现各档位风速的无级调速。

双向可控硅的导通条件如下:
(1)阳-阴极间加正向电压;

(2)控制极-阴极间加正向触发电压;

(3)阳极电流IA 大于可控硅的最小维持电流IH。

电风扇的风速从高到低设为5、4、3、2、1档,每档风速都有一个限定值。在额定电压、额定功率下,以最高转速运转时,要求风叶最大圆周上的线速度不大于2150m/min。且线速度可由下列公式求得 V=πDn×103 (1) 式(1)中,V为扇叶最大圆周上的线速度(m/min),D为扇中的最大顶端扫出圆的直径(mm),n为电风扇的最高转速(r/min)。

代入数据求得n5≤1555r/min,取n5=1250 r/min.又因为:
取n1=875r/min。则可得出五个档位的转速值:
n1=875r/min,n2=980r/min,n3=1063r/min,n4=1150 r/min,n5=1250r/min 又由于负载上电压的有效值 u0=u1 (2) 式(2)中,u1为输入交流电压的有效值,α为控制角。解得:
(1) 当α5=0°时,t=0ms;

(2) 当α4=23.5°时,t=1.70ms;

(3) 当α3=46.5°时,t=2.58ms;

(4) 当α2=61.5°时,t=3.43ms;

(5) 当α1=76.5°时,t=4.30ms。

上述计算出的是控制角和触发时间,当检测到过零点时,按照所求得的触发时间延时发脉冲,便可实现预期转速。

本模块电路中采用了过零双向可控硅型光耦MOC3041M ,集光电隔离、过零检测、过零触发等功能于一身,避免了输入输出通道同时控制双向可控硅触发的缺陷, 简化了输出通道隔离2驱动电路的结构。所设计的可控硅触发电路原理图见图1-3。其中RL即为电机负载,其工作原理是:单片机响应用户的参数设置, 在I/ O 口输出一个高电平, 经反向器反向后, 送出一个低电平,使光电耦合器导通, 同时触发双向可控硅, 使工作电路导通工作。给定时间内,负载得到的功率为: (3) 式中: P 为负载得到的功率( kW); n 为给定时间内可控硅导通的正弦波个数; N 为给定时间内交流正弦波的总个数; U为可控硅在一个电源周期全导通时所对应的电压有效值(V); I 为可控硅在一个电源周期全导通时所对应的电流有效值(A)。由式(3) 可知,当U , I , N 为定值时, 只要改变n 值的大小即可控制功率的输出,从而达到调节电机的目的。

图2-4 电机控制原理图 1.8 红外遥控 红外遥控是单工的红外通信方式,本设计的红外遥控采用以通信方式为基础的红外遥控,而且本设计也使用了红外通信技术,故着重分析红外通信的基本原理。

红外通信是利用红外技术实现两点间的近距离保密通信和信息转发。它一般由红外发射和接收系统两部分组成。发射系统对一个红外辐射源进行调制后发射红外信号,而接收系统用光学装置和红外探测器进行接收,就构成红外通信系统。

红外线是波长在750nm至1mm之间的电磁波,它的频率高于微波而低于可见光,是一种人眼看不到的光线。红外通信一般采用红外波段内的近红外线,波长在0.75um至25um之间。红外数据协会(IRDA)成立后,为了保证不同厂商的红外产品能够获得最佳的通信效果,红外通信协议将红外数据通信所采用的光波波长的范围限定在850至900nm之内。

红外通信的基本原理是发送端将基带二进制信号调制为一系列的脉冲串信号(载 波信号),通过红外发射管发射红外信号。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。脉时调制(PPM)是红外数据协会(IRDA)和国际电子电工委员会(IEEE)都推荐的调制方式,本设计采用脉时调制方法,即用两个脉冲串之间的时间间隔来表示二进制信息,数据比特的传送仿照不带奇偶校验的RS232通信,首先产生一个同步头,然后接着8位数据比特,如图1-4所示。

---------------- 图2-5 PPM调制波形图 ----------------- ------ ------- t1 t1 t2 t3 二进制0 二进制1 ---------------- 载波信号的频率ƒ=38kHz,载波周期T=26.32us 载波信号的频率ƒ=38kHz,载波周期T=26.32us,本设计使用单片机软件产生载波,取T=26us,脉冲宽度t1=10T=260us,二进制数0的脉冲串周期t2=500us,二进制数1的脉冲串周期t3=1000us。

普通的红外遥控采用面向指令的帧结构,数据帧由同步码,地址码和指令码组成,指令码长度多为8~16个比特,传送多字节遥控协议时效率偏低,而增加指令码的长度不利于接收器同步,为此本设计选用一种面向字节的帧结构,采用类似于异步串行通信的帧结构,每帧由一个起始位(二进制数0)、8个数据位和2个停止位(二进制数1)构成,如图1-5所示。每帧传送1个字节的数据,帧与帧间隔大于2ms,帧结构不含图2-6 数据帧结构示意图 …… 数据帖 停止位 数据位(8位) 帖间隔 起始位 停止位 地址信息,寻址问题由高层协议解决。

由于红外光存在反射,因此,红外通信应采用异步半双在全双工的方式下发送的信号也可能会被本身接收工方式,即通信的某一方发送和接收是交替进行的。

第二节 风扇软件设计 2.1 控制器软件控制 本系统的运行程序采用C语言编写,采用模块化设计,整体程序由主程序和显示、键盘扫描、红外线接收以及电机控制等子程序模块组成。

2.2 主程序 在主程序进行初始化后,开始反复检测各模块相关部分的缓冲区的标志,如果缓冲区置位,说明相应的数据需要处理,然后主程序调用相应的处理子模块。如图2-7所示。

系统初始化 温湿度变化? 温湿度控制子模块 键盘输入? 键盘处理子模块 开始 红外信号? 红外接收处理模块 Y N Y N Y N 显示子模块 图2-7 主程序模块流程图 2.3 数字温度传感器模块和显示子模块 开始 DS18B20初始化 启动DS18B20测温 内部判断 调用读子程序 显示子程序 结束 调用相应的控制程序 调用相应的键值处理程序 调用写子程序 异常 正常 如图2-8所示,主机控制DS18B20数字温度传感器完成温度转换工作必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。单片机所用的系统频率为12MHz。

根据DS18B20数字温度传感器进行初始化时序、读时序和写时序分别可编写3个子程序:初始化子程序、写子程序、读子程序。

图2-8 数字温度传感器模块程序流程图 DS18B20芯片功能命令表如下:
命令 说明 协议 READ ROM 读取激光ROM64位 33H MATCH ROM 匹配ROM 55H SKIP ROM 跳过ROM CCH SEARCH ROM 搜索ROM F0H ALARM SEARCH 告警搜索 ECH WRITE SCRATCHPAD 把字节写入暂存器的地址2和3 4EH READ SCRATCHPAD 读取暂存器和CRC字节 BEH COPY SCRATCHPAD 把暂存器内容拷贝到非易失性存储器中 48H CONVERT T 开始温度转换 44H RECALL E2 把非易失性存储器中的值召回暂存器 B8H READ POWER SUPPLY 读电源供电方式:0为寄生电源,1为外电源 B4H 表2-2 DS18B20功能命令表 2.4 电机调速与控制子模块 本模块采用双向可控硅过零触发方式,由单片机控制双向可控硅的通断,通过改变每个控制周期内可控硅导通和关断交流完整全波信号的个数来调节负载功率,进而达到调速的目的。

因为INT0信号反映工频电压过零时刻,所以只要在外中断0的中断服务程序中完成控制门的开启与关闭,并利用中断服务次数对控制量n进行计数和判断,即每中断一次,对n进行减1计数,如果n不等于0,保持控制电平为“1”,继续打开控制门;
如n=0,则使控制电平复位为“0”,关闭控制门,使可控硅过零触发脉冲不再通过。这样就可以按照控制处理得到的控制量的要求,实现可控硅的过零控制,从而达到按控制量控制的效果,实现速度可调。

(1)中断服务程序:执行中断服务程序时,首先保护现场,INT0中断标志置位,禁止主程序修改工作参数,然后开始减1计数,判断是否关断可控硅,最后INT0中断标志位清零,还原初始化数据,恢复现场,中断返回。(设1秒钟通过波形数N=100) EX0中断 温度大于等于下限值并且小于上限值 控制可控硅 截止 中断返回 设置T0参数 启动定时 T0中断 控制可控硅导通 停止T0定时 中断返回 b (2)回路控制执行程序:主回路控制执行程序的任务是初始化数据存储单元,确定电机工作参数nmin/nmax,并将其换算成“有效过零脉冲”的个数;
确定中断优先级、开中断,为了保证正弦波的完整,工频过零同步中断INT0确定为高一级的中断源a 。

图2-9电机控制模块中断响应流程图 第3章 智能遥控感应风扇功能与测试结果 第1节 智能遥控感应风扇实现功能 以STC89C52单片机为核心,通过数字温度传感器对外界环境温湿度进行数据采集,LCD1602液晶显示,从而建立一个控制系统,使电风扇随温度的变化而自动调节档位,采用PWM调速原理实现“温度高、风力大、温度低、风力弱”的性能。当人体感应传感器感应到人液晶会显示“Y”没有感应到人会显示“N”,具有智能延时关闭风扇的功能,当没有感应到人,延时30秒系统会自动关闭风扇。另外,通过红外发射和接收装置及按键实现各种功能的启动与关闭,并且可对各种功能实现遥控,用户可以在一定范围内设置电风扇的最低工作温度,当温度低于所设置温度时,电风扇将自动关闭,当高于此温度时电风扇又将重新启动。通过DHT11温湿度传感器检测湿度,当湿度超过所设定的最大湿度值时自动打开水泵(加湿),当温度小于所设定的最小湿度值时自动打开加热片(去湿),控制状态随外界湿度而定。

第2节 智能遥控感应风扇功能测试结果 在完成焊接以及实物调试后,根据实物要达到具体的设计要求功能,进行不断的修和调试。电源接通时,先测试显示装置是否显示正常的数字,然后通过测试查看无问题出现,运行效果如图。

结论 本设计主要完成了如下工作: 本系统以STC89C52单片机为核心,单片机主要完成对外界环境温湿度信号的采集、处理、显示等功能。

运行程序该系统的主要特点是: (1)适用性强,用户只需对界面参数进行设置并启动系统正常运行便可满足不同用户对最适合温湿度的要求,实现对最适温湿度的实时监控。

(2)随时可以根据软件编写新的功能加入产品。操作界面可扩展性强,只要稍加改变,即可增加其他按键的使用功能。

本系统温度控制采用DS18B20数字温度传感器作为感温元件。可控硅串接在电源与负载电风扇,借改变定周期内可控硅的导通与截止时间之比来实现调速功能,其设计完使用方便就,适应人们睡办公等不同场合的使用。

基于STC89C52单片机所设计与研制的电风扇智能调速系统,造价低且具有稳定性高、性能优越、节约电能等优点,在夜间无需定时,同样能给人们带来更多的方便。

本设计在模拟检测中运行较好,但采样据不太稳定。功能上的缺憾是对于两个档之间的临界温度处理不好,并且档位太少,还有待改进。

在本课题的研究过程中,对单片机和传感器有了一定的了解,对设计智能电风扇有了一个总体的设计思路。其中有很多芯片是我们所没有学过的,但是通过设计中的学习,我查阅了大量的资料,尤其是到图书馆去询问老师,通过在校园网的网站查到了许多对我有很大帮助的资料,并且和同学们一起讨论,使我对这些芯片有了很深刻的了解,并学会将其运用在具体的实践当中。但是在很都方面还有待于进一一步的改进和完善。在以后的工作与学习中,需要更加努力的学习理论知识,在本身掌握知识的基础上还要看大量的书籍,还有要提高实践能力,才能对这些专业的知识做进一步的学习和研究。

a 参考文献 [1] 曹巧媛.单片机原理及应用.北京:电子工业出版社,2002.2 [2] 王伦.电风扇原理与维修技术[M].北京:新时代出版社,1999 [3] 张毅刚.新编MCS-51单片机应用设计.哈尔滨工业大学出版社,2006,10 [4] 梁廷贵、王裕琛.可控硅触发电路语音电路分册[M].北京:科学技术文献出版社,2003 [5]陈杰,黄鸿等.传感器与检测技术.北京:高等教育出版社,2002. 8 ~25 [6]张肇富.采用温度传感器的电扇.江苏电器,1994, 2 [7]胡乾斌.单片微型计算机原理与应用,武汉:华中理工大学出版社,1997 [8]陈丽芳.单片机原理与控制技术.南京:东南大学出版社,2003 [9]刘迎春,叶湘滨.传感器原理设计与应用.长沙:国防科技大学出版社,2002 [10]何立民.单片机应用技术选编.北京:北京航空航天的学出版社,2004 [11]李昔华.王延川电风扇智能控制模块的设计.渝州大学学报(自然科学版),2000 致谢 在设计完成之际,我首先要向我教我的毕业论文指导老师付兴烨老师表示最真挚的谢意。是他将扎实的理论知识传授与我,如果没有他的谆谆教海就没有我这篇论文的设计思路。在论文写作期间,付兴烨老师给了我很多指导和帮助,给我提了很多中肯的意见,并在我多次的修改期给我很多激励,让我有勇气克服了心理的压力,很好的完成了论文的文稿,虽然的写作的过程中,我遇到了很多的麻烦,但是付老师都不厌其烦的帮我修改,提出了很多的建议,在这里我要忠诚的感谢他; 毕业设计是对我大学四年学习内容的总结,我感到自己所学的知识远远不够,还需要在以后的工作和生活中进行学习和提高。在设计中我将自己所学的知识运用到实际中,使我了解到理论和实践的差距,在今后的工作中将弥补这种差距。

在此次设计中由于时间关系,论文基本就已经完成了,但是由于本人学识有限,以及现有知识的有限加之时间仓促,文中不免有错误和待改进之处,真诚欢迎各位老师,同学提出宝贵意见。

附 录 原理图 数字温度传感器模块和显示子模块程序: #include <reg52.h> //调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 #include <intrins.h> sbit dq = P1^5; //18b20 IO口的定义 sbit hw = P1^3; bit flag_lj_en; //按键连加使能 bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了 uchar key_time,key_value; //用做连加的中间变量 bit key_500ms ; uint temperature ; // bit flag_200ms ; uchar miao = 30; uchar flag_en; uchar code table_num[]=“0123456789abcdefg“; sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit e =P1^2; //片选信号 下降沿触发 sbit pwm = P1^4; uchar f_pwm_l ; //越小越慢 uchar menu_1; //菜单设计的变量 uint t_high = 300,t_low = 100; /***********100us的延时函数***12M晶振**************/ void delay_100us(uchar z) { //12M uchar x,y; for(x=0;x<z;x++) for(y=0;y<20;y++); } sbit hw_P32=P3^2; //红外遥控IO口的定义 bit flag_jiema_en = 0; //红外解码成功标志位 uchar hw_table[4]; //红外解码数据缓冲区 /***********************1ms延时函数*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i<q;i++) for(j=0;j<110;j++); } /******************************************************************** * 名称 : delay_uint() * 功能 : 小延时。

* 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay_uint(uint q) { while(q--); } /******************************************************************** * 名称 : write_com(uchar com) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void write_com(uchar com) { e=0; rs=0; rw=0; P0=com; delay_uint(25); e=1; delay_uint(100); e=0; } /******************************************************************** * 名称 : write_data(uchar dat) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void write_data(uchar dat) { e=0; rs=1; rw=0; P0=dat; delay_uint(25); e=1; delay_uint(100); e=0; } /******************************************************************** * 名称 : write_string(uchar hang,uchar add,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示“ab cd ef“ ,调用该函数如下 write_string(1,5,“ab cd ef;“) * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void write_string(uchar hang,uchar add,uchar *p) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p == '\0') break; write_data(*p); p++; } } /***********************lcd1602上显示特定的字符************************/ void write_zifu(uchar hang,uchar add,uchar date) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(date); } /***********************lcd1602上显示两位十进制数************************/ void write_sfm3_18B20(uchar hang,uchar add,uint date) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/100%10); write_data(0x30+date/10%10); write_data('.'); write_data(0x30+date%10); } /***********************lcd1602上显示两位十进制数************************/ void write_sfm2(uchar hang,uchar add,uint date) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/10%10); write_data(0x30+date%10); } /***********************lcd1602初始化设置************************/ void init_1602() { write_com(0x38); // write_com(0x0c); write_com(0x06); delay_uint(1000); write_string(1,0,“ temp: . “); write_string(2,0,“H: . L: . “); write_zifu(1,12,0xdf); //显示度 write_zifu(2,6, 0xdf); //显示度 write_zifu(2,14,0xdf); //显示度 } /***********************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中断 TR1 = 0; //允许定时器0定时 } /********************独立按键程序*****************/ uchar key_can; //按键值 void key() //独立按键程序 { static uchar key_new; key_can = 20; //按键值还原 P3 |= 0xf0; if(key_500ms == 1) //连加 { key_500ms = 0; key_new = 1; } if((P3 & 0xf0) != 0xf0) //按键按下 { delay_1ms(1); //按键消抖动 if(((P3 & 0xf0) != 0xf0) && (key_new == 1)) { //确认是按键按下 key_new = 0; switch(P3 & 0xf0) { case 0xc0: key_can = 1; break; //得到k1键值 case 0xa0: key_can = 2; break; //得到K2键值 case 0x80: key_can = 3; break; //得到k3键值 } } } else { if(key_new == 0) { key_new = 1; flag_lj_en = 0; //关闭连加使能 flag_lj_3_en = 0; //关闭3秒后使能 key_value = 0; //清零 key_time = 0; } } } /****************按键显示函数***************/ void key_with() { if(key_can == 1) //设置键 { menu_1 ++; if(menu_1 >= 3) { menu_1 = 0; } if(menu_1 == 0) { write_com(0x0c); //关闭光标 } } if(menu_1 == 1) //设置高温 { 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; } write_sfm3_18B20(2,2,t_high); write_com(0x80+0x40+2); //将光标移动到秒个位 write_com(0x0f); //显示光标并且闪烁 } if(menu_1 == 2) //设置低温 { 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; } write_sfm3_18B20(2,10,t_low); write_com(0x80+0x40+10); //将光标移动到秒个位 write_com(0x0f); //显示光标并且闪烁 } } /****************风扇控制函数***************/ void fengshan_kz() { if(flag_en == 1) { if(temperature >= t_high) //风扇全开 { TR1 = 1; pwm = 0; } else if((temperature < t_high) && (temperature >= t_low)) //风扇缓慢 { f_pwm_l = 65; TR1 = 1; } else if(temperature < t_low) //关闭风扇 { TR1 = 0; pwm = 1; } }else //关闭风扇 { 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; if(hw_table[2] == 0x09) //设置键 { key_can = 1; } if(hw_table[2] == 0x15) //加键 { key_can = 2; } if(hw_table[2] == 0x07) //减键 { key_can = 3; } hw_table[2] = 0; //把数据清零 } } /****************主函数***************/ void main() { static uchar value; init_1602(); //1602初始化 time_init(); //初始化定时器 init_int0() ; //外部中断0初始化程序 while(1) { if(flag_200ms == 1) //300ms 处理一次温度程序 { flag_200ms = 0; value ++; if(value >= 4) { value = 0; if(miao != 0) { miao --; //时间减1 } if(miao == 0) flag_en = 0; } if(hw == 1) //感应到人 { miao = 30; write_string(1,14,“Y “); flag_en = 1; } else write_string(1,14,“N “); write_sfm2(1,0,miao); temperature = read_temp(); //先读出温度的值 fengshan_kz(); //风扇控制函数 write_sfm3_18B20(1,8,temperature); } key(); //按键程序 hongwai_dis(); //红外遥控程序 if(key_can < 10) { key_with(); //设置报警温度 } } } /**********************红外解码中断程序***********************/ void int0() interrupt 0 { unsigned char i,j; delay_100us(20); //防止干扰 if(hw_P32 == 0) { //引导码 while(hw_P32 == 0); //等待低电平过完 delay_100us(20); if(hw_P32 == 1) //引码结束 { delay_100us(20); // 说明高电平已经过完 引导码已经结束 for(i=0;i<4;i++) for(j=0;j<8;j++) { while(hw_P32 == 0); //等待过完 delay_100us(5); if(hw_P32 == 0) //数据0的时间 { //数据1的时间 hw_table[i] >>= 1; //低位在前 } else { delay_100us(5); // 高电平的时间过完 hw_table[i] >>= 1; //低位在前 hw_table[i] |= 0x80; //数据值1 } } flag_jiema_en = 1; //红外解码成功 } } } /*************定时器0中断服务程序***************/ void time0_int() interrupt 1 { static uchar value; TH0 = 0x3c; TL0 = 0xb0; // 50ms value ++; if(value % 4 == 0) { flag_200ms = 1; //300ms value = 0; } if(flag_lj_en == 1) //按下按键使能 { key_time ++; if(key_time >= 10) //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=0xfe; // TL1=0x0c; //500us if(pwm==1) { value_l+=3; if(value_l > f_pwm_l) //高电平 { value_l=0; if(f_pwm_l != 0) pwm=0; } } else { value_l+=3; if(value_l > 100 - f_pwm_l) //低电平 { value_l=0; pwm=1; } } }

推荐访问:单片机 风扇 遥控 感应 智能

《基于单片机的智能遥控感应风扇设计.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:

文档为doc格式

一键复制全文 下载 投诉