基于单片机的智能控温风扇系统设计_第1页
基于单片机的智能控温风扇系统设计_第2页
基于单片机的智能控温风扇系统设计_第3页
基于单片机的智能控温风扇系统设计_第4页
基于单片机的智能控温风扇系统设计_第5页
已阅读5页,还剩49页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

总体方案设计2.1系统总体设计框架本研究采用了先进的DS18B20温度传感器,用于精细捕捉环境温度变化,其获取的数字信号进一步被高效微控制器AT89C52进行智能解析和处理,该系统能够实现实时地在LED数码管上清晰展示出周边环境的温度以及预设的温度基准值[4]。需要明确的是,预设的温度参数被明确规定为固定的整数值,而环境感知器所记录的实际温度则精确到小数点后一位。本设计巧妙地采用了脉冲宽度调制(PWM)策略,以精细调控DC风扇电机的速度,两个用户友好型按键允许调整并稳定基础温度。借助高精度的DS18B20温度传感器,系统能实时感知环境温度,并通过微控制器AT89C52将获取的模拟温度数据转化为精确的数字信号,进一步进行高效处理。本设计由温度采集模块、按键模块、温度显示模块和电机驱动模块组成。系统结构框图如下:图2.1系统构成框图2.2方案论证本研究计划的核心目标是开发一种具备温度自适应功能的直流风扇电机控制系统,以便其能智能响应环境温度波动,灵活地启动、暂停或自动调节转速,以确保电机始终在最优状态下运行。为了适应这个快速发展的信息环境,现代系统迫切需要具备精密的温度感知功能,对温度细微变化能有高度敏感度。特别是对于那些至关重要的操作,如换挡和停机等,系统的执行精准性、稳定性和可靠性显得至关重要。2.2.1温度传感器的选择热敏电阻检测:51型号单片机与热敏电阻集成,形成一个功能完备的电路体系。接着,通过单片机对电路中的电压或电流参数进行精准测量,我们可以从侧面推算出在现有状态下热敏电阻的阻值特性。热敏电阻的特性表现为:在高温条件下,其电阻值通常呈现出下降趋势;然而,当周遭环境温度降低时,其电阻值会相应地增加。尽管这类组件的价格相对经济实惠,然而其测量精确度的不足是我们不得不关注的重要局限性。热电偶检测:热电偶作为一种关键的温度传感元件,其运作机制主要依赖于对热电势之间天然差值的精密测定,从而准确解读并计算出被测环境或对象的温度读数。热电偶作为一种极其精准的测温工具,尽管拥有诸多优势,但其实际运用中也面临着相应的技术难题和挑战。为了确保高效并精确地转化热电偶产生的微小电信号,我们的设计中不可或缺的是高端的模数转换器(A/DConverter),其精密性能至关重要。特别是,与其他传感器类型相比,热电偶表现出更高的电磁干扰敏感性,其抗扰性能相对较弱,这一特性在某些特定环境下可能对其应用构成了一定程度的局限。DS18B20温度传感器:本研究聚焦于运用温度敏感的材料构建智能化系统,其内置高效能模数转换器(ADC),实现了对温度的直接读取,无需外部辅助的模数转换步骤,提升了系统的能源效率和便捷性,而且其温度测定具有极小的偏差,高精度的特性,同时价格相对具备竞争力,而且DS18B20温度传感器凭借其独特的单总线(One-Wire)通信方式,使得它在与微控制器(MCU)的连接过程中展现出极高的便利性,不仅简化了编程操作,还优化了线路布局设计[5]。从性能和经费等方面考虑选DS18B20。2.2.2主控机的选择AT89C52是一款融合了高效能与低功耗特性的单片机芯片,它秉承了52系列微处理器的基本设计框架[6]。该芯片整合了多种实用的外围设备,包括模数转换器(ADC)、通用定时/计数模块以及串行通信接口等一系列功能组件。AT89C52表现出显著的存储能力和运行效率:内置256字节的RAM,专为临时数据存储设计,而128字节的EEPROM则确保了重要数据的持久储存[7]。并且支持包括SPI、I2C在内的多种标准通信接口,确保了其在多元化的通信场景中的兼容性和灵活性。除此之外,AT89C52凭借其显著的低能耗特性和卓越的稳定性,深受广大用户的喜爱。其卓越的价值体现在经济高效的开发成本上,得益于它兼容多种普遍采用的编程语言,如C语言和汇编语言,从而显著提升了编程的便利性和效率。因此,基于AT89C52出色的性能价格比和广泛的兼容性,它在本设计项目中展现出极高的适用价值。2.2.3显示器选型液晶显示器(LCD):液晶显示器作为一种先进的显示技术,以其显著的低能耗优势,广阔的视角范围,以及卓越的视觉表现力而备受瞩目。尽管当前信息时代展现出勃勃生机,但其背后的推进原理相当复杂,而且显示内容的可见度容易受到外部光照因素的显著影响。为了保证在各种照明条件下都能保持清晰的视觉效果,通常需要额外配置背光光源设施。尽管这种显示器展现出卓越的性能,然而其价格相对显得较高,特别是当考虑到它整合了复杂的背光源系统时。四段数码管(LED):通过运用动态扫描显示策略,逐个独立点亮每个LED数码管,这种方法有效地降低了所需输入/输出端口的数量,从而实现高效资源利用。本提议具有卓越的成本效益,其设计不仅能够直观、鲜明地呈现数字化数据,即使在光线不足的环境下也保证了极高的可读性。此外,它还注重能效,具备显著的低能耗特性。出于对系统简洁性与实用性的考量,本设计选用了七段数码管作为温度显示器件。2.2.4调速方式的选择脉宽调制技术:采用可调节的方波脉冲信号作为输入。确切地讲,是通过调整方波的dutycycle(即占空比,等于高电平持续时间与周期总时间的比例)来精确调控输出电路的平均电压水平。电压调制:实现风扇转速调控是通过调整电源电压的方式进行的。本设计采用了一种依赖于可调电源或变压器等电子元件的电路系统,利用51单片机的数字化输出精确调控电压参数实现风扇转速调节。相比之下,电压调制方法相对简单,然而其精度可能不如同步脉冲宽度调制(PWM)技术。为了同时优化操作的易用性和转速调控的精确度,本设计选用了脉冲宽度调制(PWM)方法,有效地对直流电机的速度实施精准控制,从而准确地达成预设的调速需求。2.3功能模块(1)温度采集模块此模块作为智能温控风扇系统的关键感知组件,使用DS18B20捕捉并精准测定周边环境的温度动态。该系统的运作机制在于它能有效将热能转化成电信号,随后通过内置的电路系统进一步处理,最终转化为清晰的数字温度读数。(2)按键模块用户能够通过按键模块自定义并设定理想的室内温度参数。此模块配备有增减按钮,以便于用户精细调整温度值,同时配备有设定键,旨在供用户选择并设定温度的上下限范围。一旦用户确认并执行设定操作,所选参数会立即被存储,并迅速传输至主控单元AT89C52单片机中。(3)温度显示模块此模块负责实时从AT89C52单片机内部获取并直观、清晰地通过数码管显示当前的温度数据。数码管利用数字及符号的矩阵式设计,通过激活对应的发光二极管单元,实现了数值和标识的精确呈现。用户无需进行繁琐操作,只需简单观察数码管显示,即可即时获取室内实际温度及风扇的运行状况,确保其功能的有效与直观呈现。(4)电机驱动模块此模块的核心职责是执行控制命令到机械操作的转化,确保当风扇电机接收到精确的电流指令时,能实现顺畅启动、持续稳定的运行以及无缝的停机过程。该系统通过高效协同L9110驱动集成电路,精确调控输送到电动机的电流参数,包括其强度和方向控制。3系统硬件设计3.1系统电路原理本系统构建的核心模块包括DS18B20型温度探测器、AT89C52型号微处理器、五位共阴极LED数码显示器、风扇直流电动机以及L9110型达林顿反相驱动器。此外,系统还配备了若干必要的辅助电子器件,如电阻、电容器、晶体振荡器、电源供应单元、操作按键以及拨码选择开关等。图3.1系统电路原理图3.2功能电路设计3.2.1主控电路(1)AT89C52单片机最小系统电路组成AT89C52单片机最小系统单元主要由以下三部分构成:AT89C52型单片机作为核心处理元件,复位电路负责为其提供稳定的重启机制,而晶振电路则确保其工作时钟的精确稳定[6]。此三者共同构成了确保单片机正常运行的基本要素。(2)AT89C52单片机AT89C52作为一款低功耗且性能卓越的8位微控制器,其内部集成有ATMEL的高效非易失性存储技术,这款芯片严格遵循MCS-51指令集规范,且内置了功能全面的8位中央处理单元,具备8k字节的可重编程只读存储器(ROM)和256字节的数据存储器(RAM),以满足多样化应用需求。在众多复杂控制系统的设计中,AT89C52单片机展现出了广泛的实用价值[7]。该单片机具有40个引脚,各引脚的介绍如下:图3.2AT89C51单片机VCC:+5V电源线;GND:接地线。P0口:P0.7~P0.0,该组合包括8根引脚,从P0.0开始编号,P0.0作为最低有效位,而P0.7则对应着最高位。这八个引脚具备多元化的功能,针对差异性场景设计。在不具备外部存储器的单片机运用中,P0口能够灵活地作为通用输入/输出接口,支持CPU的数据交换,然而为保证其稳定运行,外部上拉电阻的连接是必不可少的。在配备外部存储器的情境中,这些引脚初始用作传输外部存储器的低8位地址,随后肩负起数据的读写传输任务,连接CPU与外部设备。P1口:P1口是一个配备有内置上拉电阻的8位双功能输入/输出端,P1口具有通用I/O功能,与P0口相似,皆能进行用户的数据传输,其独到之处在于内置了上拉电阻,这使得在利用P0口进行此类操作时,外部上拉电阻的需求得以省略,而P1口因其内置特性无需额外配置,在执行FLASH编程与校验任务时,P1口专门承担了向片内EPROM的低八位地址的输入功能[8]。P2口:P2口是一种内置上拉的8位双向I/O接口,具备通用I/O功能,专门用于双向的数据传输,即能接纳用户输入又可驱动外部设备输出,它能与P0口的第二功能协同工作,用于输出外部存储器的高端8位地址,从而实现存储器地址的选择。然而,在这种模式下,P2口并不具备传输存储器读写数据的能力,特别地,在部分单片机型号中,P2口还能与P1口联合,为片内EPROM的12位地址提供高4位的地址传输能力[9]。P3口:P3引脚配置为8个内置上拉的双向I/O接口,当对P3口写入逻辑1时,其内部自动将信号拉高至高电平,这款接口具备多功能性,既能作为通用的I/O端口传输用户输入和输出数据,同时也支持特定功能的实现[10],如下所示:P3.0:RXD(串行数据接收口)P3.1:TXD(串行数据发送口)P3.2:(外部中断0输入)P3.3:(外部中断1输入)P3.4:T0(记数器0计数输入)P3.5:T1(记时器1外部输入)P3.6:(外部RAM写选通信号)P3.7:(外部RAM读选通信号)RST:复位输入。ALE/:0.7在P0.0引脚线同步输出片外存储器的低8位地址期间,ALE/PROG线伴随产生一个高电平脉冲,其下降沿促使该地址被准确地传输至外部专用地址锁存器,从而释放P0.7至P0.0引脚以进行后续的片外存储器读写数据传输。当无需外部存储器访问时,单片机自发地在ALE/PROG线路中产生以晶振频率1/6周期的脉冲信号序列。:在从外部程序存储器获取指令的过程中,每一轮机器周期内PSEN信号的有效性被触发两次,然而在尝试获取外部数据存储器的过程中,预期的两次有效PSEN信号将不会发生[11]。/VPP:在EA引脚保持低电平状态下,系统允许对片外存储器进行访问,即使内部程序存储器存在,这种状态下外部程序存储器的使用权被默许,同时需配备相应的电源线以支持此操作,当电子装置的端口维持高电平状态时,片内程序存储器的使用权得以启用[12]。在执行FLASH编程的过程中,该引脚同样承担着提供12伏特编程电压(VPP)的功能。XTAL1和XTAL2:该电路的内部振荡器输入引脚专为外部接入石英晶体和微调电容设计,这些组件直接接入单片机片内OSC(时钟振荡器)的反馈环路中。(3)复位与晶振在单片机应用体系结构中,确保单片机的初始化是至关重要的,同样,对外部I/O接口模块的复位也不能忽视,因此系统必须整合一个集成了上电初始化和手动按钮复位的综合性复位模块,在单片机内部,XTAL1和XTAL2端口分别与石英晶体和微调电容相接,共同构建了用于产生时钟信号的振荡器反馈电路,如图所示开关复位与晶振电路在设计中呈现出紧密的相互作用关系,每当用户触发按键开关S1的操作时,系统便会实施一次复位程序[13]。在该电路配置中,电容器C1和C2的容量分别为30皮法(30pF),C3则拥有10微法(10uF)的容量。电阻器R2和R3的阻值恒定在10千欧姆(10kΩ)。而电路的核心震荡元件——晶振,其工作频率被精确地设定为12兆赫兹(12MHz)。图3.3复位与晶振电路3.2.2温度采集电路(1)DS18B20单线数字温度传感器简介DS18B20数字温度传感器采纳了美国DALLAS半导体公司的创新网络芯片设计,其特性显著,如微小化尺寸、高效能低能耗、卓越的抗干扰性能,以及与微处理器的高度兼容性,使得集成和应用更为简便,此传感器具备9至12位的精密温度分辨率,确保了高准确度的温度测量性能,传感器有三个管脚:在电子系统中,DQ代表数字化信号输入端,而GND特指电源地线,VDD则标识电源输入端口[14]。图3.4DS18B20实物图(2)温度采集电路DS18B20数字温度传感器凭借内置计时脉冲机制,创新地实现了精确的温度测度性能。该传感器所依赖的低温效应振荡器生成的时间信号,通过计数高温效应振荡器产生的时钟周期来实现。该温度数据采用16位二进制编码储存,支持通过主机执行读取指令,遵循从低位到高位的读取顺序。其与单片机的连接如图:图3.5温度采集电路3.2.3按键电路P1.1将P1.6和P3.2端口配置为输入模式,并将其一端与大地相连。每当发生按键按下事件时,相应的端口会立即接收到一个低电平的输入信号。在系统启动初期,优先运行键盘扫描子程序,通过交互式查询的方式识别各个键位的状态,借此确定温度设置的初始值。具体来说,K1键被设计用于设定温度的上下限范围,每当K2键被触发时,它会逐次将初始设定值增加一个单位;反之,K3键的作用在于递减数值,每次按下则相应减少初始设置值的数量。图3.6独立键盘连接电路3.2.4温度显示电路(1)数码管介绍数码管,是一种专为表现数字及其它信息的电子元件。该装置采用半导体材质构建,具备显著的高亮度和低能耗特性。数码管内部结构包含一个由金属丝网构成的阳极,以及多个呈数字形态的阴极,这些阴极构成了其主体设计。数码管内部通常填充有低压气体,常见组合包括氖气以及适量的汞和/或氩气。在对某个阴极施加电荷的过程中,数码管会呈现特定的色彩光谱,这种现象源于管内气体的作用,普遍表现为橙色或绿色。实物图见下图:图3.7数码管实物图(2)数码管显示电路在本设计中,我们采用了4位共阳极数码管作为显示模块,其与单片机硬件的接口配置详见图3.8。共阳型数码管,其构造特征是所有发光二极管的阳极共享一个公共阳极(COM)。在使用时,公共阳极需连接到+5V电源。具体操作原理是,当某个字段的阴极被设置为低电平时,该字段的发光二极管就会发光;反之,阴极为高电平时,相应字段则保持熄灭状态。该设备的读数范围限定在0至99.9摄氏度,以摄氏度为单位进行精确计量。从P0.0至P0.7接口分别连接b、c、d、e、f、g和dp,为了确保单片机能输出稳定的高电平和低电平信号,P0端口采用了10千欧姆的上拉电阻进行驱动。P2.3实现对P2.6端口的精确管控,只需任一端口输出低电平信号,即可激活对应的数码管显示。图3.8数码管显示电路3.2.5电机驱动电路在本设计中采用单片机的I/O接口生成PWM信号,经由L9110达林顿阵列驱动器调控,进而精确控制12伏直流无刷风扇电机的转速,实现了有效的速度调节[15]。键盘用于设定温度,其通过软件将控制指令输入到单片机,随后单片机通过P2.0、P2.1端口产生并输出相匹配的PWM(脉宽调制)信号。脉冲信号经由L9110芯片传输,有效地调控直流电机的控制电路,从而实现电机转速的自动调节与启停的智能化操作。电机转速受环境温度动态影响:随着环境温度上升,电机转速呈现正比增长;相反,温度下降会导致转速减缓。当环境温度降至设定阈值以下,电机运作会自动暂停;反之,当温度超越预设范围,电机则会重新启动运行。电路配置见图3.9,风扇电机连接在L9110的OA、OB引脚,通过控制P2.0、P2.1引脚输出PWM信号,可以调控风扇直流电机的速度及其启停状态。图3.9风扇电机驱动与调速电路本研究采用了12伏特直流无刷风扇电机作为核心组件。L9110单达林顿反向驱动器在接收5VTTL信号或6至15VCMOS信号输入时,可输出高达50V的电压和500mA的电流。其稳定工作的环境温度区间限定在0至70摄氏度。在本体系结构中,单片机通过其I/O接口输出5伏特的TTL信号,从而确保L9110能充分驱动风扇电机。

