室内温度报警控制系统设计

合集下载

基于单片机的室内温度控制系统设计与实现

基于单片机的室内温度控制系统设计与实现

基于单片机的室内温度控制系统设计与实现1. 本文概述随着科技的发展和人们生活水平的提高,室内环境的舒适度已成为现代生活中不可或缺的一部分。

作为室内环境的重要组成部分,室内温度的调控至关重要。

设计并实现一种高效、稳定且经济的室内温度控制系统成为了当前研究的热点。

本文旨在探讨基于单片机的室内温度控制系统的设计与实现,以满足现代家居和办公环境的温度控制需求。

本文将首先介绍室内温度控制系统的研究背景和意义,阐述其在实际应用中的重要性和必要性。

随后,将详细介绍基于单片机的室内温度控制系统的设计原理,包括硬件设计、软件编程和温度控制算法等方面。

硬件设计部分将重点介绍单片机的选型、传感器的选取、执行机构的搭配等关键环节软件编程部分将介绍系统的程序框架、主要功能模块以及温度数据的采集、处理和控制逻辑温度控制算法部分将探讨如何选择合适的控制算法以实现精准的温度调控。

在实现过程中,本文将注重理论与实践相结合,通过实际案例的分析和实验数据的验证,展示基于单片机的室内温度控制系统的实际应用效果。

同时,还将对系统的性能进行评估,包括稳定性、准确性、经济性等方面,以便为后续的改进和优化提供参考。

本文将对基于单片机的室内温度控制系统的设计与实现进行总结,分析其优缺点和适用范围,并对未来的研究方向进行展望。

本文旨在为读者提供一种简单、实用的室内温度控制系统设计方案,为相关领域的研究和实践提供有益的参考。

2. 单片机概述单片机,也被称为微控制器或微电脑,是一种集成电路芯片,它采用超大规模集成电路技术,将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种IO口和中断系统、定时器计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、AD转换器等电路)集成到一块硅片上,构成一个小而完善的微型计算机系统。

单片机以其体积小、功能齐全、成本低廉、可靠性高、控制灵活、易于扩展等优点,广泛应用于各种控制系统和智能仪器中。

基于STC89C51单片机的温度控制报警系统设计

基于STC89C51单片机的温度控制报警系统设计

基于STC89C51单片机的温度控制报警系统设计摘要:本文基于STC89C51单片机设计了一种温度控制报警系统,通过温度传感器检测环境温度,并根据设定的温度范围控制风扇运转并发出报警信号,以实现室内温度自动控制。

本文介绍了系统硬件设计、软件设计以及测试实验,并通过实验数据验证了系统的可行性和稳定性。

关键词:STC89C51单片机;温度控制;报警系统;温度传感器一、引言随着科技的不断发展,自动化控制技术在各个领域得到广泛应用。

温度自动控制是其中的一个重要应用方向。

在家庭、工厂以及医院等场所,温度的合理控制对于人们的身体健康和环境的稳定运转都有着重要的影响。

因此,设计一种基于STC89C51单片机的温度控制报警系统具有重要的研究价值和应用前景。

二、系统设计2.1 系统功能本系统主要功能为:实时检测环境温度,根据设定的温度范围控制风扇运转,并发出报警信号以实现室内温度自动控制。

2.2 系统硬件设计本系统主要硬件设计包括:温度传感器模块、LED指示灯、蜂鸣器、风扇以及STC89C51单片机。

温度传感器模块采用DS18B20型号,通过单总线接口与单片机相连,用于检测室内温度。

LED指示灯用于显示系统状态,包括运行状态和报警状态。

蜂鸣器用于发出报警信号。

风扇用于控制系统温度,实现温度自动控制。

STC89C51单片机负责系统的数据采集、运算和控制。

2.3 系统软件设计本系统的软件设计分为两部分:系统初始化和主程序部分。

系统初始化包括:串口初始化、温度传感器初始化、LED指示灯初始化、蜂鸣器初始化、风扇初始化等,主要用于对系统各个硬件进行初始化设置。

主程序部分包括:温度采集、温度判断、风扇控制和报警控制等。

主要通过程序实现室内温度的采集和判断,并根据设定温度范围控制风扇和报警控制信号等。

三、实验结果在实际测试中,将系统置于模拟室内环境中进行测试,测试数据显示本系统能够实现温度自动控制,并在温度超出设定范围时发出报警信号。

