基于51单片机数字温度计设计
基于MCS51系列单片机的数字温度计设计

基于MCS-51系列单片机的数字温度计设计基于MCS-51系列单片机的数字温度计设计摘要本文提出了基于MCS-51系列单片机的数字温度计的制作电路和编程思想。
该数字温度计以宏晶公司的STC89C52 单片机为主控,配以达拉斯公司的DS18B20数字温度传感器,采用1602双行英文字符液晶作显示。
实现了对温度的测量,显示,和报警等功能。
关键词:STC89C52单片机;数字传感器DS18B20;显示器LCD;目录摘要 (I)ABSTRACT ........................... 错误!未定义书签。
1 绪论 (4)1.1 选题的背景 (4)1.2 数字温度计简介 (4)1.2.1 数字温度计的特征 (4)1.2.2 设计实现的目标 (5)2 数字温度计的方案设计 (6)2.1 设计方案论证与比较 (6)2.1.1 显示电路方案 (6)2.1.2 测温电路方案 (6)2.2 系统总体方案 (6)3 数字温度计的硬件电路设计 (8)3.1 控制电路 (8)3.1.1 MCU简介 (8)3.2.2 最小系统模块 (9)3.3 温度传感器设计 (10)3.3.1 DS18B20简介 (10)3.3.2 温度传感器与单片机的连接 (12)3.3.3 复位信号及外部复位电路 (13)3.4 单片机与报警电路 (13)3.5 显示电路 (13)4 软件设计 (15)4.1 DS18b20的读操作 (15)4.2 DS18b20的温度数据处理 (16)4.3 1602显示部分 (17)5 数据测试 (20)参考文献 (22)附录1 程序源代码................ 错误!未定义书签。
1 绪论1.1 选题的背景随着现代信息技术的飞速发展和传统工业改造的逐步实现.能够独立工作的温度检测和显示系统应用于诸多领域。
传统的温度检测以热敏电阻为温度敏感元件。
热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。
基于51的数显温度计设计

DS18B20内部结构:
64 位 ROM 和 单 线 接 口
存储器与控 制逻辑
温度传感 器 高 速 缓 存 高温触发 器TH
C
低温触发器 TL
配置寄存 器
Vdd
8位CRC发生 器
DS18B20内部结构主要由四部分组成:64位光刻 ROM、温度传感器、非挥发的温度报警触发器TH 和TL、配置寄存器。
温度传感武器选择
DS18B20 最大的特点是单总线数据传输方式,数据
I/O 均由同一条线来完成。 DS18B20 的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行双向通信 ●无须外部器件(DS18B20在使用中不需要任何外围元件,全部传感元 件及转换电路集成在形如一只三极管的集成电路内); ●适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数 据线供电; ●温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ ●零待机功耗 ●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正 常工作;
方案比较
• 方案一(热电偶温差电路测温)
热电偶由两个焊接在一起的异金属导线所组成,如图:
热电偶产生的热电势由两种金属的接触电势和单一导体的温差电势组成。通过将参 考结点保持在已知温度并测量该电压,便可推断出检测结点的温度。数据采集 可以通过A/D通道转化,利用单片机进行数据处理,在显示电路上显示出来。 优点:工作温度范围非常宽,且体积小 不足:存在着输出电压小、容易遭受来自导线环路的噪声影响以及漂移较高的缺点, 并且这种设计需要用到A/D 转换电路,感温电路比较麻烦。
• 从以上两种方案,容易看出方案一的测温装置可 测温度范围宽、体积小,但是线性误差较大。方 案二的测温装置电路简单、精确度较高、实现方 便、软件设计也比较简单,故本次设计采用了方 案二。 • 系统器件选择
51单片机数字温度计设计与应用