4系统软件设计本设计使用keiluvision5软件编写程序,使用Proteus进行仿真。4.1软件设计框图本文设计的程序有以下基本分组成:主程序、温度采集程序、温度显示程序、按键程序及电机驱动程序,通过主程序调用各个子程序实现本系统的控制。软件设计框图如图4.1:图4.1软件设计框图4.2功能流程4.2.1主程序流程程序设计包含多个关键组成部分:主程序、DS18B20初始化、温度转换、温度读取、键盘扫描、数码管显示、温度处理以及风扇电机控制函数。DS18B20初始化负责传感器的启动配置;温度转换函数实现环境温度的实时采集;温度读取函数负责从传感器获取数据并进行转换处理;键盘扫描函数用于调整设定的初始温度值;温度处理函数分析采集数据,为调整电机转速提供依据;风扇电机控制函数根据温度值调整电机的转速和运行状态。主程序流程图4.2:图4.2主程序流程图4.2.2温度采集流程当主程序启动后,温度采集模块会先对DS18B20温度传感器进行初始化设置。随后延时发送0xCC和0xBE指令,传感器依次读取温度数据的低字节和高字节。最后将读取的字节数据转换为实际温度值。DS18B20温度获取程序流程图见下图4.3所示:图4.3温度检测流程图4.2.3按键流程按键是用于设定温度的上限,为此使用了三个按键,K1按键用于选择温度上下设置还是温度下限设置,K2按键根据K1按键选择的上限或者下限温度值进行温度加操作,K3按键对选择的温度上限或者下限值进行减操作。因此通过三个按键既可以实现对温度上限和下限值的设定,以方便使用。按键程序流程图见下图4.4所示:图4.4按键程序流程图4.2.4温度显示流程本系统使用四段数码管完成温度的显示,且温度显示精度为0.1度,温度显示范围为0-99.9摄氏度,为此在获取温度后需要降温度的十位数据,个位数据及小数位数据获取,然后送入对应的要显示的数码管中完成温度的显示。数码管显示程序流程图减下图4.5所示:图4.5显示程序流程图4.2.5电机驱动流程温度传感器实时监测环境温度,并将其与用户预先设定的高低温阈值进行比较。当环境温度位于预设区间时,风扇将以低速运行;一旦温度超过设定的高温限值,则自动切换至高速档位;反之,若环境温度低于设定的低温限值,风扇则会智能地停止运转。在实验中,通过设置不同的温度范围和风扇档位来观察系统能否根据实时检测到的室内温度自动调整风扇的转速。在调速过程中,系统可以平稳地调整风扇的转速,使风扇在不同档位下运转效果稳定,从而达到了良好的降温效果。此外,还测试了不同的温度范围和风扇档位的组合,发现系统可以根据不同的风扇档位实现不同的功耗和降温效果,从而在满足降温效果的同时最大程度地降低能耗。电机控制程序流程图如下图4.6所示:图4.6电机控制程序流程图5系统调试(1)程序启动后,温度采集传感器正常显示当前环境温度,但是数码管显示是乱码,没有正确的显示温度,按键功能也不灵,当按下加键时,显示并不变化。图5.1数码管乱码(2)通过按下切换按键增加消抖处理,以及在数码管显示程序中设置段码存储空间后,数码管可以正常显示当前环境温度,按键功能也得以恢复,系统运行达到预期效果。图5.2数码管正常显示(3)经过查看当前温度发现,温度传感器DS18B20有一点实际温度的偏差,可以通过在仿真上的DS18B20加减号按钮对当前采集的温度就行微调。图5.3调试温度传感器(4)通过对温度进行预设值增加或减少时,直流电机每当检测到的温度比预设温度高出5摄氏度,风扇电机的转速就增加一个等级。图5.4调试直流电机6总结与展望6.1总结本系统设计以单片机为控制中枢,搭载DS18B20型温度传感器对环境温度进行实时监控,旨在实现风扇电机转速的自动化调节。系统具备在预设区间内连续微调电机转速的能力,同时,LED数码显示屏将持续、稳定地显示出当前环境温度与用户设定温度。为便于用户干预,系统配置有两个独立操作按键,允许用户针对不同应用场景自由设定期望温度。依据环境温度与设定温度之间的偏差,系统将自动调整电机转速,从而有效实现了基于单片机技术的温控风扇功能。6.2展望伴随科技进步与智能化生活方式的日益普及,以单片机为核心的温控风扇系统将迎来更为广阔的市场前景。展望未来,该系统不仅有望持续深化在温度监测与调节层面的功能优化,更有潜力与物联网、云计算等先进科技深度融合,共同构建更为智能化、高效的居住环境管理体系。首先,通过物联网技术的应用,温控风扇系统可以实现与手机、智能音箱等设备的互联互通,用户可以通过手机APP或语音指令对风扇进行远程控制,实现更加便捷的操作体验。此外,系统还可以与智能家居系统相融合,成为智能家居生态系统的一部分,与其他智能设备共同构建智能化的家居环境。其次,随着云计算技术的发展,温控风扇系统可以将大量的数据上传至云端,通过大数据分析和机器学习算法,对用户的使用习惯、环境变化等因素进行深入挖掘和分析,从而更加精准地预测和调节风扇的运行状态,为用户提供更加个性化的服务。综上所述,基于单片机的温控风扇系统在未来将拥有更加广阔的发展空间和应用前景。参考文献罗政球.基于单片机的多功能遥控智能温控风扇设计[J].电子制作,2022,30(07):81-84.王启明,刘冬梅,周艳艳.基于单片机的智能风扇的设计与实现[J].科技视界,2019(16):11-13.张少康,尹睿,鲍琦,吴子鑫,高钊.基于单片机的智能风扇系统设计[J].电子测试,2019(01):19-20+32.李阳,赵娟.基于单片机的智能电风扇的设计[J].南方农机,2018,49(23):179-180.赵苗慧,杨兵,张仪.基于单片机的感应式温控风扇设计[J].无线互联科技,2021,18(08):40-41+59.乔琳君,魏严锋.基于STC89C52单片机的自动换气扇系统设计[J].电子设计工程,2021,29(08):173-176+181.蔡保谦,田乐,王飞,吴志浩.基于STC89C52单片机的语音控制可移动式智能温控风扇[J].山东工业技术,2020(06):83-88.厉俊.基于单片机的智能温控风扇系统的设计与实现[J].智能计算机与应用,2019,9(06):206-209+213.刘巧平,张磊,韩倩,姜瑞征.基于AT89C51单片机智能温控风扇的设计[J].自动化与仪器仪表,2017(12):83-85.乔学增.基于STC89C52型单片机温控风扇调速系统设计研究[J].佳木斯大学学报(自然科学版),2023,41(06):159-162+151.刘艳峰.基于STM32单片机的教室智能风扇控制系统的设计[J].电子制作,2023,31(10):48-51.黄平,黄焕晴,蒋少洁,梁婵娟,梁东梅,梁火层.基于STM32的智能风扇[J].科技视界,2019(24):36-37+84.王蕊.基于单片机的多功能自动调温风扇系统设计[D].郑州大学,2014.BhatiaV,BhatiaG.Roomtemperaturebasedfanspeedcontrolsystemusingpulsewidthmodulationtechnique[J].InternationalJournalofComputerApplications,2013,81(5).Tulone,S.Madden.Quorumsystemsforwirelesssensornetworks[J].2007

