基于单片机的温度监测与控制系统程序
- 格式:doc
- 大小:59.50 KB
- 文档页数:10
基于STM32单片机的温度控制系统设计一、本文概述本文旨在探讨基于STM32单片机的温度控制系统的设计。
我们将从系统需求分析、硬件设计、软件编程以及系统测试等多个方面进行全面而详细的介绍。
STM32单片机作为一款高性能、低功耗的微控制器,广泛应用于各类嵌入式系统中。
通过STM32单片机实现温度控制,不仅可以精确控制目标温度,而且能够实现系统的智能化和自动化。
本文将介绍如何通过STM32单片机,结合传感器、执行器等硬件设备,构建一套高效、稳定的温度控制系统,以满足不同应用场景的需求。
在本文中,我们将首先分析温度控制系统的基本需求,包括温度范围、精度、稳定性等关键指标。
随后,我们将详细介绍系统的硬件设计,包括STM32单片机的选型、传感器和执行器的选择、电路设计等。
在软件编程方面,我们将介绍如何使用STM32的开发环境进行程序编写,包括温度数据的采集、处理、显示以及控制策略的实现等。
我们将对系统进行测试,以验证其性能和稳定性。
通过本文的阐述,读者可以深入了解基于STM32单片机的温度控制系统的设计过程,掌握相关硬件和软件技术,为实际应用提供有力支持。
本文也为从事嵌入式系统设计和开发的工程师提供了一定的参考和借鉴。
二、系统总体设计基于STM32单片机的温度控制系统设计,主要围绕实现精确的温度监测与控制展开。
系统的总体设计目标是构建一个稳定、可靠且高效的环境温度控制平台,能够实时采集环境温度,并根据预设的温度阈值进行智能调节,以实现对环境温度的精确控制。
在系统总体设计中,我们采用了模块化设计的思想,将整个系统划分为多个功能模块,包括温度采集模块、控制算法模块、执行机构模块以及人机交互模块等。
这样的设计方式不仅提高了系统的可维护性和可扩展性,同时也便于后续的调试与优化。
温度采集模块是系统的感知层,负责实时采集环境温度数据。
我们选用高精度温度传感器作为采集元件,将其与STM32单片机相连,通过ADC(模数转换器)将模拟信号转换为数字信号,供后续处理使用。
一、概述单片机PID温度控制系统是一种利用单片机对温度进行控制的智能系统。
在工业和日常生活中,温度控制是非常重要的,可以用来控制加热、冷却等过程。
PID控制器是一种利用比例、积分、微分三个调节参数来控制系统的控制器,它具有稳定性好、调节快等优点。
本文将介绍基于单片机的PID温度控制系统设计的相关原理、硬件设计、软件设计等内容。
二、基本原理1. PID控制器原理PID控制器是一种以比例、积分、微分三个控制参数为基础的控制系统。
比例项负责根据误差大小来控制输出;积分项用来修正系统长期稳态误差;微分项主要用来抑制系统的瞬时波动。
PID控制器将这三个项进行线性组合,通过调节比例、积分、微分这三个参数来实现对系统的控制。
2. 温度传感器原理温度传感器是将温度变化转化为电信号输出的器件。
常见的温度传感器有热电偶、热敏电阻、半导体温度传感器等。
在温度控制系统中,温度传感器负责将环境温度转化为电信号,以便控制系统进行监测和调节。
三、硬件设计1. 单片机选择单片机是整个温度控制系统的核心部件。
在设计单片机PID温度控制系统时,需要选择合适的单片机。
常见的单片机有STC89C52、AT89S52等,选型时需要考虑单片机的性能、价格、外设接口等因素。
2. 温度传感器接口设计温度传感器与单片机之间需要进行接口设计。
常见的温度传感器接口有模拟接口和数字接口两种。
模拟接口需要通过模数转换器将模拟信号转化为数字信号,而数字接口则可以直接将数字信号输入到单片机中。
3. 输出控制接口设计温度控制系统通常需要通过继电器、半导体元件等控制输出。
在硬件设计中,需要考虑输出接口的类型、电流、电压等参数,以及单片机与输出接口的连接方式。
四、软件设计1. PID算法实现在单片机中,需要通过程序实现PID控制算法。
常见的PID算法包括位置式PID和增量式PID。
在设计时需要考虑控制周期、控制精度等因素。
2. 温度采集和显示单片机需要通过程序对温度传感器进行数据采集,然后进行数据处理和显示。
《基于51单片机的温度控制系统设计与实现》篇一一、引言在现代工业控制领域,温度控制系统的设计与实现至关重要。
为了满足不同场景下对温度精确控制的需求,本文提出了一种基于51单片机的温度控制系统设计与实现方案。
该系统通过51单片机作为核心控制器,结合温度传感器与执行机构,实现了对环境温度的实时监测与精确控制。
二、系统设计1. 硬件设计本系统以51单片机为核心控制器,其具备成本低、开发简单、性能稳定等优点。
硬件部分主要包括51单片机、温度传感器、执行机构(如加热器、制冷器等)、电源模块等。
其中,温度传感器负责实时监测环境温度,将温度信号转换为电信号;执行机构根据控制器的指令进行工作,以实现对环境温度的调节;电源模块为整个系统提供稳定的供电。
2. 软件设计软件部分主要包括单片机程序与上位机监控软件。
单片机程序负责实时采集温度传感器的数据,根据设定的温度阈值,输出控制信号给执行机构,以实现对环境温度的精确控制。
上位机监控软件则负责与单片机进行通信,实时显示环境温度及控制状态,方便用户进行监控与操作。
三、系统实现1. 硬件连接将温度传感器、执行机构等硬件设备与51单片机进行连接。
具体连接方式根据硬件设备的接口类型而定,一般采用串口、并口或GPIO口进行连接。
连接完成后,需进行硬件设备的调试与测试,确保各部分正常工作。
2. 软件编程编写51单片机的程序,实现温度的实时采集、数据处理、控制输出等功能。
程序采用C语言编写,易于阅读与维护。
同时,需编写上位机监控软件,实现与单片机的通信、数据展示、控制指令发送等功能。
3. 系统调试在完成硬件连接与软件编程后,需对整个系统进行调试。
首先,对单片机程序进行调试,确保其能够正确采集温度数据、输出控制信号。
其次,对上位机监控软件进行调试,确保其能够与单片机正常通信、实时显示环境温度及控制状态。
最后,对整个系统进行联调,测试其在实际应用中的性能表现。
四、实验结果与分析通过实验测试,本系统能够实现对环境温度的实时监测与精确控制。
基于单片机的温度控制系统设计与应用温度控制系统是一种常见的自动控制系统,用于维持设定温度范围内的温度稳定。
本文将介绍基于单片机的温度控制系统的设计与应用。
一、系统设计1.功能需求:(1)温度检测:获取环境温度数据。
(2)温度显示:将检测到的温度数据以数字方式显示。
(3)温度控制:通过控制输出信号,自动调节温度以维持设定温度范围内的稳定温度。
2.硬件设计:(1)单片机:选择适合的单片机,如51系列、AVR系列等,具有较强的计算和控制能力。
(2)温度传感器:选择适当的温度传感器,如DS18B20、LM35等,能够准确检测环境温度。
(3)显示屏:选择适当的数字显示屏,如LCD显示屏、数码管等,用于显示温度数据。
(4)执行机构:根据具体需求选择合适的执行机构,如继电器、风扇等,用于控制温度。
3.软件设计:(1)温度检测:通过单片机采集温度传感器的模拟信号,并通过数字转换获得温度数据。
(2)温度显示:将获取到的温度数据进行处理,通过数字显示屏显示。
(3)温度控制:通过控制执行机构,如继电器等,根据温度数据的变化进行调节,将温度维持在设定范围内。
二、系统应用1.家居温控系统:家庭中的空调、暖气等设备可以通过单片机温度控制系统实现智能控制。
通过温度传感器检测室内温度,并将温度数据显示在数字显示屏上。
通过设定温度阈值,当室内温度超出设定范围时,系统控制空调或暖气进行启停,从而实现室内温度的调节和稳定。
这不仅提高了居住舒适度,还能节约能源。
2.工业过程控制:在工业生产过程中,一些特定的应用需要严格控制温度,以确保产品质量或生产过程的稳定。
通过单片机温度控制系统,可以实时检测并控制生产环境的温度。
当温度超过或低于设定的阈值时,系统可以自动调整控制设备,如加热器、冷却器等,以实现温度的控制和稳定。
3.温室农业:温室农业需要确定性的环境温度来保证作物的生长。
通过单片机温度控制系统,可以监测温室内的温度,并根据预设的温度范围,自动启停加热或降温设备,以维持温室内的稳定温度。
基于单片机的温湿度监测系统设计一、引言在现代生活和工业生产中,对环境温湿度的准确监测具有重要意义。
温湿度的变化可能会影响到产品质量、设备运行以及人们的生活舒适度。
因此,设计一个高效、准确且可靠的温湿度监测系统至关重要。
本设计基于单片机,旨在实现对环境温湿度的实时监测和数据处理。
二、系统总体设计方案(一)系统功能需求本系统需要实现以下功能:1、实时采集环境温湿度数据。
2、对采集到的数据进行处理和分析。
3、将温湿度数据显示在液晶显示屏上。
4、具备数据存储功能,以便后续查询和分析。
5、当温湿度超出设定范围时,能够发出报警信号。
(二)系统总体架构本系统主要由传感器模块、单片机控制模块、显示模块、存储模块和报警模块组成。
传感器模块负责采集温湿度数据,并将其转换为电信号传输给单片机。
单片机对接收的数据进行处理和分析,然后将结果发送给显示模块进行显示,同时将数据存储到存储模块中。
当温湿度超出设定范围时,单片机控制报警模块发出报警信号。
三、硬件设计(一)传感器选择选用 DHT11 数字温湿度传感器,它是一款含有已校准数字信号输出的温湿度复合传感器。
具有体积小、功耗低、响应速度快、性价比高等优点,能够满足本系统的设计要求。
(二)单片机控制模块选择 STC89C52 单片机作为控制核心。
它具有丰富的 I/O 口资源、较高的处理速度和稳定性,能够有效地处理和控制整个系统的运行。
(三)显示模块采用液晶显示屏 1602,它能够清晰地显示温湿度数据和相关信息。
(四)存储模块选用 EEPROM 芯片 AT24C02 作为存储模块,用于存储温湿度数据,方便后续查询和分析。
(五)报警模块使用蜂鸣器作为报警装置,当温湿度超出设定范围时,单片机控制蜂鸣器发出报警声音。
四、软件设计(一)主程序流程系统上电后,首先进行初始化操作,包括单片机内部资源的初始化、传感器的初始化、显示模块的初始化等。
然后,系统进入循环,不断读取传感器采集到的温湿度数据,并进行处理和分析。
基于单片机的温控系统设计与实现温控系统是一种可以根据环境温度自动调节设备工作状态的系统。
基于单片机的温控系统是一种利用单片机计算能力、输入输出功能及控制能力,通过传感器获取环境温度信息并实现温度控制的系统。
下面将对基于单片机的温控系统的设计与实现进行详细介绍。
一、系统设计和功能需求:基于单片机的温控系统主要由以下组成部分构成:1.温度传感器:用于获取当前环境温度值。
2.控制器:使用单片机作为中央控制单元,负责接收温度传感器的数据并进行温度控制算法的计算。
3.执行器:负责根据控制器的指令控制设备工作状态,如电风扇、加热器等。
4.显示器:用于显示当前环境温度和控制状态等信息。
系统的功能需求主要包括:1.温度监测:通过温度传感器实时获取环境温度数据。
2.温度控制算法:根据温度数据进行算法计算,判断是否需要调节设备工作状态。
3.设备控制:根据控制算法的结果控制设备的工作状态,如打开或关闭电风扇、加热器等。
4.信息显示:将当前环境温度及控制状态等信息显示在显示器上。
二、系统实现的具体步骤:1.硬件设计:(1)选择适合的单片机:根据系统功能需求选择合适的单片机,通常选择具有较多输入输出引脚、计算能力较强的单片机。
(2)温度传感器的选择:选择合适的温度传感器,常见的有热敏电阻、热电偶、数字温度传感器等。
(3)执行器的选择:根据实际需求选择合适的执行器,如电风扇、加热器等。
(4)显示器的选择:选择适合的显示器以显示当前温度和控制状态等信息,如液晶显示屏等。
2.软件设计:(1)编写驱动程序:编写单片机与传感器、执行器、显示器等硬件的驱动程序,完成数据的读取和输出功能。
(2)设计温度控制算法:根据监测到的温度数据编写温度控制算法,根据不同的温度范围判断是否需要调节设备工作状态。
(3)控制设备的逻辑设计:根据温度控制算法的结果设计控制设备的逻辑,确定何时打开或关闭设备。
(4)设计用户界面:设计用户界面以显示当前温度和控制状态等信息,提示用户工作状态。
《基于单片机的温度控制系统的研究》篇一一、引言随着现代科技的快速发展,对温度控制的精度和稳定性的要求也在逐渐提高。
为了满足这一需求,我们提出了一种基于单片机的温度控制系统。
该系统利用单片机的高效处理能力和精确控制能力,实现对温度的实时监测和精确控制。
本文将对该系统的设计、实现及性能进行详细的研究和讨论。
二、系统设计1. 硬件设计本系统主要由单片机、温度传感器、执行器(如加热器或制冷器)以及电源等部分组成。
其中,单片机作为系统的核心,负责接收温度传感器的数据,根据设定的温度值与实际温度值的差值,控制执行器的工作状态,以达到控制温度的目的。
温度传感器选用高精度的数字温度传感器,能够实时监测环境温度,并将数据传输给单片机。
执行器则根据单片机的指令,进行加热或制冷操作。
2. 软件设计软件部分主要包括单片机的程序设计和人机交互界面设计。
单片机程序采用C语言编写,实现温度的实时监测、数据处理、控制算法等功能。
人机交互界面则用于设定目标温度、显示当前温度等信息。
三、系统实现1. 温度采集与处理单片机通过与温度传感器通信,实时获取环境温度数据。
然后,通过A/D转换器将温度数据转换为数字信号,进行数据处理和分析。
2. 控制算法本系统采用PID(比例-积分-微分)控制算法。
PID控制器根据设定温度与实际温度的差值,计算输出控制量,控制执行器的工作状态,从而达到控制温度的目的。
3. 人机交互界面人机交互界面采用LCD显示屏和按键实现。
用户可以通过按键设定目标温度,LCD显示屏实时显示当前温度和设定温度。
四、性能分析1. 精度与稳定性本系统采用高精度的温度传感器和PID控制算法,能够实现较高的温度控制精度和稳定性。
经过实际测试,系统的温度控制精度可达±0.5℃,稳定性良好。
2. 响应速度本系统的响应速度较快,当环境温度发生变化时,单片机能够迅速采集到数据,并通过PID控制算法计算出相应的控制量,控制执行器进行加热或制冷操作,使环境温度尽快达到设定值。
基于C51单片机的温度控制系统应用系统设计(附程序)基于C51单片机的温度控制系统应用系统设计--------- 单片机原理及应用实践周设计报告姓名:班级:学号:同组成员:指导老师:成绩:时间:2011 年7 月3 日单片机温度控制系统摘要温度是日常生活中无时不在的物理量,温度的控制在各个领域都有积极的意义。
很多行业中都有大量的用电加热设备,如用于热处理的加热炉,用于融化金属的坩锅电阻炉及各种不同用途的温度箱等,采用单片机对它们进行控制不仅具有控制方便、简单、灵活性大等特点,而且还可以大幅度提高被控温度的技术指标,从而能够大大提高产品的质量。
因此,智能化温度控制技术正被广泛地采用。
本温度设计采用现在流行的AT89S51单片机,配以DS18B2数字温度传感器,上、下限进行比较,由此作出判断是否触发相应设备。
本设计还加入了常用的液晶显示及状态灯显示灯常用电路,使得整个设计更加完整,更加灵活。
关键词:温度箱;AT89C52 LCD1602单片机;控制目录1引言11.1温度控制系统设计的背景、发展历史及意义11.2温度控制系统的目的11.3温度控制系统完成的功能12总体设计方案22.1方案一 22.2方案二 23DS18B20温度传感器简介73.1温度传感器的历史及简介73.2DS18B20的工作原理7DS18B20工作时序7ROM操作命令93.3DS18B20的测温原理98B20的测温原理:9DS18B20的测温流程104单片机接口设计124.1设计原则124.2引脚连接12晶振电路12串口引脚12其它引脚135系统整体设计145.1系统硬件电路设计14主板电路设计14各部分电路145.2系统软件设计16 系统软件设计整体思路系统程序流图176结束语2116附录22参考文献391引言1.1温度控制系统设计的背景、发展历史及意义随着社会的发展,科技的进步,以及测温仪器在各个领域的应用,智能化已是现代温度控制系统发展的主流方向。
单片机温控程序设计一个单片机温控程序涉及多个方面,包括传感器的接口、温度采集、控制算法、显示等。
以下是一个简要的单片机温控程序的设计示例,具体实现可能依赖于使用的单片机型号、传感器型号等。
1. 硬件设计a. 传感器接口选择合适的温度传感器,比如常用的DS18B20数字温度传感器。
连接传感器的引脚到单片机的GPIO口。
c// DS18B20传感器连接// VCC -> 单片机电源// GND -> 单片机地// DQ -> 单片机GPIO口b. 输出控制选择用于控制的输出设备,如继电器、加热器、风扇等。
连接输出设备的引脚到单片机的GPIO口。
c// 控制设备连接// 继电器、加热器、风扇等的控制引脚连接到单片机GPIO口c. 显示设备如果需要显示当前温度或其他信息,可以选择合适的显示设备,如数码管、LCD等。
c// 显示设备连接// 数码管、LCD等的引脚连接到单片机GPIO口2. 软件设计a. 温度采集使用单片机的GPIO口读取温度传感器的数据,获取当前环境温度。
c// 读取DS18B20传感器温度数据float readTemperature(){// 实现读取DS18B20数据的代码// 返回浮点数温度值}b. 控制算法根据采集到的温度数据,实现控制算法。
比如,当温度过高时打开风扇或者关闭加热器。
c// 温控算法void temperatureControl(float currentTemperature){float targetTemperature =25.0;// 目标温度float hysteresis =1.0;// 温度死区if(currentTemperature >targetTemperature +hysteresis){// 温度过高,执行降温操作,比如打开风扇turnOnFan();}else if(currentTemperature <targetTemperature -hysteresis){// 温度过低,执行升温操作,比如关闭风扇、打开加热器turnOffFan();turnOnHeater();}else{// 温度在目标范围内,保持当前状态turnOffFan();turnOffHeater();}}c. 控制设备根据控制算法的结果,控制相应的输出设备。
//------------------------------------------------------------------------// 名称:用1602LCD与DS18B20设计的温敏报警器(含读ROM CODE,温度上下限显示)//------------------------------------------------------------------------// 说明:本例将报警温度为高:70℃,低:-20℃当DS18B20感知温度达此临界// 值时对应的LED闪烁,且发出警报声。
// 本例还可以显示DS18B20的ROM CODE及报警温度上下限。
//------------------------------------------------------------------------#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP() {_nop_();_nop_();_nop_();nop_()}sbit HI_LED = P2^3; // 高温,低温报警闪烁LEDsbit LO_LED = P2^6;sbit DQ = P3^3; //DS18B20 数据线sbit BEEP = P3^7; //报警器sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit K1=P1^7; //正常显示温度,越界时报警sbit K2=P1^4; //显示报警温度sbit K3=P1^1; //查看ROM CODEuchar code RomCodeStr[]={"-- ROM CODE --"};uchar RomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//64位ROM CODEuchar code Temp_Disp_Title[] ={"Current Temp:"};uchar Current_Temp_Display_Buffer [ ] ={"TEMP: "};uchar code Temperature_Char[8] ={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};//温度字符uchar code Alarm_Temp[] = {"ALARM Temp HI LO"};uchar Alarm_HI_LO_STR[] ={"HI: LO:"};uchar temp_date[2]= {0x00,0x00};uchar temp_alarm[2]= {0x00,0x00};uchar display[5] = {0x00,0x00,0x00,0x00};uchar display1[3] = {0x00,0x00,0x00};uchar code df_Table[] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};char Alarm_Temp_HL[2] ={ 70, -20 };uchar CurrentT = 0; //读取当前的温度整数部分uchar Temp_Value []= {0x00,0x00}; //从DS18B20读取的温度值uchar Display_Digit[]={0,0,0,0};bit HI_Alarm = 0 , LO_Alarm = 0;bit DS18B20_IS_OK = 1;uint Time0_Count = 0;//-------------------------------------------------------//延时//-------------------------------------------------------void DelayXus(int x){uchar i;while(x--) for(i=0; i<200;i++);}bit LCD_Busy_check( ){bit result;RS=0;RW=1;E=1;DelayXus(4); result=(bit)(P0& 0x80);E=0;return result;}//-------------------------------------------------------//向LCD发送命令//-------------------------------------------------------void Write_LCD_Command( uchar c){while(LCD_Busy_check()); //判断LCD是否忙碌RS=0;RW=0;E=0; _nop_();_nop_();P0=c;DelayXus(4);E=1;DelayXus(4);E=0;}//-------------------------------------------------------//设置LCD显示位置//-------------------------------------------------------void Set_LCD_POS(uchar pos){Write_LCD_Command(pos | 0x80);}//-------------------------------------------------------// 向LCD发送数据//-------------------------------------------------------void Write_LCD_Data(uchar dat){while(LCD_Busy_check()) ;RS= 1;RW=0;E=0;P0= dat;DelayXus(4);E=1;DelayXus(4);E=0;}//-------------------------------------------------------//初始化LCD//-------------------------------------------------------void LCD_Initialise(){Write_LCD_Command(0x38); //开显示Write_LCD_Command(0x0f); //清屏Write_LCD_Command(0x01); //画面不动光标右移Write_LCD_Command(0x06);}//-------------------------------------------------------------------------------////通用显示函数////-------------------------------------------------------------------------------void Write_NEW_LCD_Char(){uchar i;Write_LCD_Command( 0x40);for ( i= 0;i<8;i++)Write_LCD_Data(Temperature_Char[i]) ;}void Delay(uint num){while(--num);}//-------------------------------------------------------//初始化DS18B20//-------------------------------------------------------uchar Init_DS18B20(){uchar status;DQ=1;Delay(8);DQ=0;Delay(90);DQ=1;Delay(8);status=DQ;Delay(100);DQ=1;return status; //初始化成功时返回0}//-------------------------------------------------------------//读一字节//-------------------------------------------------------------uchar ReadOneByte(){uchar i,dat =0;DQ=1; _nop_();for(i= 0;i<8;i++){DQ=0;dat>>=1; DQ=1;_nop_();_nop_();if(DQ) dat|=0x80;Delay(30);DQ=1;}return dat;}void WriteOneByte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat &0x01;Delay(5);DQ=1;dat>>=1;}}//-------------------------------------------------------------//读取温度值//------------------------------------------------------------- void Read_Temperature(){if( Init_DS18B20() ==1) //DS18B20故障DS18B20_IS_OK=0;else{WriteOneByte(0xCC);WriteOneByte(0x44);Init_DS18B20() ;WriteOneByte(0xCC);WriteOneByte(0xBE);Temp_Value[0]=ReadOneByte();Temp_Value[1]=ReadOneByte();Alarm_Temp_HL[0] = ReadOneByte();Alarm_Temp_HL[1] = ReadOneByte();DS18B20_IS_OK=1;}}//-------------------------------------------------------------//设置DS18B20温度报警值//------------------------------------------------------------- void Set_Alarm_Temp_Value(){Init_DS18B20();WriteOneByte(0xCC);WriteOneByte(0x4E);WriteOneByte(Alarm_Temp_HL[0]) ;WriteOneByte(Alarm_Temp_HL[1]) ;WriteOneByte(0x7F);WriteOneByte(0x48);}//-------------------------------------------------------------//在LCD上显示温度//-------------------------------------------------------------void Display_Temperature(){uchar i;uchar t=150;uchar ng=0;char Signed_Current_Temp;if( ( Temp_Value[1] & 0xF8) ==0xF8){Temp_Value[1]= ~Temp_Value[1];Temp_Value[0]= ~Temp_Value[0]+1;if ( Temp_Value[0] == 0x00 ) Temp_Value[1]++;ng=1;}Display_Digit[0] =df_Table [ Temp_Value[0] & 0x0F ];CurrentT = ( (Temp_Value[0] & 0x0F)>>4) |(Temp_Value[1] & 0x07)<<4; Signed_Current_Temp = ng? -CurrentT : CurrentT;HI_Alarm =Signed_Current_Temp >= Alarm_Temp_HL[0] ? 1 : 0;LO_Alarm =Signed_Current_Temp <= Alarm_Temp_HL[1] ? 1 : 0;Display_Digit[3]=CurrentT /100;Display_Digit[2]=CurrentT %100 /10;Display_Digit[1]=CurrentT % 10;//刷新LCD显示缓冲Current_Temp_Display_Buffer[11] = Display_Digit[0] +'0';Current_Temp_Display_Buffer[10] = '.' ;Current_Temp_Display_Buffer[9]=Display_Digit[1] +'0';Current_Temp_Display_Buffer[8] = Display_Digit[2] +'0';Current_Temp_Display_Buffer[7] = Display_Digit[3] +'0';// 高位为0时不显示if (Display_Digit[3] == 0) Current_Temp_Display_Buffer[7] = ' ';//if (Display_Digit[2] == 0 && Display_Digit[3] == 0)Current_Temp_Display_Buffer[8] = ' ' ;if(ng){if (Current_Temp_Display_Buffer[8] == ' ' )Current_Temp_Display_Buffer[8] = '-';elseif (Current_Temp_Display_Buffer[7] ==' ')Current_Temp_Display_Buffer[7] = '-' ;elseCurrent_Temp_Display_Buffer[6] = '-';}//在第一行显示标题Set_LCD_POS(0x00);for( i=0; i<16;i++) Write_LCD_Data( Temp_Disp_Title[i]);// 在第二行显示标题Set_LCD_POS(0x40);for( i=0; i<16;i++) Write_LCD_Data( Current_Temp_Display_Buffer[i]);//显示温度符号Set_LCD_POS(0x4D); Write_LCD_Data(0x00);Set_LCD_POS(0x4E); Write_LCD_Data('C');}//---------------------------------------------------------------------------//定时器中断,控制警报声音//---------------------------------------------------------------------------void T0_INT() interrupt 1{TH0 = -1000/256;TL0 = -1000%256;BEEP = !BEEP;if( ++Time0_Count == 400){Time0_Count =0;if (HI_Alarm) HI_LED = ~HI_LED; else HI_LED = 0;if (LO_Alarm) LO_LED = ~LO_LED; else LO_LED = 0;TR0=0;}}//---------------------------------------------------------------------------//ROM CODE 转换与显示//---------------------------------------------------------------------------void Display_Rom_Code(){uchar i,t;Set_LCD_POS(0x40);for(i= 0;i<8;i++){t=((RomCode[i]& 0xF0)>>4);if(t>9) t+= 0x37;else t+='0';Write_LCD_Data(t); //高位显示t= RomCode[i]& 0x0F;if(t>9) t+= 0x37;else t+='0';Write_LCD_Data(t);}} //低位显示// ---------------------------------------------------------------------------// 读64位序列码//---------------------------------------------------------------------------void Read_Rom_Code(){uchar i;Init_DS18B20();WriteOneByte(0x33);for (i=0;i<8;i++) RomCode[i]= ReadOneByte();}//---------------------------------------------------------------------------//显示ROM CODE//---------------------------------------------------------------------------void Display_RomCode(){uchar i;Set_LCD_POS(0x00) ;for(i=0;i<16;i++)Write_LCD_Data(RomCodeStr[i]);Read_Rom_Code();Display_Rom_Code();} //显示64位ROM CODE//------------------------------------------------------------------------------//显示报警温度//------------------------------------------------------------------------------void Disp_Alarm_Temperature(){uchar i,ng;//------------------------------------------------------------------------------ //显示Alarm_Temp_HL数组中的报警温度//由于Alarm_Temp_HL类型为char故可以直接进行正负比较//高温报警----------------------------------------------------------------------if (Alarm_Temp_HL[0]<0) //如果为负数则取反加1{Alarm_Temp_HL[0]=~Alarm_Temp_HL[0]+1;ng=1;}//分解高温各数位到待显示串中Alarm_Temp_HL[0]=Alarm_HI_LO_STR[4] =Alarm_Temp_HL[0]/100 + '0'; Alarm_Temp_HL[0]=Alarm_HI_LO_STR[5] =Alarm_Temp_HL[0]/10 %10 + '0'; Alarm_Temp_HL[0]=Alarm_HI_LO_STR[6] =Alarm_Temp_HL[0]%10 + '0';//屏蔽高位不显示的0if( Alarm_HI_LO_STR[4]=='0') Alarm_HI_LO_STR[4] = ' ';if( Alarm_HI_LO_STR[4]==' ' && Alarm_HI_LO_STR[5] == '0' )Alarm_HI_LO_STR[5] = ' ';//“-”符号显示if (ng){if( Alarm_HI_LO_STR[5] ==' ') Alarm_HI_LO_STR[5] = '-' ;elseif( Alarm_HI_LO_STR[4] ==' ') Alarm_HI_LO_STR[4] = '-' ;elseAlarm_HI_LO_STR[3] = '-';}//低温报警值ng=0;if(Alarm_Temp_HL[1]<0) //如果为负数则取反加1{Alarm_Temp_HL[1]= ~Alarm_Temp_HL[1]+1;ng=1;}//分解高温各数位到待显示串中Alarm_HI_LO_STR[12] =Alarm_Temp_HL[1]/100+'0';Alarm_HI_LO_STR[13] =Alarm_Temp_HL[1]/10 %10+'0';Alarm_HI_LO_STR[14] =Alarm_Temp_HL[1]%10+'0';// 屏蔽高位不显示的0if( Alarm_HI_LO_STR[12]=='0') Alarm_HI_LO_STR[12] =' ';if( Alarm_HI_LO_STR[12]==' ' && Alarm_HI_LO_STR[13] =='0');Alarm_HI_LO_STR[13] =' ';if(ng){if(Alarm_HI_LO_STR[13] == ' ') Alarm_HI_LO_STR[13] ='-';elseif(Alarm_HI_LO_STR[12] == ' ') Alarm_HI_LO_STR[12] ='-';Alarm_HI_LO_STR[11] ='-';}//显示高低温报警温度值Set_LCD_POS(0x00);for(i=0;i<16;i++) Write_LCD_Data(Alarm_Temp[i]);Set_LCD_POS(0x40); //显示高低温for(i=0;i<16;i++) Write_LCD_Data(Alarm_HI_LO_STR[i]); }//-------------------------------------------------------------------//主函数//-------------------------------------------------------------------void main(){uchar Current_Operation= 1;LCD_Initialise();IE=0x82;TMOD=0x01;TH0=-1000/256;TL0=-1000%256;TR0=0;HI_LED=0;LO_LED=0;Set_Alarm_Temp_Value();Read_Temperature();Delay(50000) ;Delay(50000);while(1){if(K1==0) Current_Operation= 1;if(K2==0) Current_Operation= 2;if(K3==0) Current_Operation= 3;switch(Current_Operation){case 1: // 正常显示当前温度,越界时报警Read_Temperature();if(DS18B20_IS_OK){if(HI_Alarm==1|| LO_Alarm ==1) TR0=1;else TR0=0;Display_Temperature();}DelayXus(100);break;case 2: //显示报警温度上下限Read_Temperature();Disp_Alarm_Temperature();DelayXus(100);break;case 3: //显示DS18B20 ROM CODEDisplay_Rom_Code();DelayXus(100);break;}}}。