51单片机数字温度计设计与应用数字温度计在现代生活中有着广泛的应用,它能够将环境温度转换为数字信号,提供直观、准确的温度数据。
本文将介绍基于51单片机的数字温度计的设计与应用。
设计思路:1. 硬件设计首先,我们需要选取一个合适的温度传感器,例如DS18B20。
该传感器具有高精度、数字输出、带有内部校准和非易失性存储器等特点,非常适合作为数字温度计的传感器。
其次,我们需要引入一个51单片机,常用的有AT89C51、AT89S52等。
单片机负责控制传感器和显示器,并处理温度数据。
接下来,我们需要一个LED数码管或液晶显示屏作为温度显示器。
数码管简单且易于操作,而液晶显示屏可以提供更多的信息显示。
最后,我们还需添加一些辅助电路,如稳压电路、时钟电路等,以确保正常的运行。
2. 软件设计在单片机的程序设计方面,我们需要考虑以下几个步骤:(1)初始化各个引脚和外部设备,如温度传感器和显示屏。
(2)读取温度传感器输出的数字信号,通过数据线将其与单片机相连。
(3)通过一系列算法将数字信号转换为实际的温度值。
因为DS18B20传感器提供数字输出,所以支持该类算法的编程非常简单。
(4)将计算得到的温度值通过数码管或液晶显示屏进行显示。
如果是数码管,可以通过数码管驱动芯片来实现多位数的显示。
(5)可选的增加报警功能,当温度超过一定阈值时,触发报警。
应用场景:数字温度计可以在许多场景中应用,下面介绍几个常见的应用场景:1. 家庭温度监测在家庭中,我们可以将数字温度计放置在客厅、卧室等常用区域,用于监测室内温度。
通过数字温度计,我们可以实时了解室内的温度状况,根据需要进行调节,提供舒适的生活环境。
2. 温室控制在温室种植中,保持适宜的温度对于植物的生长至关重要。
数字温度计可以帮助种植者实时监测温室内的温度,并及时采取相应的措施,维持温室内的温度在适宜的范围内。
3. 实验室温度监测实验室需要严格控制温度,以确保实验的准确性和稳定性。
基于51单片机的数字温度计

引言:数字温度计是一种基于51单片机的温度测量装置,它通过传感器感知环境的温度,并使用单片机将温度值转换为数字形式,并显示在液晶屏上。
本文将详细介绍数字温度计的设计原理、硬件连接、软件编程以及应用领域。
概述:数字温度计基于51单片机的设计理念,其基本原理是通过传感器将温度转换为电信号,然后通过ADC(模数转换器)将电信号转换为数字信号,最后使用单片机将数字信号转换为温度值。
同时,数字温度计还将温度值显示在液晶屏上,方便用户直观地了解环境温度。
正文内容:1. 硬件连接:1.1 使用温度传感器感知环境温度:常用的温度传感器有NTC热敏电阻和DS18B20数字温度传感器。
通过将传感器连接到51单片机的引脚上,可以实现对环境温度的感知。
1.2 连接ADC进行模数转换:ADC是将模拟信号转换为数字信号的关键部件。
通过将51单片机的引脚连接到ADC芯片的输入端,可以将模拟的温度信号转换为数字信号。
1.3 连接液晶屏显示温度值:通过将51单片机的引脚连接到液晶屏的控制引脚和数据引脚,可以将温度值以数字形式显示在液晶屏上。
2. 软件编程:2.1 初始化引脚和ADC:在软件编程中,需要初始化51单片机的引脚设置和ADC的工作模式。
通过设置引脚为输入或输出,以及设置ADC的参考电压和工作模式,可以确保硬件正常工作。
2.2 温度测量算法:根据传感器的工作原理和电压-温度特性曲线,可以编写相应的算法将ADC测得的电压值转换为温度值。
例如,对于NTC热敏电阻,可以使用Steinhart-Hart公式进行温度计算。
2.3 温度值显示:将温度值以数字形式显示在液晶屏上。
通过设置液晶屏的控制引脚和数据引脚,可以控制液晶屏的显示内容,并将温度值以数字形式显示在屏幕上。
3. 基于51单片机的数字温度计应用:3.1 家庭温度监测:数字温度计可以安装在家庭中的不同区域,实时监测室内温度,并通过数字显示提供直观的温度信息。
这对于家庭的舒适性和节能都有重要意义。
51单片机数字温度计的设计与实现