防盗与恒温系统的设计与制作

防盗与恒温系统的设计与制作

防盗系统与恒温系统的协同工作
防盗系统与恒温系统的故障处理和恢复机制
系统集成技术实现
防盗系统与恒温系统的集成设计
恒温系统的工作原理和实现方法
防盗系统与恒温系统的集成方案设计
防盗系统的工作原理和实现方法
防盗系统与恒温系统的集成调试和优化
防盗系统与恒温系统的集成应用案例分析
系统集成设计要点
恒温系统需要具备良好的温度控制能力和节能效果,同时要考虑到用户的舒适度和健康需求。
防盗系统设计要点
执行器的选择:根据防盗需求选择合适的执行器,如锁具、灯光等
报警器的设计:报警器需要具备及时性、准确性和易用性等特点
系统的调试和优化:在实际应用中不断调试和优化防盗系统,提高其性能和可靠性。
防盗系统的组成:传感器、控制器、执行器、报警器等
传感器的选择:根据不同的防盗需求选择合适的传感器,如红外传感器、门磁传感器等
车辆安防:防盗系统用于保护车辆安全,防止盗窃等犯罪行为
恒温系统:用于保持室内温度恒定,提高居住舒适度,降低能耗
家庭应用场景
防盗系统:保护家庭财产安全,防止盗窃
恒温系统:保持室内温度恒定,提高居住舒适度
节能环保:降低能耗,减少碳排放
智能控制:通过手机App远程控制,方便快捷
商业应用场景
商场:防盗与恒温系统可以保护商品和顾客的安全,同时保持舒适的购物环境。
恒温系统工作原理
执行器接收到控制信号后,根据信号的类型和强度,调整被控对象的温度,使其达到设定值。
当被控对象的温度达到设定值后,控制器停止向执行器发出控制信号,恒温系统进入稳定运行状态。
恒温系统的主要部件包括温度传感器、控制器、执行器和被控对象。
温度传感器负责检测被控对象的温度,并将温度信号传递给控制器。

室内温度自动调节控制系统课程设计

室内温度自动调节控制系统课程设计
当符号位S=0时,表示测得地温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得地温度值为负值,要先将补码变成原码,再计算十进制数值.
如图表1,DS18B20完成温度转换后,就把测得地温度值与RAM中地TH、TL字节内容作比较.若T>TH或T<TL,则将该器件内地报警标志位置位,并对主机发出地报警搜索命令作出响应.因此,可用多只DS18B20同时测量温度并进行报警搜索.
在64位ROM地最高有效字节中存储有循环冗余检验码(CRC).主机ROM地前56位来计算CRC值,并和存入DS18B20地CRC值作比较,以判断主机收到地ROM数据是否正确.
温度LSB
温度MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
保留
保留
CRCLeabharlann 表1DS18B20地测温原理是这这样地,器件中低温度系数晶振地振荡频率受温度地影响很小,用于产生固定频率地脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生地信号作为减法计数器2地脉冲输入.器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生地时钟脉冲进行计数进而完成温度测量.计数门地开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应地一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应地一个基数值.
PWM音频输出:直接驱动扬声器地方式,扬声器两端接PWM+和PWM-,此状态输出时,PWM+/PWM-两端不可短路、不可接电容电阻到地.如需采用此状态外接功放,可用差分方式输出到功放.
DAC音频输出:外接功放驱动扬声器方式,不可直接驱动扬声器.PWM+/DAC端做音频输出,PWM-端腾空.DAC端需接一个1.2K电阻和104电容到地,再把音频输出给功放.

室内温度报警控制系统设计

室内温度报警控制系统设计

室内温度报警控制系统设计
一、系统简介
1、本温度报警控制系统是一个程序控制的系统,用于对室内温度的
监测和报警。

它可以监测室内温度是否超出指定的范围,并及时发出报警
信息。

2、系统由控制模块、计算机模块和显示模块组成。

它主要目标是检
测室内温度并向用户发出报警信号,以确保人们在安全、正常的温度范围
内适应并且满足室内环境的调节需求。

二、系统流程
1、控制模块采用微控制器,接收到检测到的室内温度信号后,将其
发送给计算机模块。

2、计算机模块以及存储程序,将收到的温度信号进行处理,并将得
出的结果与设定的温度范围进行比较,以确定室内是否超出设定范围。