附录A程序代码#include<REGX52.H>#defineucharunsignedchar //uchar代替unsignedchar#defineuintunsignedint //uint代替unsignedintuchardisplay[4]={0x00,0x00,0x00,0x00};//定义显示缓冲区(初始化为0x00表示显示0000)ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0x89,0xC7}; //共阳数码管 0 123456789- H L//引脚定义: #defineSMG_XS P0 //定义数码管显示#defineIA P2_1 //电机的控制#defineIB P2_0 #defineLED1 P1_5 //指示灯1#defineLED2 P3_5 //指示灯2#defineq_kz P2_3 //(千位)数码管#defineb_kz P2_4 //(白位)数码管#defines_kz P2_5 //(十位)数码管#defineg_kz P2_6 //(个位)数码管#defineIO_18b20 P1_0//定义DS18B20接口#defineKey1 P1_1 //按键#defineKey2 P1_6 //上下限温度加按键#defineKey3 P3_2 //上下限温度减按键#defineKey4 P3_7 //实物/仿真切换按键floatwendu; //定义真实的十进制温度变量intbig_wendu; //放大10倍后的十进制温度变量(主要方便温度显示精确到小数点后一位)inthigh=35; //定义上限温度变量intlow=25; //定义下限温度变量ucharflag=0; //定义按键温度设置标志位(0:正常显示温度1:显示上限温度值2:显示下限温度值)bitjw_flag; //定义降温风扇运行指示灯标志位 //(0:指示灯1闪烁,电机50%运行1:指示灯1和指示灯2都闪烁,电机全速运行)intnum=0; //定义指示灯1、2的闪烁频率变量uintt=2; //数码管动态扫描基数为2(t=2为实物运行参数),另外(t=300为仿真运行参数)bitts=0; //定义临时调试标志位为0(0:实物运行参数1:仿真运行参数)/********************DS18B20部分******************/voiddelay_ms(uintcount) //延时函数(keil软件测试此函数运行时间约1ms){ uinti; while(count) { i=125; while(i>0){i--;} count--; }}voidds18b20_init() //初始化{ uinti; IO_18b20=0; //先将IO_18b20拉低 i=100; while(i>0){i--;} //延时一段时间803us(延时持续时间在480-960us之间即可) IO_18b20=1; //再将IO_18b20拉高 i=7; //由于DS18B20需要等待15-60US之后会自动响应拉低这个引脚 while(i>0){i--;} }bitds18b20_read_bit() //读一位函数并返回"dat"(根据DS18B20读一位字节时序编写){ uinti; bitdat; //定义位变量dat EA=0; //要操作DS18b20时先关闭定时器中断(防止定时器中断对操作DS18b20有影响,导致出错) IO_18b20=0; //先将IO_18b20拉低***(从IO_18b20拉低到读取IO_18b20上的数据状态,过程不能超过15us) i++; //小延时一下 ↑ IO_18b20=1; //再将IO_18b20拉高(释放改引脚) 不能超过15us i++; //小延时一下 EA=1; //再打开定时器中断 ↓ dat=IO_18b20; //读到的数据送到dat**(从IO_18b20拉低到读取IO_18b20上的数据状态,过程不能超过15us) i=8; while(i>0){i--;} //延时一下 return(dat); //返回读出来的数据dat}uchards18b20_read_byte() //读一个字节{ uchari,j,dat; //定义i,j,dat变量 dat=0; //dat初始化为0 for(i=0;i<8;i++) { j=ds18b20_read_bit(); //将读一位函数并返回"dat",传送到j dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里 } return(dat);//将一个字节数据返回}voidds18b20_write_byte(uchardat)//写一个字节{ uinti; ucharj; bittest; //定义临时位变量test for(j=0;j<8;j++) //for循环传递8位数据(即一个字节) { test=dat&0x01; //将dat的最低位取出来放在test dat=dat>>1; //再将dat向右移一位 if(test) { EA=0; //要操作DS18b20时先关闭定时器中断(防止定时器中断对操作DS18b20有影响,导致出错) IO_18b20=0; //先将IO_18b20拉低 i++; EA=1; //再打开定时器中断 IO_18b20=1; //再将IO_18b20拉高(释放总线) i=8; while(i>0){i--;} } else { EA=0; //要操作DS18b20时先关闭定时器中断(防止定时器中断对操作DS18b20有影响,导致出错) IO_18b20=0; //先将IO_18b20拉低 i=8; EA=1; //再打开定时器中断 while(i>0){i--;}//延时一下69us(时序时间要求大于60us小于120us即可) IO_18b20=1; //再将IO_18b20拉高 i++;i++; //小延时一下 } }}/**********************************************************/voidtemp_change() //温度转换{ ds18b20_init(); //初始化DS18B20 delay_ms(1); //延时等待1ms,时间上留有一些余地,因为DS18B20器件响应后会主动 //拉低60-240us,然后DS18B20自己会主动释放总线,即主动拉高IO口 ds18b20_write_byte(0xcc);//跳过序列号命令 ds18b20_write_byte(0x44);//发送温度转换命令}/******************************************************************/inttemperature() //获得温度函数{ inttemp; //定义温度值变量(整型变量) uchara,b; //定义变量a,b用来存放温度值的低8位和高8位 ds18b20_init(); //初始化DS18B20 delay_ms(1); //拉低60-240us,然后DS18B20自己会主动释放总线,即主动拉高IO口 ds18b20_write_byte(0xcc);//跳过序列号命令 ds18b20_write_byte(0xbe);//发送读取数据命令 a=ds18b20_read_byte();//连续读两个字节数据(a为低8位数据) b=ds18b20_read_byte(); //b为高8位数据 temp=b; //将高8位数据送到temp中 temp<<=8; //再将temp左移8位,这样高8位数据就存在temp的高8位上了 temp=temp|a;//两字节合成一个整型变量(temp是高8位"按位或"a是低8位) returntemp;//返回温度值}/****************以上为DS18B20部分****************/voiddelay(uinttime) //数码管扫描延时函数{ uinti,j; for(i=time;i>0;i--) for(j=3;j>0;j--);}voiddelay_anjian(uinttime) //按键延时去抖函数{ uinti,j; for(i=time;i>0;i--) for(j=110;j>0;j--); }voiddisp0() //正常显示当前温度函数(显示缓冲区内容){ if(wendu>0) //如果温度大于0,为正数 { SMG_XS=table[display[0]]; //显示温度数据百位值 q_kz=0;b_kz=s_kz=g_kz=1; //允许(千位)数码管位(第1个数码管)点亮 delay(t); //延时一下(消隐) q_kz=1; } else //否则温度小于0,为负数 { SMG_XS=table[10]; //显示负号"-" q_kz=0;b_kz=s_kz=g_kz=1; //允许(千位)数码管位(第1个数码管)点亮 delay(t); //延时一下(消隐) q_kz=1; } SMG_XS=table[display[1]]; //显示温度数据十位值 b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; SMG_XS=table[display[2]]&0x7f; //显示温度数据个位值,并加入小数点 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[display[3]]; //显示温度数据小数点后一位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } voiddisp1(high) //显示上限温度函数 { SMG_XS=table[11]; //显示"H" q_kz=0;b_kz=s_kz=g_kz=1; //允许(千位)数码管位(第1个数码管)点亮 delay(t); //延时一下(消隐) q_kz=1; if(high/100!=0) //如果上限温度百位不为0(表示上限温度值超过100) { SMG_XS=table[high/100]; //显示上限温度的百位 b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; SMG_XS=table[high%100/10]; //显示上限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[high%10]; //显示上限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } elseif(high>=0) //再如果上限温度值大于等于0(说明温度值是正数) { SMG_XS=table[high/10]; //显示上限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[high%10]; //显示上限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } else //否则上限温度值是负数(即零下温度值) { SMG_XS=table[10]; //显示"-"(因为是负数,所以要加"-"号) b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; high=0-high; //把上限温度值取正 SMG_XS=table[high/10]; //显示上限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[high%10]; //显示上限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } }voiddisp2(low) //显示下限温度函数{ SMG_XS=table[12]; //显示"L" q_kz=0;b_kz=s_kz=g_kz=1; //允许(千位)数码管位(第1个数码管)点亮 delay(t); //延时一下(消隐) q_kz=1; if(low/100!=0) //如果下限温度百位不为0(表示上限温度值超过100) { SMG_XS=table[low/100]; //显示下限温度的百位 b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; SMG_XS=table[low%100/10]; //显示下限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[low%10]; //显示下限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } elseif(low>=0) //再如果下限温度值大于等于0(说明温度值是正数) { SMG_XS=table[low/10]; //显示下限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[low%10]; //显示下限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } else //否则下限温度值是负数(即零下温度值) { SMG_XS=table[10]; //显示"-"(因为是负数,所以要加"-"号) b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; low=0-low; //把下限温度值取正 SMG_XS=table[low/10]; //显示下限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[low%10]; //显示下限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } }voidSMG_disp() //数码管显示函数 { if(flag==0) //如果flag=0 { disp0(); //正常显示当前温度函数(显示缓冲区内容) } if(flag==1) //如果flag=1 { disp1(high); //显示上限温度函数 } if(flag==2) //如果flag=2 { disp2(low); //显示下限温度函数 } }voidxitong_init() //系统初始化等待DS18b20彻底转换完成,未完成之前数码管显示""{ EA=1; //开总中断 TMOD=0x01; //定时器0为方式1 TH0=0xff; //12M晶振定时时间0.25ms0xff06 TL0=0x06; ET0=1; //开定时器0中断 TR0=0; //先不启动定时器0 SMG_XS=table[10]; //数码管显示"" q_kz=b_kz=s_kz=g_kz=0; //允许4位数码管显示 temp_change(); //发送温度转换命令函数 delay_ms(980); //等待延时980ms>750ms,时间上留有一些余地; //(因为DS18b20出厂默认最大的温度转换时间为750ms, //为了防止第一次读出来的温度值是错误的值(典型错误值一般是85℃ //程序中的延时时间需要至少为750ms)*/}voidwendu_data_cl() //温度数据处理{ staticuinti=0; //定义循环变量 i++; //i自加1(i开始从零开始自加1) if(ts==0) //0:实物运行参数 { if(i==3000){i=0;}//如果i=3000,i清0(使i控制在0-3000之间),i的范围决定温度数据刷新的快慢 } else //1:仿真运行参数 { if(i>=400) {i=0;} } if(i==0) //如果i=0,执行温度转换 { temp_change();//发送温度转换命令函数 } if(i==100) //如果i=100,处理DS18B20送过来的数据,同时加以处理 { //为了显示精确小数点后一位的温度值 wendu=temperature()*0.0625;//得到真实十进制温度值,因为DS18B20 //可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度 if(wendu<=low) //温度值低于下限温度(表示温度过低,不能降温,则降温电机风扇不运行) { TR0=0; //关闭TR0 LED1=LED2=1; //指示灯1指示灯2都不亮 IA=IB=0; //降温电机风扇不转 } elseif(wendu>=high)//温度值高于上限温度(表示温度过高,需降温,则降温电机风扇全速运行) { jw_flag=1; //1:指示灯1和指示灯2都闪烁 IA=1;IB=0; //降温电机风扇全速运行 TR0=1; //打开TR0 } else //否则温度在正常温度范围(表示温度适当,需维持温度,则降温电机风扇50%运行) { jw_flag=0; //0:指示灯1闪烁 TR0=1; //打开TR0 } big_wendu=wendu*10; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字 if(wendu<0) //(如果温度数据是负数)判断第一位显示正数还是负数 { big_wendu=0-big_wendu;//再把数据转换成正数,方便数据显示 } else //否则温度数据是正数 { display[0]=big_wendu/1000;//显示温度数据百位值 } big_wendu=big_wendu%1000; display[1]=big_wendu/100; //显示温度数据十位值 big_wendu=big_wendu%100; display[2]=big_wendu/10; //显示温度数据个位值 display[3]=big_wendu%10; //显示温度数据小数点后一位 } }voidanjian_cl() //按键处理函数{ if(Key1==0) //温度上下限设置按键按下 { delay_anjian(5); //延时去抖 if(Key1==0) //再判断温度上下限设置按键是否按下 { flag++; //按键温度设置标志位加1 while(flag==3){flag=0;}//当flag=3.flag清0(让0<=flag<=2) q_kz=b_kz=s_kz=g_kz=1; //关闭数码管显示 TR0=0; //关闭TR0(关闭定时器0) LED1=LED2=1; //指示灯LED1、2灯关闭 IA=IB=0; //关闭降温电机 } while(Key1==0); //等待按键松开 } if(flag==1) //允许调整上限温度值 { if(Key2==0) //上下限温度加按键按下 { delay_anjian(5); //延时去抖 if(Key2==0) //再判断上下限温度加按键是否按下 { if(high>low) //如果上限温度>下限温度 { high++; //上限温度自加1 while(high==126){high=low+1;}//当上限温度加到126℃时,上限温度设定为比下限温度高1℃ q_kz=b_kz=s_kz=g_kz=1; //关闭数码管显示 } } while(Key2==0); //等待按键松开 } if(Key3==0) //上下限温度减按键按下 { delay_anjian(5); //延时去抖 if(Key3==0) //再判断上下限温度减按键是否按下 { if(high-low

温馨提示

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

评论

0/150

提交评论