51单片机数字温度计的设计与实现温度计是一种广泛使用的电子测量仪器,它能够通过感知温度的变化来提供精准的温度数值。
本文将介绍如何使用51单片机设计并实现一款数字温度计。
一、硬件设计1. 采集温度传感器温度传感器是用来感知环境温度的关键器件。
常见的温度传感器有DS18B20、LM35等。
在本次设计中,我们选择DS18B20温度传感器。
通过电路连接将温度传感器与51单片机相连,使51单片机能够读取温度传感器的数值。
2. 单片机选型与连接选择适合的51单片机型号,并根据其引脚功能图对单片机进行合理的引脚连接。
确保温度传感器与单片机之间的数据传输通畅,同时保证电源和地线的正确连接。
3. 显示模块选型与连接选择合适的数字显示模块,如数码管、液晶显示屏等。
将显示模块与51单片机相连,使温度数值能够通过显示模块展示出来。
4. 电源供应为电路提供稳定的电源,保证整个系统的正常运行。
选择合适的电源模块,并根据其规格连接电路。
二、软件设计1. 温度传感器读取程序编写程序代码,使用单片机GPIO口将温度传感器与单片机连接,并通过相应的通信协议读取温度数值。
例如,DS18B20采用一线制通信协议,需要使用单总线协议来读取温度数值。
2. 数字显示模块驱动程序编写程序代码,通过单片机的GPIO口控制数字显示模块的数码管或液晶显示屏进行温度数值显示。
根据显示模块的规格,编写合适的驱动程序。
3. 温度转换算法将温度传感器读取到的模拟数值转换为实际温度数值。
以DS18B20为例,它输出的温度数值是一个16位带符号的数,需要进行相应的转换操作才能得到实际的温度数值。
4. 系统控制程序整合以上各部分代码,编写系统控制程序。
该程序通过循环读取温度数值并进行数据处理,然后将处理后的数据送到数字显示模块进行实时显示。
三、实现步骤1. 硬件连接按照前文所述的硬件设计,将温度传感器、51单片机和数字显示模块进行正确的连接。
确保连接无误,并进行必要的电源接入。
基于51单片机的数字温度计设计及优化

基于51单片机的数字温度计设计及优化数字温度计是一种常见的电子测量设备,用于测量周围环境的温度,并将温度以数字形式显示。
本文将介绍一种基于51单片机的数字温度计的设计及其优化。
首先,为了设计一个基于51单片机的数字温度计,我们需要以下材料和器件:51单片机、温度传感器、LCD显示屏、电阻、电容、晶体振荡器等。
在电路设计方面,我们可以将温度传感器连接到单片机的模拟输入引脚上,通过读取模拟输入,可以获取传感器测量到的温度值。
接下来,我们可以通过串口通信将温度值发送到PC机,并通过PC机上的软件进行温度的实时显示和记录。
在软件设计方面,我们需要首先编写单片机的程序,以读取传感器的模拟信号,并将其转换为数字温度值。
然后,我们可以通过串口通信将温度值发送给PC机。
在PC机上的软件中,我们需要编写一个接收温度数据的程序,并通过图形界面显示温度值。
为了进一步优化数字温度计设计,我们可以考虑以下几个方面:1. 精度优化:通过选用更高精度的温度传感器,可以提高温度测量的准确性。
此外,在单片机的程序中,我们可以进行数学运算和滤波算法的优化,以提高温度测量的精度。
2. 功耗优化:在设计数字温度计时,我们应该尽可能降低系统的功耗。
例如,可以选择低功耗的单片机,合理设置时钟频率和休眠模式,以减少系统能耗。
3. 可靠性优化:数字温度计在长时间使用时应保持可靠性,尽量减少出现故障的可能性。
为此,我们可以对电路进行严格的电气设计,使用高质量的电子元器件,并进行必要的温度校准和测试。
4. 功能扩展:基于数字温度计的设计还可以考虑添加一些额外的功能,如报警功能、记录功能和远程监测功能等。
这些功能可以通过扩展硬件和改进软件来实现。
总结一下,本文介绍了基于51单片机的数字温度计的设计及其优化。
通过合理的电路设计和软件编程,我们可以实现一个精度高、功耗低、可靠性强的数字温度计。
此外,我们还可以通过优化算法和添加额外功能来进一步提升数字温度计的性能。
基于51单片机和DS18B20的数字温度计设计说明