3、如果室内温度超出设定的范围,计算机模块将发出报警信号,并
通过显示模块将报警信号发送给用户,以及报警声音或者警报灯以提醒用户。

4、显示模块用以显示正常室内温度及设定的温度范围;而当室内温
度超出设定的范围时,显示模块将显示报警信号及相关信息。

三、系统硬件
1、控制模块:采用微控制器,负责接收室内温度信号及发出报警信号。

2、计算机模块:采用上位机,具有程序存储及运行功能;能够存储及运行室内温度。

基于PCS7的室内温度控制系统设计

基于PCS7的室内温度控制系统设计

基于PCS7的室内温度控制系统设计摘要本文论述了室内温度控制的控制原理,由PC机和西门子PCS7组成的集散控制系统,上位机主要完成参数设定、数据处理等任务;而下位机主要完成数据采集、处理等实时控制任务。

本设计是将温度传感器采集到的室内温度通过变送器将其送给PLC主模块,经过CPU的处理然后输出控制信号,控制三台压缩机和报警灯。

在上位机中通过P CS7的STEP7中的SFC(顺序控制)和CFC(连续控制)进行温度控制,以此完成PLC程序实现。

当温度低于25度时,压缩机不工作,空调不启动;当温度高于30度时,启动一台机组Y0,空调开始制冷;当温度高于36时再启动一台Y1,制冷效果加强,当温度减低到30度时;停止Y0,制冷下降,降到26度时两台都停止,空调此时相当于一台风扇,没有制冷效果;当温度低于23度时,Y2会发出报警,并能利用上位机实现实时监控,并且能够控制下位机。

第一章西门子PCS7简介1.1 PCS7总体介绍随着工业自动化过程控制理论和计算机技术的迅速发展,以及生产工艺对控制系统的可靠性、运算能力、扩展能力、开放性、操作及监控水平等方面提出了愈来愈高的要求。

传统的DCS系统已经不能满足现在过程自动化控制的设计标准和要求,SIMATIC PCS 7过程控制系统就是在这种形势下开发的迎合需求的新一代过程控制系统。

SIMATIC PCS 7是西门子公司在TELEPERM系列集散系统和S5,S7系列可编程控制器的基础上,结合最先进的电子制造技术、网络通讯技术、图形及图像处理技术、现场总线技术、计算机技术和先进自动化控制理论,面向所有过程控制应用场合的先进过程控制系统。

SIMATIC PCS 7的突出特点有:◆基于全集成自动化思想◆与PROFIBUS现场总线有机地结合在一切◆吸收了各种先进技术,面向工艺◆更分散的系统配置,特别适用于分散的过程控制应用场合◆系统配置灵活,易于扩展◆模块化结构,通用的硬件模块◆强大的系统软件,组态与编程轻松简单◆丰富的人机界面产品提高了监控与管理的水平1.2 PCS7中SFC介绍SFC也是一种图形组态工具,它也采用了IEC-1131标准。

室内温度报警控制系统设计

室内温度报警控制系统设计

室内温度报警控制系统设计一、概述二、系统组成与工作原理1.温度传感器:负责对室内温度进行实时监测,并将采集到的数据传输给控制器。

2.控制器:接收温度传感器采集的数据,并与预设的温度阈值进行比较。

当温度超出设定范围时,控制器将触发报警器,并发送控制信号给执行机构。

3.报警器:当控制器发出报警信号时,报警器会发出声光警报,以引起人们的注意。

4.执行机构:根据控制器的指令,执行机构负责进行温控操作,可以通过开关制冷设备或加热设备等方式,将室内温度恢复到设定范围内。

系统工作原理如下:1.温度传感器实时监测室内温度,并将温度数据传输给控制器。

2.控制器接收到温度数据后,与预设的温度阈值进行比较。

3.如果温度超出设定范围,控制器触发报警器,并发送控制信号给执行机构。

4.报警器发出声光警报,提醒人们注意室内温度异常。

5.执行机构根据控制器的指令,开启或关闭相应的温控设备,使室内温度恢复到设定范围内。

三、系统设计要点1.温度传感器选择:根据实际需要选择合适的温度传感器,如热敏电阻、热电偶或半导体传感器等。

要考虑传感器的测量范围、测量精度以及信号输出等特性。

2.控制器设计:控制器应具备接收温度传感器数据、比较温度阈值、触发报警器、发送控制信号等功能。

