南京信息工程大学基于单片机的智能风扇控制本科学位论文.doc
-
资源ID:93227337
资源大小:295.50KB
全文页数:29页
- 资源格式: DOC
下载积分:9金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
南京信息工程大学基于单片机的智能风扇控制本科学位论文.doc
目 录1 引言42 方案设计52.1 系统整体设计52.2 方案论证52.2.1 温度传感器的选择62.2.2 红外探测的选择62.2.3 控制核心的选择62.2.4 显示器件的选择72.2.5 调速方式的选择72.2.6 驱动方式选择83 硬件设计83.1系统各器件简介83.1.1 单线程数字温度传感器DS18B2083.1.2 AT89S52单片机简介93.1.3 桥式驱动电路L298N简介103.1.4 LCD1602简介113.2 各部分电路设计123.2.1 开关复位与晶振电路123.2.2 独立控制键盘电路133.2.3 LCD显示电路133.2.4红外探测电路.133.2.5 温度采集电路143.2.6 风扇驱动电路144 软件设计154.1主程序流程图154.2 液晶显示子程序174.3 DS18B20温度传感器子程序194.3.1 温度读取程序194.3.2 温度处理程序214.4 键盘扫描子程序234.5 温度比较处理子程序244.6 电机控制程序(包含红外探测)264.7 软件设计中的问题与分析284.7.1 LCD显示程序的问题284.7.2 DS18B20的显示程序问题285 硬件调试295.1 按键电路的调试295.2 温度传感器电路的调试295.3 电机电路的调试295.4 红外感应电路的调试295.5 硬件调试遇到的问题296 结论29参考文献30基 基于单片机的智能风扇控制 南京 210044 摘要:风扇是人们日常生活中必不可缺的工具,尤其是在夏天,因其价格便宜,用电量较之空调有很大优势,故在中国还有较大市场。本文将以AT89S52为主控芯片,辅以DS18B20温度传感器,结合红外探测装置,来实现一种智能温控电扇的设计。此风扇通过液晶显示器来显示温度和风速,配备2个温度设定按键,由DS18B20读取外界温度,红外探头探测是否有人,通过设定的温度配合程序来调节风速,最后通过L298N来驱动电机。经过调试,风扇可以按照温度智能变速,无人自动关闭,实现了智能温控的目标。关键词:DS18B20;AT89S51;红外探头;液晶显示器1602;L298N Smart fan control based on MCUWang XueleiNUIST,Nanjing 210044,ChinaAbstract:The fans is an indispensable tools in people's daily life , especially in the summer. because their price is cheap and their electricity consumption has a great advantage compared with air-conditioning, so they have a large market so far in China. This article will use AT89S52 as the main chip and combined with DS18B20 temperature sensor, infrared detection device, to achieve an intelligent temperature control fan design. This fan through the LCD display to show the temperature and wind speed, we can set temperature by two buttons. At the same time,the DS18B20 read the outside temperature ,infrared sensor to detect whether someone and analyse the above datas by AT89S52 to adjust the wind speed by setting the temperature with the program, and finally through L298N to drive the motor. After debugging, the intelligent fan can be in accordance with the temperature intelligent control and automatic shut in the environment with nobody to achieve the goal of intelligent temperature control.Key word: DS18B20; AT89S51; infrared probe; LCD Monitor 1602; L298N1 引言电扇是人们日常生活中常用的降温工具,从开始的吊扇到现在的USB风扇,无处不见电扇的踪迹。虽然如今空调已经走进千家万户,但是作为一种节能环保,并且廉价简单的降温工具,电扇还在很多家庭生活中发挥着自己独特的作用。但也随着人们要求的多样化和科学技术的进步,各种多功能的智能风扇在市场上暂露头角并逐渐取代传统风扇。在产品智能化过程中单片机因为其智能化程度高,控制精度高,操作简单,廉价易得,抗干扰能力强等特点,在产品中得到了很好的应用。为提高风扇的市场竞争力,使之在技术含量和人性设计上有所提高,满足现在人们对智能化的要求和人性化的要求。大学四年即将结束,为了检验自己的学习情况,我决定使用之前所学习到的硬件知识结合相关的软件基础来制作一个基于51单片机的智能温控风扇,该风扇具有随温度自动调节风速的功能,并且在无人时可以自动关闭,并且可以让使用者依据自身对温度的敏感程度要求来设定基准温度,从而实现了人性化与智能化的双重目标。2 方案设计2.1 系统整体设计本设计的整体思路是:利用温度传感器DS18B20来检测环境温度,并依据DS18B20的功能特性直接输出数字温度给51单片机进行处理,并将实时温度、设置温度、风速显示在LCD1602上。用2个可调按键辅助设置温度,一个用于提高设置温度,一个则用来降低设置温度,设置温度只能是整数型式,检测到的环境温度可以精确到小数点后一位。本系统还配备一个红外探头,用于探测出风范围内是否有人,若在无人的情况下则自动关闭风扇。否则在开启电风扇的情况下同时采用单片机模拟PWM脉宽调制方式来改变直流电扇电机的转速。系统整体结构框图1所示:AT89S52独立键盘LCD1602红外探头DS18B20复位L298N直流电机晶振图1整体系统结构图2.2 方案论证本设计要求实现在温度变化的情况下直流电机风扇的转速随之改变,并且能够在无人的情况和温度低于设定温度的时候自行停止,因此需要较高的温度分辨率和稳定的探测工具以及可靠的电机控制部件。2.2.1 温度传感器的选择在本设计中,温度传感器的选择方案有以下两种:方案一:采用热敏电阻。热敏电阻的特性就是阻值可以随温度随之变化,采用热敏电阻作为检测温度的核心部件,然后通过放大电路进行信号放大,再将放大后微弱电压变化信号通过ADC0809进行模数转换,将其转化成数字信号并输入单片机处理。方案二:单总线数字温度计DS18B20。DS18B20数字温度传感器直接把温度转换为数字量,单片机可以直接读取。对于方案一,如若采用热敏电阻作为温度采集元件,则价格方面比较便宜且元件易得,但是热敏电阻的缺点也是显而易见,对于温度细微变化该元件反应不敏感,而且在后续的放大和转换电路中还会造成采集数据的失真和误差,并且热敏电阻的变化曲线为非线性,每个热敏电阻都不同,还需要单独测试描绘出每个热敏电阻的曲线,虽然可以通过软件方法来实现对该元件误差的修正,但是这会使得电路的复杂性增加,并且在人体所在的实际环境中难以检测到细微较小的温度变化。所以这个方案在本设计中难以胜任。对于方案二,DS18B20温度传感器的测量范围从-55至+125,增量值为0.5,因此人体所处的环境温度包括在其中,且该传感器分辨率较高,对温度变化反应灵敏,获取的温度误差小。DS18B20的一大优势是其能将收集到温度值在自己的器件内部就直接转化成数字信号输出,从而大大简化了系统设计,同时由于该温度传感器采用了明了的单总线技术,使得它的接口与相应的单片机接口变得非常简洁,同时使系统的抗干扰能力也得到了显著的提高,所以本系统采用这个方案。2.2.2 红外探测的选择方案一:热释电红外探测模块。作为一款应用广泛的红外探测模块,具有高灵敏度,可靠性强,工作电压低等特点,在各种场合被广泛使用。但是该模块的使用环境要求应尽量避免流动的风,具有流动的风的环境会对该感应器造成干扰。因此该模块与本设计所需环境有冲突,所以方案一不适用。方案二:对射式光电开关。对射式光电开关是由一红外线发射管与一红外线接收管配对组成使用的一款光电开关。该开关在电路中作用是通过光来传播电路,当红外线发射管跟接受管间有物体阻挡时,电路便会停止工作。利用这个特性,系统就能判断所影响的环境中是否有人,与本系统设计没有任何冲突,所以就采用这种方案。2.2.3 控制核心的选择本设计采用AT89S52单片机作为系统的控制核心,通过软件编程的方法对温度的进行实时检测与判断,并在I/O口上输出控制信号,进而控制电机工作。AT89S52是一种低功耗,高性能CMOS8位微处理器,具有8K在系统可编程AT89S523引脚图DIP封装Flash存储器。片内含8K字节的只读程序存储器ROM和256字节的随即数据存储器RAM,兼容标准MCS-51指令系统并使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令与引脚完全兼容。片上Flash允许程序存储器在系统可编程,也同样适用于常规编程器,价格便宜,与本系统的设计相符合。2.2.4 显示器件的选择方案一:LED共阴极数码显示管。方案二:LCD液晶显示屏1602。对于方案一,数码管具有成本低,功耗小,可视距离较远等特点,同时显示温度的程序也相对简单,因此这种显示方式在很多场合得到了广泛应用。但是它采用的显示方式是通过动态扫描,然后逐个点亮各个LED,因此会产生闪烁,在本设计这个温度实时变化的环境中闪烁可能太快,数据可能不能很好的显示出来,故此方案不采用。对于方案二,液晶显示屏显示字符清晰,自带背光,还能显示符号,并且不会不断闪烁,显示性能一流,并且考虑到此设计不只是要显示温度,还要显示电机和红外的状态,所以从设计完善的角度来考虑,选择此方案更有优势。2.2.5 调速方式的选择方案一:采用数模转化芯片DAC0832来控制,有单片机根据当前环境温度输出数值到DAC0832中,再由DAC0832产生相应的模拟信号控制晶闸管的导通角,从而采用无级调速电路实现电扇电机转速的调节。方案二:采用单片机软件模拟PWM调速的方法。PWM是一种按照一定的规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调节方式,在PWM驱动控制的调节系统中,最常用的是矩形波PWM信号,在控制时调节PWM波的占空比。占空比是指高电平在一个周期时间内的百分比。在控制电机的转速时,占空比越大,转速就越快,若全为高电平时占空比为100%,此时转速达到最大2 蓝厚荣.单片机的PWM控制技术J .工业控制计算机,2010,23(3):97982。用单片机的I/O口输出PWM信号时,有如下三种方法:(1)利用软件延时。当高电平延时时间到时,对I/O口电平取反,使其变成低电平,再延时一定时间,反之在低电平延时到时,对I/O口电平取反,如此循环即可得到PWM信号。本设计就是采用了这种方法。(2)利用定时器。控制方法与(1)相同,只是在该方法中利用单片机的定时器来进行高低电平的转变,而不是利用软件的延时。应用此方法时编程相对复杂,故不予以采用。(3)利用单片机自带的PWM控制器。STC系列单片机自带PWM控制器,但本系统使用的AT89系列单片机没有此功能,所以不能使用。对于方案一,该方案能实现对直流电机的无级调速,速度变化灵敏,但是D/A转换芯片价格较高,性价比不高,不采用。对于方案二,相对于其他方案来说,采用软件模拟PWM实现调速的过程,具有个高的性价比与灵活性,充分的发挥了单片机自身的性能,对本系统的实现又提供了一条有效的途径。所以综合考虑还是选择方案二的第一种。2.2.6 驱动方式选择方案一:达林顿反向驱动器ULN2803。方案二:电桥驱动电路L298N。对于方案一,作为一款反向驱动器,ULN2803应用广泛,驱动效果也很好,与TTL信号兼容性很好,但是在后续的硬件电路中表现不佳,风扇转速改变不明显,而且在最高档出现断档的情况,风扇不转,在修改硬件电路,修改程序后依旧效果不佳,驱动力明显不足,故方案一中途停用。对于方案二,由于之前已经有使用过,对L298N这个桥式驱动模块的应用上手快速,驱动能力也比ULN2803好很多,驱动风扇5档变速的实际效果明显,故采用方案二。3 硬件设计系统主要器件包括温度传感器DS18B20、AT89S51单片机、液晶显示屏LCD1602、桥式驱动模块L298N、对射式光电开关开关和风扇。辅助元件包括电容电阻、晶振、电源、按键、变压器等。3.1系统各器件简介3.1.1 单线程数字温度传感器DS18B20 本系统的温度采集使用DS18B20数字温度传感器。DS18B20是一种具有单总线接口的数字温度传感器,具有体积小,功耗低,抗干扰能力强和单片机借口简单等优点。DS18B20的工作电压范围是3.05.5V,测量温度范围55125其特性如下:1. 单总线接口。与单片机连接时只需要单片机的的一个I/O口,该单总线能够实现单片机与DS18B20的双向通信。同时该器件除上拉电阻外,不需要任何外围器件支持。2. 可使用数据线供电。当对系统空间要求严格时,DS18B20可以通过数据线供电。3. 可以编程的912位数据分辨率。912位数据分辨率对应的可分辨温度分辨为0.5,0.25,0.125,和0.0625。当使用9位数据分辨率时,DS18B20最快可在93.75ms内完成温度转换,当使用12位数据分辨率时。最快可在750ms内完成温度转换。4. 多点组网测量功能。多个DS18B20可以通过同一根数据线组成分布式测量网3 刘波文,刘向宇,黎胜容.51单片机C语言应用开发三位一体实战精讲M.北京:北京航空航天大学出版社.2011.1691703。 图2温度传感器DS18B203.1.2 AT89S52单片机简介 AT89S52是一种低功耗,高性能CMOS8位微处理器,具有8K在系统可编程AT89S523引脚图DIP封装Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令与引脚完全兼容。片上Flash允许程序存储器在系统可编程,也同样适用于常规编程器。在单芯片上,拥有灵巧方便的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活,超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM,定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。P0 口:P0口是一个8位漏极开关的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下, P0不具有内部上拉电阻。在Flash编程时,p0口也用来接受指令字节;在程序效验时,输出指令字节。程序效验时,需要外部上拉电阻。P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个TTL逻辑电平。此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2 的触发输入(P1.1/T2EX)。 在flash编程和校验时,P1口接收低8位地址字节。引脚号第二功能:P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)P1.5 MOSI(在系统编程用)P1.6 MISO(在系统编程用)P1.7SCK(在系统编程用)P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动AT89S52引脚图 PLCC封装4 个 TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR) 时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用 8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。 在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p3 输出缓冲器能驱动4 个 TTL 逻辑电平。 P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。 在flash编程和校验时,P3口也接收一些控制信号。端口引脚第二功能:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 INTO(外中断0)P3.3 INT1(外中断1)P3.4 TO(定时/计数器0)P3.5 T1(定时/计数器1)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。图3AT89S52脚图 DIP封装3.1.3 桥式驱动电路L298N简介本系统要用单片机控制风扇直流电机,需要加驱动电路,为直流电机提供足够大的驱动电流,并能在模拟PWM波的情况下实现风扇转速的改变。在本系统驱动电路中,选用桥式驱动电路L298N来驱动风扇直流电机。L298N在使用时接口简单,操作方便,可为电机提供稳定的驱动电流,可以同时驱动两台直流电机,可以在模拟PWM波的情况下很好的输出信号,实现风扇转速的平滑改变。L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是其输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,(二相、三相、四相)步进电机,伺服电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制两路电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。模块接口说明:+5V:芯片电压5V。VCC:电机电压,最大可接50V。GND:共地接法。EN1、EN2:高电平有效,EN1、EN2分别为 IN1和IN2、IN3和IN4的使能端。IN1IN4:输入端,输入端电平和输出端电平是对应的。3.1.4 LCD1602简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。一般1602字符型液晶显示器实物如图:图5LCD1602LCD1602主要技术参数:显示容量:16×2个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个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/继电器 Control output:100mA/5V供电2、消耗电流DC<25mA3、响应时间 <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晶振电路与复位电路单片机的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作为显示模块,它与单片机的连接如图9所示。其中第一行显示温度与红外探测结果,温度显示到小数点后2位。第二行显示设定温度与风扇的风力等级。图9LCD连接电路3.2.4 红外探测电路红外光电开关一共有三个接口,一个接+5V,一个接地,还有一端与单片机相连,输出高电平或者低电平信号,在电路中直接用按键开关代替了,就是按键电路中的开关S3。3.2.5 温度采集电路DS18B20数字温度传感器通过其内部计数时钟周期来的作用,实现了特有的温度测量功能。低温系数振荡器输出的时钟信号通过由高温度系数振荡器产生的门周期而被计数,计数器预先置有与-55相对应的一个基权值。如果计数器计数到0时,高温度系数振荡周期还未结束,则表示测量的温度值高于-55,被预置在-55的温度寄存器中的值就增加1,然后这个过程不断重复,直到高温度系数振荡周期结束为止。此时温度寄存器中的值即为被测温度值,这个值以16位二进制形式存放在存储器中,通过主机发送存储器读命令可读出此温度值,读取时低位在前,高位在后,依次进行。由于温度振荡器的抛物线特性的影响,其内用斜率累加器进行补偿。DS18B20由于直接可以输出数字信号,所以可以直接输出给单片机,但是需要在输出口上接一个上拉电阻来确保工作,连接图如图10所示:图10DS18B20连接电路3.2.6 风扇驱动电路本设计采用单片机模拟PWM波的方式通过I/O口输出TTL信号,再通过一个电机驱动模块L298N来驱动12V直流无刷电机工作,从而实现电扇转速的调节。红外探测控制电机开关,键盘改变设置的温度,然后和预设的温度进行比较,通过软件判断后由单片机的P3.4口输出脉冲信号,经由L298N驱动风扇直流电机电路,实现电机的启动和转速的改变。当环境温度改变时,电机的转速会按照设定的程序相对进行改变,温度升高转速变快,温度降低,转速变慢,温度过低时自动停止,无人状态下也会自动停止。当有人出现后,并且温度高于预设温度,电机重新开始工作。如图12所示:图11L298N驱动电路4 软件设计软件编写有C语言和汇编语言两种,这两种语言我都有所了解,两种语言各有特点。C语言具有编写简单,容易上手的特点,而且看起来条理清晰,便于修改,能够快速准确的找到错误并进行改正。相对于汇编语言,作为一种低级的机器语言,读程序相对繁琐,但程序写好后意思明了,效率也要高于C语言编写的程序,具有很好的开发功能。结合自身实际,我还是选择了C语言,容易上手,可以更好的调试与编译程序。4.1主程序流程图程序初始主程序开始读取DS18B20温度显示温度读取预设温度调用键盘扫描函数显示设定温度判断显示有人/无人显示风速等级与预设温度经行比较调用电机控制函数有人无人图12 主程序流程图主程序如下:void main(void) /初始化uint ltemp; /初始化温度dianji=0; /初始化电机int1=0;int2=0;initlcd(); /初始化液晶显示屏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+ltemp%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); /将红外探测结果显示到液晶屏 write_data(0x30+r); 4.2 液晶显示子程序液晶LCD1602的子程序要按照说明上的时序图来完成。要想让LCD显示的话,首先要对LCD进行初始化。在完成LCD的初始化后,还需要定义字符的位置,并且定义写数据的函数。其第一行的地址是40H4FH,第二行的地址是从80H8FH,然后才能根据要显示字符的ASC码对该字符进行显示。其流程图14所示:写指令函数(位置)初始化函数写数据函数(数字和字符)图13液晶显示程序流程图子程序如下:/*初始化函数*void initlcd(void) uint i; E=0;RW=0; RS=0;delay(10);/延时10mswrite_com(0x01);/清屏delay(5);write_com(0x38);/设显示模式delay(5);write_com(0x0c);/开显示不显光标 光标不闪delay(5);write_com(0x06);/地址自动加一 光标自动加一delay(5);write_com(0x80);for(i=0;i<16;i+)write_data(table2i); write_com(0x80+0x40);for(i=0;i<16;i+)write_data(table1i); /*写指令函数*void write_com(uchar command)RS=0;/指令RW=0;/写入P0=command;delay(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所示:延迟至少750ms传感器初始化读取应答信号从DS18B20读取一个字节从DS18B20写入一个字节输出数据 图14 DS18B20程序流程图子程序如下:/*延时函数*void delayus(uint z)uchar i;for(i=0;i<z;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;/让单片机检测是否输出了存在脉冲(dq=0表示存在)delayus(25);/延时足够长时间,等待存在脉冲输出完毕return k;/返回检测成功标志/*从DS18B20读取一个字节数据*uchar read_ds18b20_date()uchar value,i;/储存读出的一个字节数据for(i=0;i<8;i+)/读8位dq=1; /先将数据线拉高 _nop_(); /等待一个机器周期 dq=0;/单片机从DS18B20读书据时,将数据线从高拉低即启动读时序value>>=1;dq=1;/将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备if(dq)/如果读到的数据是1,则将1存入valuevalue|=0x80;delayus(6);if(!dq) /如果读到的数据是0,则将0存入valuevalue|=0x00;delayus(6);return value;/返回读出的十进制数据/*向DS18B20写入一个字节数据*void write_ds18b20_date(uchar date)uchar num;for(num=0;num<8;num+)dq=1; /先将数据线拉高 _nop_(); /等待一个机器周期 dq=0;/将数据线从高拉低时即启动写时序dq=date&0x01;/利用与运算取出要写的某位二进制数据,并将其送到数据线上等待DS18B20采样 date>>=1;delayus(4); /4usdq=1;/释放数据线delayus(4);/稍作延时,给硬件一点反应时间4.3.2 温度处理程序温度处理程序将上一把操作中读取的温度值进行转换,将二进制数转化为十进制数,然后输出数字,直接交给显示程序显示。其流程图如图16所示:等待初始化完成初始化启动温度测量读取高八位和低八位输出十进制整数处理数据等待转化完成