基于51单片机和DS18B20的数字温度计设计说明
1.硬件设计:
-51单片机:选择合适的型号,如STC89C52或AT89C52等。
-DS18B20温度传感器:该传感器是一种数字温度传感器,具有单总线接口和高精度测量能力。
-接口电路:将51单片机和DS18B20传感器连接起来,要注意电平转换和信号线的阻抗匹配。
2.软件设计:
-初始化:在主函数中,首先对单片机进行初始化设置,包括时钟设置、串口配置等。
-DS18B20通信协议:使用单总线协议与DS18B20传感器进行通信,包括发送复位信号、读写数据等操作。
-温度测量:通过向DS18B20发送读取温度的命令,从传感器中读取温度值并保存。
-数据传输:将温度值转换为可显示的格式,如摄氏度或华氏度,并通过串口输出或LED显示。
3.程序流程:
-初始化单片机,设置时钟和串口参数。
-进入主循环,循环执行以下操作:
-发送复位信号,启动温度转换。
-等待转换完成,发送读取温度命令。
-读取温度值,并进行数据处理转换。
-输出温度值。
4.其他功能:
-可以添加LCD显示模块,将温度值显示在液晶屏上。
-可以添加按键输入模块,通过按键切换温度单位或进行其他操作。
需要注意的是,该设计只是一个简单的示例,实际应用中可能需要根据具体需求进行扩展和修改。
同时,在程序设计过程中,也要注意低功耗和数据稳定性等方面的考虑。
基于51单片机数字温度计系统设计与实现

