《基于51单片机的智能温控电扇设计(共30页).doc》由会员分享,可在线阅读,更多相关《基于51单片机的智能温控电扇设计(共30页).doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上毕业论文(设计)题 目 基于51单片机的智能温控电扇设计学生姓名 学 号 院 系 专 业 指导教师 年 月 日目 录专心-专注-专业基于51单片机的智能温控电扇设计摘要:风扇是人们日常生活中必不可缺的工具,尤其是在夏天,作为一种使用频率很高的电器,备受人们喜爱。本文将以AT89S51为主控芯片,辅以DS18B20温度传感器,结合红外探测装置,来实现一种智能温控电扇的设计。此风扇通过液晶显示器来显示温度和风速,配备2个温度设定按键,由DS18B20读取外界温度,红外探头探测是否有人,通过设定的温度配合程序来调节风速,最后通过L298N来驱动电机。经过调试,风扇可以按照温
2、度智能变速,无人自动关闭,实现了智能温控的目标。关键词:DS18B20;AT89S51;红外探头;液晶显示器1602;L298N1 引言电扇是人们日常生活中常用的降温工具,从开始的吊扇到现在的USB风扇,无处不见电扇的踪迹。虽然如今空调已经走进千家万户,但是电扇的低位还是无可取代,作为一种节能环保,并且廉价简单的降温工具,电扇还在很多人家发挥着自己独特的作用。顺应时代潮流,各种多功能的风扇逐渐在取代传统风扇。单片机作为一种智能化程度高,控制精度高,操作简单,廉价易得,抗干扰能力强等特点,越来越多的应用于智能化产品之中。市场上智能风扇产品相继问世,制作方法也多种多样,功能也逐渐完善,普遍都具有了
3、手动变速和定时关闭等功能,相对而言,具备人性化,智能化的风扇还是很少,使用也并不广泛,而且在电子工艺高度发展的今天,智能化的步伐也越来越快,尤其是中国这个高速发展的国家,电扇的智能化也该向前迈进一个步伐。在中国市场上风扇还是有一定的市场份额的,几乎每个家庭都有风扇,具备价格便宜,摆放轻便,体积灵巧等特点,使得风扇在中小城市以及乡村将来一段时间内仍然会占有市场的大部分份额,为提高风扇的市场竞争力,使之在技术含量上有所提高,满足智能化的要求,智能风扇很具竞争力。大学四年即将结束,为了检验自己的学习情况,我决定使用之前所学习到的硬件只是结合相关的软件基础来制作一个基于单片机的智能温控风扇。基于对人性
4、化与智能化相结合的考虑,同时基于对价格的考虑,本设计决定制作一个基于51单片机的智能温控风扇,该风扇具有随温度自动调节风速的功能,并且在无人时可以自动关闭,而且可以根据每个人的不同情况来设定基准温度,从而实现了人性化与智能化的双重目标。2 方案设计2.1 系统整体设计本设计的整体思路是:利用温度传感器DS18B20来检测环境温度,并直接输出数字温度给51单片机进行处理,并将实时温度、设置温度、风速显示在液晶1602上。设置温度辅以2个可调按键,一个提高设置温度,一个降低设置温度,设置温度只能是整数型式,检测到的环境温度可以精确到小数点后一位。本系统还配备一个红外探头,探测出风范围内是否有人,若
5、无人则自动关闭风扇。同时采用单片机模拟PWM脉宽调制方式来改变直流电扇电机的转速。系统整体结构框图1所示:AT89S51晶振L298NLCD1602DS18B20复位红外探头独立键盘直流电机图1整体系统结构图2.2 方案论证本设计要求实现在温度变化的情况下风扇直流电机转速随之改变,并且能够在无人的情况和温度低于设定温度的时候自行停止,需要比较高的温度分辨率和稳定的探测工具以及可靠的电机控制部件。2.2.1 温度传感器的选择在本设计中,温度传感器的方案有以下两种:方案一:采用热敏电阻。热敏电阻的特性就是阻值可以随温度的变化而变化,采用热敏电阻作为检测温度的核心部件,然后通过放大电路放大信号,经过
6、AD0809数模转换讲放大的微弱电压变化信号转化了数字信号输入单片机处理。方案二:单总线数字温度计DS18B20。作为一款优秀的数字集成温度传感器,DS18B20可以直接检测并输出数字信号给单片机进行处理。对于方案一,如若采用热敏电阻作为温度检测元件,则价格方面比较便宜,元件易得,但是热敏电阻的缺点显而易见,对于温度细微变化反应不敏感,而且在后续的放大和转换电路中还会造成失真和误差,并且热敏电阻的变化曲线非线性,每个热敏电阻都不同,还需要单独测试描绘出曲线,虽然可以通过软件来实现误差的修正,但是这会使得电路的复杂性增加,并且在人体所在实际环境中难以检测到小的温度变化。所以这个方案在本设计中难以
7、胜任。对于方案二,DS18B20测量范围从-55到+125,增量值为0.5,人体所处的环境温度包括其中,分辨率较高,所获取的温度误差小,并且对温度变化反应灵敏。DS18B20最具优势的是其温度值在器件内部直接转化成数字信号输出,简化了系统设计,又由于该温度传感器采用了单总线技术,使得其接口与单片机接口变得非常简洁,抗干扰能力也得到了提高,所以本系统采用这个方案。2.2.2 红外探测的选择方案一:热释电红外探测模块。作为一款应用很广的红外探测模块,具有灵敏度高,可靠性高,低电压工作模式等特点,被广泛的应用与各种场合中。但是与本设计却有一个冲突,该模块使用环境应尽量避免流动的风,流动的风也会对感应
8、器造成干扰。所以方案一不适用。方案二:对射式光电开关。对射式光电开关是一款有红外线发射管跟红外线接收管配对使用的光电开关。对射式光电开关在电路中起到了通过光来传播电路,当有物体阻挡着红外线发射管跟接受管时,电路会停止工作。使用这个特性,我们就能判断是否有人,外界干扰就没有了,非常适合这个系统,所以就采用这种方案。2.2.3 控制核心的选择本设计采用AT89S51单片机作为控制核心,通过软件编程的方法进行温度的实时检测与判断,并在I/O口上输出控制信号,控制电机工作。AT89S51具有较大的存储空间,工作电压低,性能高,片内含4K字节的只读程序存储器ROM和128字节的随即数据存储器RAM,兼容
9、标准MCS-51指令系统,价格便宜,与本系统的设计相符合。2.2.4 显示器件的选择方案一:LED共阴极数码显示管。方案二:LCD液晶显示屏1602。对于方案一,成本相对低廉,功耗也低,在黑暗空间也可以看的清楚,可视距离较远,同时显示温度的程序也相对而言简单,所以这种显示方式也得到了广泛应用。但是它采用的显示方式是动态扫描,各个LED逐个点亮,会产生闪烁,在这个温度实时变化的环境中闪烁可能太快,数据可能不能很好的展示出来,故此方案不采用。对于方案二,液晶显示屏显示字符清晰,自带背光,还能显示符号,并且不会不断闪烁,显示性能一流,并且考虑到此设计不只是要显示温度,还要显示电机和红外的状态,所以从
10、设计完善的角度来考虑,选择此方案更有优势。2.2.5 调速方式的选择方案一:采用数模转化芯片DAC0832来控制,有单片机根据当前环境温度输出数值到DAC0832中,再由DAC0832产生相应的模拟信号控制晶闸管的导通脚,从而采用无级调速电路实现电扇电机转速的调节。方案二:采用单片机软件模拟PWM调速的方法。PWM是一种按照一定的规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调节方式,在PWM驱动控制的调节系统中,最常用的是矩形波PWM信号,在控制时调节PWM波的占空比。占空比是指高电平在一个周期时间内的百分比。在控制电机的转速时,占空比越大,转速就越快,若全为高电平时占空比为100%,
11、此时转速达到最大。用单片机的I/O口输出PWM信号时,有如下三种方法:(1)利用软件延时。当高电平延时时间到时,对I/O口电平取反,使其变成低电平,再延时一定时间,反之在低电平延时到时,对I/O口电平取反,如此循环即可得到PWM信号。本设计就是采用了这种方法。(2)利用定时器。控制方法与(1)相同,只是在该方法中利用单片机的定时器来进行高低电平的转变,而不是利用软件的延时。应用此方法时编程相对复杂,故不予以采用。(3)利用单片机自带的PWM控制器。STC系列单片机自带PWM控制器,但本系统使用的AT89系列单片机没有此功能,所以不能使用。对于方案一,该方案能实现对直流电机的无级调速,速度变化灵
12、敏,但是D/A转换芯片价格较高,性价比不高,不采用。对于方案二,相对于其他方案来说,采用软件模拟PWM实现调速的过程,具有个高的性价比与灵活性,充分的发挥了单片机自身的性能,对本系统的实现又提供了一条有效的途径。所以综合考虑还是选择方案二的第一种。2.2.6 驱动方式选择方案一:达林顿反向驱动器ULN2803。方案二:电桥驱动电路L298N。对于方案一,作为一款反向驱动器,ULN2803应用广泛,驱动效果也很好,与TTL信号兼容性很好,但是在后续的硬件电路中表现不佳,风扇转速改变不明显,而且在最高档出现断档的情况,风扇不转,在修改硬件电路,修改程序后依旧效果不佳,驱动力明显不足,故方案一中途停
13、用。对于方案二,由于之前已经有使用过,对L298N这个桥式驱动模块的应用上手快速,驱动能力也比ULN2803好很多,驱动风扇5档变速的实际效果明显,故采用方案二。3 硬件设计系统主要器件包括温度传感器DS18B20、AT89S51单片机、液晶显示屏LCD1602、桥式驱动模块L298N、对射式光电开关开关和风扇。辅助元件包括电容电阻、晶振、电源、按键、变压器等。3.1系统各器件简介3.1.1 单线程数字温度传感器DS18B20此温度传感器是美国DALLAS半导体公司继DS1820之后推出的一种改进型智能温度传感器DS18B20。作为新一带数字检测元件,DS1820是世界上第一片支持 一线总线接
14、口的温度传感器,在其内部使用了在板(ON-BOARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的DS18B20体积更小、更经济、更灵活。使你可以充分发挥“一线总线”的优点。DS18B20可以程序设定912位的分辨率,精度为0.5C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。测温范围为-55125,最大分辨率可达0.0625。DS18B20减少了外部的硬件电路,直接输出数字信号,具有低成本和易使用的特点。
15、图2温度传感器DS18B203.1.2 AT89S51单片机简介AT89S51是一个低功耗,高性能COMS 8位单片机,片内含4Kbytes ISP的反复可读写1000次的Flash只读程序储存器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了8位中央处理器和IPS Flash存储单元,AT89S51在众多嵌入式系统中得到了广泛的应用。AT89S51具有完整的输入输出和控制端口、以及内部程序存储空间。与我们通常意义上的微机原理类似,可以通过外接A/D,D/A转换电路及运放芯片实现对传感器传送信息的采集,且能够提供以点阵或LC
16、D液晶及外接按键实现人机交互,能对内部众多I/O端口连接步进电机对外围设备进行精确操控,具有强大的工控能力。AT89S51系列单片机编写程序简单。其语法结构与我们常用的计算机C语言基本相同,不同之处在于增加了控制具体引脚工作的语句和命令,相对于计算机C语言,单片机C语言更简练和明确,可以控制每个引脚的输入输出状态。其主要语句集中在例如:“ifelse”、“while”、“for”等循环与判断语句上,相比计算机C语言更简单。使用AT89S51系列单片机编程,可以在没有实物单片机的情况下在普通电脑上进行程序编写甚至是调试工作。一般工作中使用Keil公司开发的51单片机编程软件进行编程,它采用目前流
17、行的开发环境,集编辑,编译和仿真于一体。在该软件上用户可以编写汇编语言或C语言源程序,并利用该软件生成单片机能运行的程序。AT89S51价格便宜,适合对大批量的计量仪器进行规模化改造,其单片售价不超过5元。图3AT89S51引脚图 DIP封装3.1.3 桥式驱动电路L298N简介本系统要用单片机控制风扇直流电机,需要加驱动电路,为直流电机提供足够大的驱动电流,并能在模拟PWM波的情况下实现风扇转速的改变。在本系统驱动电路中,选用桥式驱动电路L298N来驱动风扇直流电机。L298N在使用时接口简单,操作方便,可为电机提供稳定的驱动电流,可以同时驱动两台直流电机,可以在模拟PWM波的情况下很好的输
18、出信号,实现风扇转速的平滑改变。L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是其输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,(二相、三相、四相)步进电机,伺服电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制两路电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。模块接口说明:+5V:芯片电压5V。VCC:电机电压,最大可接50V。GND:共地接法。EN1、EN2:高电平有效,EN1、EN2分别为 IN1和IN2、IN3和IN4的使
19、能端。IN1IN4:输入端,输入端电平和输出端电平是对应的。图4L298N模块3.1.4 LCD1602简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。一般1602字符型液晶显示器实物如图:图5LCD1602LCD1602主要技术参数:显示容量:162个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.954.35(WH)mm第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度
20、过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。3.1.5对射式光电开关简介图6对射式光电开关光电开关E18的技术参数:1、输出电流 DC/SCR
21、/继电器 Control output:100mA/5V供电2、消耗电流DC25mA3、响应时间 2ms4、指向角:15,有效距离3-50CM可调5、检测物体:透明或不透明体6、工作环境温度:-25+557、标准检测物体:太阳光10000LX以下 白炽灯3000LX以下8、外壳材料:塑料电气特性: U:5VDC I:100mA Sn:3-50CM3.2 各部分电路设计3.2.1 开关复位与晶振电路单片机系统中,有两个非常重要的电路,一个是开关复位电路,用来对单片机本身和其外部扩展I/O接口电路进行复位,还有一个是晶振电路,用于产生谐振,使单片机得以工作。电路图如图7所示:图7晶振电路与复位电路
22、单片机的XTAL1和XTAL2用来外界石英晶体和微调电容,连接单片机内OSC的定时反馈电路。如图所示,当按下按键开关是,系统复位一次。其中电容C1、C2为20pF,C3为10uF,电阻R1为10k,晶振为12MHz。3.2.2 独立控制键盘电路本设计还有两个独立按键,分别连接单片机的P3.2口和P3.3口,如图8所示:图8按键电路独立按键S1和S2一端与单片机相连,另一端接地,当按下时,P3口读取低电平有效。系统上电进入工作后,扫描按键子程序,此时可以设定温度。其中S1为加按键,S2为减按键,每按下一次后,都会使对应的预设值加一或者减一。3.2.3 LCD显示电路本设计采用的是LCD1602A
23、作为显示模块,它与单片机的连接如图9所示。其中第一行显示温度与红外探测结果,温度显示到小数点后2位。第二行显示设定温度与风扇的风力等级。图9LCD连接电路3.2.4 红外探测电路红外光电开关一共有三个接口,一个接+5V,一个接地,还有一端与单片机相连,输出高电平或者低电平信号,在电路中直接用按键开关代替了,就是按键电路中的开关S3。3.2.5 温度采集电路DS18B20数字温度传感器通过其内部计数时钟周期来的作用,实现了特有的温度测量功能。低温系数振荡器输出的时钟信号通过由高温度系数振荡器产生的门周期而被计数,计数器预先置有与-55相对应的一个基权值。如果计数器计数到0时,高温度系数振荡周期还
24、未结束,则表示测量的温度值高于-55,被预置在-55的温度寄存器中的值就增加1,然后这个过程不断重复,直到高温度系数振荡周期结束为止。此时温度寄存器中的值即为被测温度值,这个值以16位二进制形式存放在存储器中,通过主机发送存储器读命令可读出此温度值,读取时低位在前,高位在后,依次进行。由于温度振荡器的抛物线特性的影响,其内用斜率累加器进行补偿。DS18B20由于直接可以输出数字信号,所以可以直接输出给单片机,但是需要在输出口上接一个上拉电阻来确保工作,连接图如图10所示:图10DS18B20连接电路3.2.6 风扇驱动电路本设计采用单片机模拟PWM波的方式通过I/O口输出TTL信号,再通过一个
25、电机驱动模块L298N来驱动12V直流无刷电机工作,从而实现电扇转速的调节。红外探测控制电机开关,键盘改变设置的温度,然后和预设的温度进行比较,通过软件判断后由单片机的P3.4口输出脉冲信号,经由L298N驱动风扇直流电机电路,实现电机的启动和转速的改变。当环境温度改变时,电机的转速会按照设定的程序相对进行改变,温度升高转速变快,温度降低,转速变慢,温度过低时自动停止,无人状态下也会自动停止。当有人出现后,并且温度高于预设温度,电机重新开始工作。如图12所示:图11L298N驱动电路图12直流电机连接电路4 软件设计软件编写有C语言和汇编语言两种,这两种语言我都有所了解,两种语言各有特点。C语
26、言具有编写简单,容易上手的特点,而且看起来条理清晰,便于修改,能够快速准确的找到错误并进行改正。相对于汇编语言,作为一种低级的机器语言,读程序相对繁琐,但程序写好后意思明了,效率也要高于C语言编写的程序,具有很好的开发功能。结合自身实际,我还是选择了C语言,容易上手,可以更好的调试与编译程序。显示设定温度程序初始化调用键盘扫描函数显示温度读取预设温度值与预设温度进行比较读取DS18B20温度值主程序开始调用电机控制函数判断是否有人显示有人/无人显示风速等级有人无人4.1 主程序流程图图13主程序流程图主程序如下:void main(void) /初始化uint ltemp; /初始化温度dia
27、nji=0; /初始化电机int1=0;int2=0;init(); /初始化液晶显示屏read_temp(); /读取测温子程序,读取温度数值delay(1000); /延时 while(1) /循环开始 delay(2);ltemp=read_temp(); /温度赋值write_com(0x80+2); /将温度显示到液晶屏 write_data(0x30+ltemp%10000/1000); write_data(0x30+ltemp%1000/100); write_data(0x2e);write_data(0x30+ltemp%100/10);write_data(0x30+lt
28、emp%10);write_data(0xdf);keyscan(); /读取键盘子程序delay(2);write_com(0x80+0x40+4); /将设定温度显示到液晶屏write_data(0x30+set%100/10);write_data(0x30+set%10);write_data(0xdf);deal(ltemp/100); /运行温度判断子程序dianjik(); /运行电机控制子程序write_com(0x80+0x40+15); /将风扇转速显示到液晶屏write_data(0x30+h);write_com(0x80+15); /将红外探测结果显示到液晶屏 wri
29、te_data(0x30+r); 4.2 液晶显示子程序液晶LCD1602的子程序要按照说明上的时序图来完成。要想让LCD显示的话,首先要对LCD进行初始化。在完成LCD的初始化后,还需要定义字符的位置,并且定义写数据的函数。其第一行的地址是40H4FH,第二行的地址是从80H8FH,然后才能根据要显示字符的ASC码对该字符进行显示。其流程图14所示:初始化函数写指令函数(位置)写数据函数(数字和字符)图14液晶显示程序流程图子程序如下:/*初始化函数*void init(void) uint i; E=0;RW=0; RS=0;delay(10);/延时10mswrite_com(0x01)
30、;/清屏delay(5);write_com(0x38);/设显示模式delay(5);write_com(0x0c);/开显示不显光标 光标不闪delay(5);write_com(0x06);/地址自动加一 光标自动加一delay(5);write_com(0x80);for(i=0;i16;i+)write_data(table2i); write_com(0x80+0x40);for(i=0;i16;i+)write_data(table1i); /*写指令函数*void write_com(uchar command)RS=0;/指令RW=0;/写入P0=command;delay(
31、5);E=1;/允许delay(10);E=0;/*写数据函数*void write_data(uchar dat)RS=1;/数据P0=dat;delay(5);E=1;/允许delay(10);E=0;4.3 DS18B20温度传感器子程序4.3.1 温度读取程序DS18B20温度读取程序负责把DS18B20测得的外界数据经过AD转化为数字,然后将数据存入寄存器中,供温度处理程序进行下一步操作。其流程图15所示:传感器初始化读取应答信号从DS18B20读取一个字节向DS18B20写入一个字节延迟至少750ms输出数据图15DS18B20程序流程图子程序如下:/*延时函数*void dela
32、yus(uint z)uchar i;for(i=0;iz;i+);/*将DS18B20传感器初始化,读取应答信号*uchar clean_ds18b20()uchar k;/储存DS18B20是否存在的标志,k=0,表示存在;k=1,表示不存在dq=1;/先将数据线拉高delayus(5);/延时dq=0;/再将数据线从高拉低,要求保持480960usdelayus(30);/略微延时,以向DS18B20发出一持续480960us的低电平复位脉冲 dq=1;/释放数据线(将数据线拉高)delayus(3);/延时(释放总线后需等待1560us让DS18B20输出存在脉冲)k=dq;/让单片机
33、检测是否输出了存在脉冲(dq=0表示存在)delayus(25);/延时足够长时间,等待存在脉冲输出完毕return k;/返回检测成功标志/*从DS18B20读取一个字节数据*uchar read_ds18b20_date()uchar value,i;/储存读出的一个字节数据for(i=0;i=1;dq=1;/将数据线人为拉高,为单片机检测DS18B20的输出电平作准备if(dq)/如果读到的数据是1,则将1存入valuevalue|=0x80;delayus(6);if(!dq) /如果读到的数据是0,则将0存入valuevalue|=0x00;delayus(6);return val
34、ue;/返回读出的十进制数据/*向DS18B20写入一个字节数据*void write_ds18b20_date(uchar date)uchar num;for(num=0;num=1;delayus(4); /4usdq=1;/释放数据线delayus(4);/稍作延时,给硬件一点反应时间4.3.2 温度处理程序温度处理程序将上一把操作中读取的温度值进行转换,将二进制数转化为十进制数,然后输出数字,直接交给显示程序显示。等待转化完成初始化读取高八位和低八位启动温度测量等待初始化完成处理数据输出十进制整数其流程图16所示:图16温度处理子程序流程图其子程序如下:/*做好读温度的准备*uint
35、 read_temp()uint g,d,m;uint c;m=1;m=clean_ds18b20();/初始化完成m=0while(m); /等待初始化完成write_ds18b20_date(0xcc);/跳过romwrite_ds18b20_date(0x44);/启动温度测量delayus(100);m=clean_ds18b20();while(m); /等待转化完成write_ds18b20_date(0xcc);/跳过romwrite_ds18b20_date(0xbe);/读数据命令d=read_ds18b20_date();/读低8位数据g=read_ds18b20_date
36、(); /读高3位数据g4); /整数部分g=g*100;d=(d&0x0f)*0.0625*100; c=g+d;return c; 4.4 键盘扫描子程序本设计配备两个输入按键,分别可以对设定温度进行加减,此子程序用来检测按键输入。流程图17所示:扫描按键判断是否按下设定温度加一(减一)延时判断是否按下图17键盘扫描流程图子程序如下:/*键盘输入*void keyscan(void)if(key1=0)/判断key1是否按下 delay(10);/延时判断key1是否按下if(key1=0)set+;/设定温度加1if(key1=100)set=18;while(!key1);if(key
37、2=0)/判断key2是否按下 delay(10);/延时判断key2是否按下if(key2=0)set-;/设定温度减1if(set=0)set=18;while(!key2);4.5 温度比较处理子程序温控风扇设定5个档位,根据温度的变化来变化风扇的转速。输出的型式采用高地电平的交替变换,档位越高,输出高电平的次数越多,相应的输出低点平的次数变少,反之,档位越低,输出的高电平次数越少,相应的输出的高电平的次数变多。低于设定温度时,风扇不转,大于最大挡位时满负荷运转。流程如图18所示:读取温度温度比较低于设定温度设置为2档设置为1档风扇不转高于设定温度+7低于设定温度+7低于设定温度+5低于
38、设定温度+3低于设定温度+1设置为3档设置为4档设置为5档否否否否否是是是是是是图18温度比较处理流程图子程序如下:/*温度处理函数*void deal(uint temp) /温度处理if(tempset)&(temp(set+1)&(temp(set+3)&(temp(set+5)&(temp(set+7)/温度高于设定值+7 h=5; l=0;4.6 电机控制程序(包含红外探测)本设计最终驱动电机的子程序,包含了红外检测。首先进行红外检测判断,若没有人,电机不转,若有人,承接上函数设定的档位,模拟PWM波输出,一次输出5个电平,1档就输出一个高电平,四个低电平,2档输出两个高电平,三个低电平,依次类推。开始电机不转电机输输出模拟PWM波红外探测是否有人模拟PWM高低电平次数流程图如图19所示:图19红外探测电机输出流程图子程序如下:/*电机模拟PWM控制程序*void dianjik() uchar q;for(q=0;ql&red=0;q+)/红外感应有人,输出设定的低电平次数dianji=0;int1=0;int2=0;r=1; delay(100); for(q=0;qh&red=0;q+)/红外感应有人,输出设定的高电平次数dianji=1;int1=1