可以采用微控制器或单片机实现控制器的功能。

3.报警器选择:报警器应具备发出声光警报的能力,可以选择蜂鸣器或喇叭作为声音输出装置,并配置相应的指示灯作为光源。

4.执行机构设计:执行机构应根据不同的温度控制需求选择合适的设备,如空调、暖气等。

要考虑设备的功率、响应速度以及控制方式等特性。

5.系统可靠性设计:在设计室内温度报警控制系统时,要考虑系统的可靠性。

例如,在温度传感器故障或通信故障时,系统应能够进行故障检测并发出相应的报警。

四、总结室内温度报警控制系统设计涉及到温度传感器的选择、控制器的设计、报警器的选择、执行机构的设计以及系统可靠性设计等方面。

通过合理的设计和选择,可以实现对室内温度的有效监测和控制,提高室内温度的舒适度,并保证系统的可靠性和安全性。

室内温度多点检测系统设计

室内温度多点检测系统设计

法 是将采 样 的模 拟 信 号进 行 长 距 离 传 输 后 再 进 行 A D转换 , / 在此 过 程 中就 会 产 生 长 线 传 输 , 检 测 多
点 切换及 放 大 电路 零 点 漂 移 等 因素 造 成 的 温 度误 差 , 了保证 测量数 据准确 性 , 必须采用措 施解决 为 就 上述 问题 , 就使 得 系 统设 计过 程 变 得复 杂 化 。而 这 现在 由于数 字 温 度 芯 片 D 1B 0具 有 的 功 能集 成 S8 2
W ANG h n b i Z a . e
( e at n f l to i a dIfr t no h niU ies yo eh ooy Ha z o g7 30 , hn ) D pr met e rnc n omai f a x nvri f c n lg , n h n 2 03 C ia oE c n a d S n t a o b titi n io me tltmpea u e r ro o q e, mal tr g n O o h tt e src n e vr n n a e l rtr.
Ke r s tmp r t r a u e n ;mu io n ;t r s od;I e e au e s n o y wo d : e e au e me s rme t h p it h eh l C t mp r t r e s r
2 1 年 第1 01 期