基于51单片机数字温度计系统设计与实现数字温度计是一种可以测量环境温度并将结果以数字方式显示的设备。
在本次任务中,我们将基于51单片机设计和实现一个数字温度计系统。
本文将介绍数字温度计的原理、硬件设计、软件设计以及系统的实施过程。
首先,让我们来了解一下数字温度计的工作原理。
数字温度计通过传感器获取环境温度的模拟信号,然后将其转换为数字信号进行处理,并最终在数字显示器上显示温度值。
通常,我们使用的传感器是温度敏感电阻或数字温度传感器。
接下来,我们将讨论硬件设计。
在本次任务中,我们使用的是51单片机作为主控制器。
我们需要连接一个温度传感器来测量温度,并将温度值转换为数字信号。
同时,我们还需要连接一个数字显示器,用于显示温度值。
为了实现这些功能,我们需要设计一个电路板,并正确布局电子元件。
另外,我们还需要通过键盘或按钮来控制系统的操作,例如切换温度单位等。
在软件设计方面,我们需要编写程序来完成以下任务:首先,我们需要初始化51单片机的引脚和中断。
然后,我们需要编写一个温度转换的函数,将传感器输出的模拟信号转换为数字信号。
接下来,我们需要编写一个显示函数,将转换后的数字温度值显示在数字显示器上。
最后,我们还可以添加一些功能,例如设置温度单位(摄氏度或华氏度)和存储温度数据等。
在系统实施过程中,我们需要按照以下步骤进行操作:首先,进行硬件的连接和组装。
确保所有电子元件正确连接并固定在电路板上。
然后,烧录编写好的程序到51单片机中。
接下来,我们可以通过设置开关或按键来控制系统的操作。
最后,我们可以测试系统的功能和性能,确保数字温度计正常工作。
值得注意的是,在设计和实现数字温度计系统时,我们需要考虑一些问题。
例如,温度传感器的精度和响应时间,数字显示器的显示精度和分辨率,以及系统的稳定性和可靠性等。
通过合理的设计和选择高质量的元件,我们可以提高系统的性能和可靠性。
总结起来,本次任务中我们基于51单片机设计和实现了一个数字温度计系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课题:基于51单片机数字温度计设计专业:电子信息工程班级:(1)班学号:姓名:峰指导教师:周冬芹设计日期:成绩:重庆大学城市科技学院电气学院基于51单片机数字温度计设计一、设计目的1、掌握单片机电路的设计原理、组装与调试方法。
2、掌握LED数码显示电路的设计和使用方法。
3、掌握DS18B20温度传感器的工作原理及使用方法。
二、设计要求1、本次单片机课程设计要求以51系列单片机为核心,以开发板为平台。
2、设计一个数字式温度计,要求使用DS18B20温度传感器测量温度。
3、经单片机处理后,要求用4位一体共阴LED数码管来设计显示电路,以显示测量的温度值。
4、另外还要求在设计中加入报警系统,如果我们所设计的系统用来监控某一设备,当设备的温度超过或低于我们所设定的温度值时,系统会产生报警。
5、要求在设计中加入上下限警报温度设置电路。
三、设计的具体实现1数字温度计设计的方案在做数字温度计的单片机电路中,对信号的采集电路大多都是使用传感器,这是非常容易实现的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
采集之后,通过使用51系列的单片机,可以对数据进行相应的处理,再由LED显示电路对其数据进行显示。
2系统设计框图温度计电路设计总体设计方框图如下图所示,控制器采用单片机A T89C51,温度传感器采用DS18B20,用4位一体共阴LED数码管以串口传送数据实现温度显示。
此外,还添加了报警系统,对温度实施监控。
3主控器AT89C51芯片对于单片机的选择,可以考虑使用8031与8051系列,由于8031没有内部RAM,系统又需要大量内存存储数据,因而不适用。
AT89C51 以低价位单片机可为提供许多高性价比的应用场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。
单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要该器件是INTEL公司生产的MCS一5l系列单片机中的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS—51的CMOS产品。
AT8951的管脚如下图所示:A T89C51芯片管脚图4时钟电路80C51时钟有两种方式产生,即内部方式和外部方式。
80C51中有一个构成内部震荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
本次采用内部震荡电路,瓷片电容采用22PF,晶振为12MHZ。
晶体震荡电路图5 复位电路单片机系统的复位电路在这里采用的是上电+按钮复位电路形式,其中电阻R采用10KΩ的阻值,电容采用10μF的电容值。
复位电路6 温度传感电路DALLAS 最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。
DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。
温度测量范围为-55~+125 摄氏度,可编程为9位~12 位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。
被测温度用符号扩展的16位数字量方式串行输出。
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列、各种封装形式,DQ 为数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源;GND 为地信号;VDD为可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地,如下图所示。
DS18B20管脚图7 显示电路对于数字温度的显示,我们采用4位一体共阴LED数码管。
足够显示0~100中各位数,并且还能显示一位小数部分。
4位LED数码显示管8 温度报警电路对于数字温度计的设计,除了温度的数字显示功能外还加入了报警系统,当测量的温度超过或低于我们所设定的温度值时,系统会产生报警并亮红灯报警。
其电路图如下所示。
蜂鸣器红灯报警系统电路图源程序:/******************************************* ************************** 程序名; 基于51单片机的温度计* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。
K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。
在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s 左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。
在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。
******************************************* **************************/#include<reg52.h>#include<intrins.h>//将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int#define uchar unsigned charuchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0;//s1标志位用于上下限查看时的显示void display1(uint z);#include"ds18b20.h"#include"keyscan.h"#include"display.h"/******************************************* ***********//* 主函数//******************************************* **********/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上电后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1){keyscan();get_temperature(0);display(temp,temp_d*0.625);alarm();}}/******************************************* **************************** 程序名; ds18b20数码管动态显示头文件* 功能:通过定时器0延时是数码管动态显示******************************************* ***************************/#ifndef __ds18b20_display_H__#define __ds18b20_display_H__#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)sbit wei1=P2^4; //可位寻址变量定义,用wei1表示P2.4口sbit wei2=P2^5; //用wei2表示P2.5口sbit wei3=P2^6; //用wei3表示P2.6口sbit wei4=P2^7; //用wei4表示P2.7口uchar num=0; //定义num为全局无符号字符型变量,赋初值为‘0’uchar code temperature1[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0 x7d,0x07,0x7f,0x6f}; //定义显示码表0~9uchar code temperature2[]={ 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0 xfd,0x87,0xff,0xef}; //带小数点的0~9.uchar code temperature3[]={ 0x00,0x80,0x40,0x76,0x38};//依次是‘不显示’‘.’‘-’‘H’‘L’/******************************************* ***********// 延时子函数//******************************************* **********/void display_delay(uint t) //延时1ms左右{uint i,j;for(i=t;i>0;i--)for(j=120;j>0;j--);}/******************************************* ***********//* 定时器1初始化函数//******************************************* **********/void timer1_init(bit t){TMOD=0x10;TH0=0x3c;TL0=0xb0;EA=1;ET1=1;TR1=t; // 局部变量t 为1启动定时器1,为0关闭定时器1}/******************************************* ***********//* 定时器1中断函数//******************************************* **********/void timer1() interrupt 3{TH0=0x3c; //重新赋初值,定时50msTL0=0xb0;num++; //每进入一次定时器中断num加1(每50ms加1一次)if(num<5){s=1;if(w==1){beer=1;led=1;}else{beer=1;led =1;}}else //进入4次中断,定时200ms时若报警标志位w为‘1’则启动报警,不为‘1’不启动//实现间歇性报警功能{s=0;if(w==1){beer=0;led=0;}else{beer=1;led =1;}}if(num>20) //进入20次中断,定时1s{num=0;//num归0,重新定开始定时1ss1=0; //定时1s时间到时自动关闭报警上下限显示功能v1=1; //定时1s时间到时自动关闭报警上下限查看功能}}/******************************************* ***********//* 调整报警上下限选择函数//******************************************* **********/void selsct_1(uchar f,uchar k) //消除百位的0显示,及正负温度的显示选择{if(f==0) //若为正温度,百位为0则不显示百位,不为0则显示{if(k/100==0) P0=temperature3[0];elseP0=temperature1[k/100];}if(f==1) //若为负温度,若十位为0,百位不显示,否则百位显示‘-’{if(k%100/10==0)P0=temperature3[0];elseP0=temperature3[2];}}void selsct_2(bit f,uchar k) //消除十位的0显示,及正负温度的显示选择{if(f==0) //若为正温度,百位十位均为0则不显示十位,否则显示十位{if((k/100==0)&&(k%100/10==0))P0=temperature3[0];elseP0=temperature1[k%100/10];}if(f==1) //若为负温度,若十位为0,十位不显示,否则十位显示‘-’{if(k%100/10==0)P0=temperature3[2];elseP0=temperature1[k%100/10];}}/******************************************* ***********/ /* 主函数显示//******************************************* **********/void display(uchar t,uchar t_d) //用于实测温度、上限温度的显示{uchar i;for(i=0;i<4;i++) //依次从左至右选通数码管显示,实现动态显示{switch(i){case 0: //选通第一个数码管wei2=1; //关第二个数码管wei3=1; //关第三个数码管wei4=1; //关第四个数码管wei1=0; //开第一个数码管if(a==0){selsct_1(f,t);} //若a=0则在第一个数码管上显示测量温度的百位或‘-’if(a==1){P0=temperature3[3]; //若a=1则在第一个数码管上显示‘H’}if(a==2){P0=temperature3[4]; //若a=2则在第一个数码管上显示‘L’}break;case 1://选通第二个数码管wei1=1;wei3=1;wei4=1;wei2=0;if(a==0){selsct_2(f,t);} //若a=0则在第二个数码管上显示测量温度的十位或‘-’if(a==1) //若a=1则在第二个数码管上显示上限报警温度的百位或‘-’{if(s==0) selsct_1(f_max,max);//若s=0则显示第二个数码管,否则不显示else P0=temperature3[0]; //通过s标志位的变化实现调节上下限报警温度时数码管的闪烁if(s1==1) selsct_1(f_max,max);//若s1=1则显示第二个数码管(s1标志位用于上下限查看时的显示)}if(a==2) //若a=2则在第二个数码管上显示下限报警温度的百位或‘-’{if(s==0) selsct_1(f_min,min);else P0=temperature3[0];if(s1==1) selsct_1(f_min,min);}break;case 2://选通第三个数码管wei1=1;wei2=1;wei4=1;wei3=0;if(a==0){P0=temperature2[t%10];}//若a=0则在第三个数码管上显示测量温度的个位if(a==1) //若a=1则在第三个数码管上显示上限报警温度的十位或‘-’{if(s==0) selsct_2(f_max,max);//若s=0则显示第三个数码管,否则不显示else P0=temperature3[0];if(s1==1) selsct_2(f_max,max);//若s1=1则显示第三个数码管}if(a==2) //若a=2则在第三个数码管上显示下限报警温度的十位或‘-’{if(s==0) selsct_2(f_min,min);else P0=temperature3[0];if(s1==1) selsct_2(f_min,min);}break;case 3: //选通第四个数码管wei1=1;wei2=1;wei3=1;wei4=0;if(a==0){P0=temperature1[t_d];}//若a=0则在第四个数码管上显示测量温度的小数位if(a==1) //若a=1则在第四个数码管上显示上限报警温度的个位{if(s==0)P0=temperature1[max%10];//若s=0则显示第四个数码管,否则不显示else P0=temperature3[0];if(s1==1)P0=temperature1[max%10];//若s1=1则显示第四个数码管}if(a==2) //若a=2则在第四个数码管上显示下限报警温度的个位{if(s==0)P0=temperature1[min%10];else P0=temperature3[0];if(s1==1)P0=temperature1[min%10];}break;}display_delay(10); //每个数码管显示3ms左右}}/******************************************* ***********//* 开机显示函数//******************************************* **********/void display1(uint z) //用于开机动画的显示{uchar i,j;bit f=0;for(i=0;i<z;i++) //‘z’是显示遍数的设定{for(j=0;j<4;j++) //依次从左至右显示‘-’{switch(j){case 0:wei2=1;wei3=1;wei4=1;wei1=0; break;P0=temperature3[2];//第一个数码管显示case 1:wei1=1;wei3=1;wei4=1;wei2=0;break;P0=temperature3[2];//第二个数码管显示case 2:wei1=1;wei2=1;wei4=1;wei3=0;break;P0=temperature3[2];//第三个数码管显示case 3:wei1=1;wei2=1;wei3=1;wei4=0;break;P0=temperature3[2];//第四个数码管显示}display_delay(400); //每个数码管显示200ms左右}}}#endif/******************************************* ************************** 程序名; DS18B20头文件* 说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d* (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表* 示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。