中 图分 类 号 :P 1 T31
文献 标 识 码 : 文 章 编 号 :09— 52 2 1 )1— o 0一 3 A 10 2 5 (0 1O 0 2 O
室 内温 度 多 点 检 测 系统 设 计
王 战备
( 陕西理工学院电信系 , 中 73 3 汉 20 )
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计说明书设计名称:计算机控制技术课程设计题目:室内温度报警控制系统设计学生姓名:专业:电气工程与自动化班级: 11自动化(2)学号: XXXXXXXXXXXX指导教师:陈广义日期:年月日课程设计任务书专业年级班一、设计题目室内温度报警控制系统设计二、主要内容设计基于DS18B20的数字式室内变电站温度控制系统,控制程序主要包括主程序、读出温度子程序、按键子程序、控制风机子程序等。

要求能检测、显示及通过控制排气风机来降低室内温度。

三、具体要求1.对室内温度进行检测及控制。

温度显示范围:00.0゜C~+99.9゜C,精度误差在0.1゜C以内2.温度控制范围:室温~60゜C3.能设置温度上限,下限,并可随时修改4.LED数码管直读显示实测温度,设置温度上限温度,下限温度(用键控制设定温度)5.温度等于上限时,报警;根据所测温度所在的界限控制三台风机的运行状态。

6.温度控制(风机)启/停键控制系统的启动和停止四、进度安排五、完成后应上交的材料1.课程设计报告。

2.程序清单(电子版)六、总评成绩指导教师签名日期年月日系主任审核日期年月日目录1、设计方案论述1.1 简述1.2 控制方法介绍1.3 设计功能介绍2、控制系统设计2.1 系统硬件电路设计2.2.1 电路图、各部分的作用说明 2.1.2 元件、器件介绍2.2 系统软件设计2.2.1 流程图2.2.2 说明3、系统调试过程叙述4、总结5、参考文献1、设计方案论述1.1简述本课题为室内温度报警控制系统设计:由于控制对象为室内空气、有较大的流动性,且对温度控制的精度要求不高,所以利用简单开关式温度控制方法。

该系统利用数字式温度传感器测温,采用温度开关控制算法来控制三台风机的工作状态,来达到调节室内温度的目的。

1.2控制方法介绍简单的开关式温度控制:通过设定温度上、下限温度进行简单的开关报警与控制。

这种方法的缺点是不能进行温度的精确控制,适合于要求不高的场合。

1.3设计功能介绍显示功能:前三个数管在非设定状态时显示三台风机的运行状态,第三个数码管在设定状态时用来指示现在修改的参数。

后三个数码管显示测量温度值并在设定状态期间显示上、中、下三个不同的温度设定值。

温度设定功能:当按键一第一次被按下就进入温度下限设定状态,第三个数码管显示最低一横指示现在在修改下限。

后三个数码管则显示当前下限值。

进入设定状态后,通过按第二、三个键就可以在允许的范围内设定下限或上限值。

中限值由上下限之和除2产生。

按键一第二次被按下则显示中限温度但不可进行修改,第三个数码管显示中间一横指示现在在显示中限;按键一第三次被按下则显示上限值,第三个数码管显示中间一横指示当前在修改上限。

温度控制功能:温度控制功能:本系统有三路继电器输出,分别控制三组电机的启动与关闭。

测量温度T与设定温度T上、T中、T下以及电机工作状态关系如下:当T > T上时,三台电机同时工作。

当T中< T <T上时,两台电机同时工作。

当T下< T < T中时,一台电机工作。

当T < T下时,关闭全部电机。

0-全部停机,I-1台风机工作,II-2台风机工作,III-3台风机工作。

但为了防止风机频繁切换,所以当温度从一个界限降到另一个界限时并不立即关掉一台风机,而是要降到下一个界限减一度的时候才关掉一台风机。

2、控制系统设计2. 1系统硬件电路设计2.1.1 电路图、各部分的作用说明按键电路由四个按键组成用于温度的设定、温控系统的开关。

显示电路由六个数码管组成用于各种数据及状态的显示。

而测温电路主要由DS18B20组成。

2.1.2 元件、器件介绍本电路的单片机采用Atmel公司的AT89S52单片机。

最小系统该单片机、按键和显示组成。

而温度传感器采用的是DS18B20。

DS18B20采用数字化技术,能以数字形式直接输出被测温度值,具有测温误差小、分辨力高、抗干扰能力强、能够远程传输数据、用户可设定温度上、下限、有越限自动报警功能、自带串行总线接口等优点,适配各种微控制器(MCU),含微处理器(uP)和单片机(uC),是研制和开发具有高性价比的新一代温度测控系统所必不可少的核心器件。

2.2系统软件设计2.2.1 流程图1、总流程图2、温控程序流程图3、读键程序流程图4、按键判断流程图5、选择键处理流程图6、加键处理流程图7、减键处理流程图8、温控控制键处理流程图9、Time0 中断服务程序流程图2.2.2 说明系统开机首先要进行初始化,包括个变量的初始化和中断程序的初始化,最后开系统中断开始工作。

本系统的中断服务程序的主要工作是更新各个时间标志和调用显示程序。

根据设定是每1毫秒发生一次中断。

本系统的测温间隔由DEF_CHECK_INTERVAL这个预定义设定。

具体时间间隔是DEF_CHECK_INTERVAL*250毫秒。

如果测温时间间隔已到相应的标志位flag_check_interval就要置位以便进入测温程序。

而检测按键的间隔则由flag_50ms这个为变量来控制。

每当这个标志置1便可以进入检测按键程序。

检测按键程序采用了软件去抖动,就是第一次检测到有按键被按下后就保存该键值并开始计时50毫秒,50毫秒已到就再次检测按键,如果这次检测到的按键与已保存的键值相等就确定该键值是用户按下产生的。

然后在把这个键值和上次有效键值比较,如果相等就是说这个是重复键。

为了预防用户按下按键不放参数变化过快的现象,我们还要判断100毫秒标志位有没有置位,如果100毫秒标志为1则把这个键值传送个按键判断程序,如果为0则当无效键处理。

如果新建值和上次有效键键值不相等,就是说这个键是新键,马上把这个键值传送个按键判断程序。

按键判断程序接收到键值就根据该键值调用相应的按键处理程序。

温控程序则是以温度和现在开动风机的数量来控制三台风机的状态。

显示程序负责人机对话。

前三个数管在非设定状态时显示三台风机的运行状态,第三个数码管在设定状态时用来指示现在修改的参数。

后三个数码管显示测量温度值并在设定状态期间显示上、中、下三个不同的温度设定值。

3、系统调试在确定硬件能正常工作后系统调试工作主要就是软件的调试了。

我们首先调试显示程序。

从最简单的单个数码管的显示开始,然后逐步向前。

而不是把整个显示程序写好在调试。

这样可能会有很多错误,一下子就被吓得没信心了。

显示程序调试成功后我们接着就可以进行按键程序的编写及调试了。

也是从最简单的工作做起,就是直接检测有没有按键,成功后再加软件去抖动,然后再加重复键和新键的处理程序。

一步一步,最后一个较完美的按键程序就完成了。

做完按键我们就分开两路一些同学搞DS18B20的程序,另外一些同学则负责温度控制程序。

但是还没有测出温度是没有温度值的,所以温控程序的开发就用读随机的方法模拟“可变的温度值”。

在两部分工作都搞完后我们就联合调试了,大家都很高兴的看到显示结果但是显示会随机出现一些莫名其妙的数值。

这个问题困扰了我们很久。

因为分析程序都没发现什么错误会出现这种情况。

最后我们决定逐步调试,先是去掉测温程序发现显示正常,按键也正常。

我们就怀疑是不是按键和测温会有相撞。

于是我们就加入测温程序,撤去按键程序。

发现显示还是有问题。

我们就确定是测温的问题,但是无论怎样分析都是发现测温程序之正确无误的。

无奈!一些同学便乱试碰碰运气。

最后发现把测温程序移到中断程序便不会发生错误。

惘然大悟。

原来是中断的问题。

因为如果在测温的过程中如果发生中断,那就会破坏测温程序。

因为测温程序对时间的连续性要求非常严格。

最后我们在进入测温前禁止全局中断,测温完成后再开中断就解决了最大的问题。

4、总结通过这次课程设计,在老师的指导下,我基本上学会用C语言开发单片机程序,发现用C语言编写单片机程序很容易实现自己的想法,不用太顾及寄存器的使用、中断向量的编写及免去了一些琐碎的跳转指令,而且C语言调试程序相当方便。

不过这些都需要有扎实的汇编基础,不然在写短延时的时候就会束手无策。

通过这次课程设计我进一步学习了一个系统开发的步骤,首先要把整个系统的硬件系统搞出来,然后按照要求开始做软件的流程图。

在这之后就一步一步地按照流程图编写程序。

最后就是体会到了用模块化编程的好处。

用模块化编程可以把大问题细分成一个个小问题。

各个模块各司其职,然后合并成一个完整的程序。

5、参考6、附录(程序清单)//Cautions://temp : temperature//sel : select//whc : which//con : content//disp : display#include <reg52.h>#include <absacc.h>#include <stdlib.h>#define led_data XBYTE[0xE000]#define led_sel XBYTE[0xC000]#define key_add XBYTE[0xA000]#define disp_start_pos 3 //value from 0 to 3 are welcomed#define DEF_CHECK_INTERVAL 4#define MAX_TEMP_MAX 250#define MAX_TEMP_MIN 200#define MIN_TEMP_MAX 150#define MIN_TEMP_MIN 100sbit DQ=P1^0;unsigned char code dot_temp[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};//data_disp : led display arrayunsigned char data data_disp[6] = {0x00,0x00,0x00,0x00,0x00,0x00}; unsigned int data setting[3] = {0x64,0x96,0x0C8};unsigned int cur_temp = 200;unsigned char data count_50ms = 0;unsigned char data count_100ms = 0;unsigned char data count_250ms = 0;unsigned char data count_check_interval = 0;unsigned char data old_key_val = 0;unsigned char data working_fans = 0;//cur_pos : current displaying ledunsigned char data cur_pos = 0;//flash_cur_pos : just for flashing ledunsigned char data flash_cur_pos = 0;//cur_var : current modifying settingunsigned char data cur_var=0;//sys_statue : flags of the systemunsigned char bdata sys_statue = 0;//2ms reachedsbit flag_1ms = sys_statue^0;//50ms reachedsbit flag_50ms = sys_statue^1;//100ms reachedsbit flag_100ms = sys_statue^2;//500ms reachedsbit flag_250ms = sys_statue^3;//key pressed,system parameter is being modifyingsbit flag_modifying = sys_statue^4;//for common usesbit flag_temp = sys_statue^5;//for temperature check intervalsbit flag_check_interval = sys_statue^6;//cooling systemp enabled or notsbit flag_sys_enabled = sys_statue^7;void divide_con(unsigned int con_disp){unsigned char codetab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};unsigned int temp = 0;//138/100=1temp = con_disp / 100;data_disp[disp_start_pos] = tab[temp];//138-100*1=38con_disp = con_disp - 100 * temp;//38/10=3;temp = con_disp / 10;temp = tab[temp];//display radix pointdata_disp[disp_start_pos+1] = temp | 0x80;//38%10=8temp=con_disp%10;data_disp[disp_start_pos+2] = tab[temp];}void disp(void){//flashingled_data = 0x00;led_sel = 0xff;led_data = data_disp[cur_pos];led_sel = ~(1<<cur_pos);if(cur_pos<6){++cur_pos;}else{cur_pos=0;}}/*unsigned char update_disp(unsigned char whc_segment) {}*//*unsigned int read_temp(void){cur_temp += 20;if(cur_temp > 600){cur_temp = 200;}return(cur_temp);}*/unsigned char key_press(void){unsigned char data whc_key=0;led_data = 0x00;led_sel = 0xFE;whc_key = key_add;whc_key = ~whc_key;return(whc_key);}void key2_process(void)if(cur_var == 1){if(setting[0] < MIN_TEMP_MAX){setting[cur_var-1] = setting[cur_var-1] + 10;divide_con(setting[cur_var-1]);}}else if(cur_var == 3){if(setting[2] < MAX_TEMP_MAX){setting[cur_var-1] = setting[cur_var-1] + 10;divide_con(setting[cur_var-1]);}}setting[1] = setting[0] + setting[2];setting[1] = setting[1] >> 1; // div 2}void key3_process(void){if(cur_var == 1){if(setting[cur_var-1] > MIN_TEMP_MIN){setting[cur_var-1] = setting[cur_var-1] - 10;divide_con(setting[cur_var-1]);}}else if(cur_var == 3){if(setting[cur_var-1] > MAX_TEMP_MIN){setting[cur_var-1] = setting[cur_var-1] - 10;divide_con(setting[cur_var-1]);}}setting[1] = setting[0] + setting[2];setting[1] = setting[1] >> 1; // div 2}void key4_process(void)flag_sys_enabled = ~flag_sys_enabled;if(~flag_sys_enabled){data_disp[0] = 0x3F;data_disp[1] = 0x3F;data_disp[2] = 0x3F;}}void key_process(unsigned char key_kpval){//wait until release// key1 pressd and now release//times cur_var_before cur_var_after // 1 0 1// 2 1 2// 3 2 3// 4 3 4if(key_kpval == 1){data_disp[0] = 0x00;data_disp[1] = 0x00;data_disp[2] = 0x00;flag_modifying = 1;if(cur_var == 0){data_disp[2] = 0x08;}else if(cur_var == 1){data_disp[2] = 0x40;}else if(cur_var == 2){data_disp[2] = 0x01;}else{data_disp[2] = 0x00;}divide_con(setting[cur_var]);++cur_var;if(cur_var == 4){flag_modifying = 0;cur_var = 0;}return;}else if(key_kpval == 8){key4_process();return;}// key2 pressd and now releaseif(flag_modifying){if(key_kpval == 2){key2_process();}// key3 pressd and now releaseif(key_kpval == 4){key3_process();}}}unsigned char read_key(void){unsigned char data key_val = 0;key_val = key_press();if(key_val){//delay 100msflag_50ms = 0;count_50ms = 0;while(!flag_50ms);flag_50ms = 0;if(key_val == key_press() && key_val == old_key_val) //{if(flag_100ms == 1){flag_100ms = 0;return(key_val);}else{return(0);}}else if(key_val == key_press()){old_key_val = key_val;flag_100ms = 0;count_100ms = 0;return(key_val);}else{return(0);}}}/*void cooling_control(unsigned int cur_temp_b){unsigned char temp_logic = 0;temp_logic = cur_temp >= setting[0] - 10 && working_fans == 1;if(cur_temp_b >= setting[0] || temp_logic){working_fans = 1;temp_logic = cur_temp >= setting[1] - 10 && working_fans == 2;if(cur_temp_b >= setting[1] || temp_logic){working_fans = 2;temp_logic = cur_temp >= setting[0] - 10 && working_fans == 3;if(cur_temp_b >= setting[2] || temp_logic){working_fans = 3;}}}else{working_fans = 0;}}*/void cooling_control(unsigned int T){if(T<setting[0]){if(T<setting[0]-10||working_fans==0) {working_fans=0;}}else if(T>=setting[0]&&T<setting[1]){if(T<setting[1]-10||working_fans==1) {working_fans=1;}}else if(T>=setting[1]&&T<setting[2]){if(T<setting[2]-10||working_fans==2){working_fans=2;}}else{working_fans=3;}}void led_flashing(void){if(~flag_modifying){if(working_fans == 3){data_disp[0] = (0x01 << flash_cur_pos);data_disp[1] = data_disp[0];data_disp[2] = data_disp[0];}else if(working_fans == 2){data_disp[0] = 0x3F;data_disp[1] = (0x01 << flash_cur_pos);data_disp[2] = data_disp[1];}else if(working_fans == 1){data_disp[0] = 0x3F;data_disp[1] = 0x3F;data_disp[2] = (0x01 << flash_cur_pos);}else if(working_fans == 0){data_disp[0] = 0x3F;data_disp[1] = 0x3F;data_disp[2] = 0x3F;}++flash_cur_pos;if(flash_cur_pos == 6){flash_cur_pos = 0;}}}//------------------------------------------------------------------------// DS18B20//------------------------------------------------------------------------void delay(unsigned int t){for(;t>0;t--);}//³õʼ»¯DS18B20void Init_DS18B20(void){//unsigned x;DQ=0; // Ö÷»ú·¢³öÒ»¸ö¸´Î»Âö³ådelay(29); // ÑÓʱ´óÓÚ480 usDQ=1;delay(3); //µÈ´ýDS18B20ÏìÓ¦£¬¼ä¸ôÔ¼30us //x=DQ;//Èç¹ûx=0,Ôò³õʼ»¯³É¹¦£¬x=1£¬Ôò³õʼ»¯Ê§°Ü£¬ÖØÐ³õʼ»¯ delay(25);// return(x);}unsigned char ReadOneChar(void){unsigned char data i;unsigned char data byte=0;for(i=0;i<8;i++){byte>>=1;DQ=0;DQ=1;delay(1);if(DQ){byte|=0x80;}delay(6);}return(byte);}void WriteOneChar(unsigned char byte){unsigned char i;for(i=0;i<8;i++){DQ=0;DQ=byte&0x01;delay(5);DQ=1;byte=byte/2;}delay(5);}unsigned int GetTemperature(void){unsigned char a=0,b=0,temp_float=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0x44);Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0xBE);a=ReadOneChar();b=ReadOneChar();temp_float=a&0x0f;temp_float=dot_temp[temp_float];a=a>>4;b=b<<4;t=b|a;t=t*10+temp_float;return(t);}void init_timer0(void){TMOD = 0x01; //work in mode 1TH0 = 0xFC;TL0 = 0x65;TR0 = 1; //start}void time_process(void){++count_50ms;++count_100ms;++count_250ms;if(count_50ms == 50){count_50ms = 0;flag_50ms = 1;}if(count_100ms == 100){count_100ms = 0;flag_100ms = 1;}if(count_250ms == 250){count_250ms = 0;flag_250ms = 1;++count_check_interval;if(count_check_interval == DEF_CHECK_INTERVAL){count_check_interval = 0;flag_check_interval = 1;}}}void time(void) interrupt 1{TH0 = 0xFC;TL0 = 0x65;flag_1ms = 1;time_process();//display processdisp();}void main(void){//system initiate startunsigned char data key_temp = 0;unsigned int abc = 0;flag_sys_enabled = 1;led_sel = 0xFF;init_timer0();IE = 0x82; //enable the globe interrupt and Time0 interrupt //system initiate end//for test//srand(0x51);.. //working_fans = 2;//for testwhile(1){//read temperature processif(flag_check_interval && ~flag_modifying) {flag_check_interval = 0;IE = 0x00;abc = GetTemperature();cur_temp = abc;divide_con(cur_temp);if(flag_sys_enabled){cooling_control(cur_temp);}IE = 0x82;}//read key processif(flag_50ms){flag_50ms = 0;key_temp = read_key();if(key_temp){key_process(key_temp);}if(flag_sys_enabled){led_flashing();}}}}。

相关文档
最新文档