ds18b20温度报警器
- 格式:ppt
- 大小:860.50 KB
- 文档页数:14
数字温度传感器DS18B20及其应用数字化技术推动了信息化的革命在传感器的器件结构上采用数字化技术,使信息的采集变得更加方便。
例如,对于温度信号采集系统,传统的模拟温度传感器多为铂电阻、铜电阻等。
每一个传感器的传输线至少有两根导线,带补偿接法需要三根导线。
如果对50路温度信号进行检测,就需要100根或150根导线接到采集端口,然后还要经过电桥电路、信号放大、通道选择、A/D转换等,才能将温度信号变成数字信号供计算机处理。
DS18B20是美国DALLAS公司生产的新型单总线数字温度传感器,如图1所示。
DS18B20采用3脚(或8脚)封装,从图1中看到,从DS18B20读出或写人数据仅需要一根I/O口线。
并且以串行通信的方式与微控制器进行数据通信。
该器件将半导体温敏器件、A/D 转换器、存储器等做在一个很小的集成电路芯片上,传感器直接输出的就是温度信号数字值。
信号传输采用两芯(或三芯)电缆构成的单总线结构。
一条单总线电缆上可以挂接若干个数字温度传感器,每个传感器有一个唯一的地址编码。
微控制器通过对器件的寻址,就可以读取某一个传感器的温度值,从而简化了信号采集系统的电路结构。
采集端口的连接线减少了50倍,既节省了造价,又给现场施工带来极大的方便。
DS18B20是实现单总线测控网络的关键器件,主要包括:寄生电源、温度传感器、64位激光ROM 和单总线接口、存放中间数据的高速暂存器RAM、用于存储用户设定温度上下限值的TH和TL触发器、存储与控制逻辑、8位循环冗余校验码(CRC)发生器等七部分。
DS18B20内部存储器由ROM、RAM和E2ROM组成,其中,ROM 由64位二进制数字组成,共分为8个字节,字节0的内容是该产品的厂家代号28H,字节1~字节6的内容是48位器件序列号,字节7是ROM前56位的CRC校验码。
由于64位ROM 码具有唯一性,在使用时作为该器件的地址,通过读ROM命令可以将它读出来。
www�ele169�com | 83电子基础0 引言温度是日常生活中极为重要的一个参数,所以对温度的检测的意义也不言而喻。
本设计是通过温度传感器给单片机系统提供了温度数据,然后再根据用户设置温度的上下限来判断是否报警从而提醒用户的注意。
1 设计方案图1为系统的设计框图。
根据实际需求,系统由主控单片机、显示模块、测温模块、报警模块及人机接口模块和电源等6部分组成。
主控模块单片机为核心,接收测温模块传来的数据并进行处理,通过报警模块和显示模块给出结果。
人机接口模块通过按键电路来实现,通过按键完成对系统的设置和修改等功能。
电源保证系统供电。
图1 设计框图2 硬件设计系统的结构可分为单片机最小系统、温度采集模块、数码管显示部分、声光报警模块、按键模块和电源模块等六个模块。
下面分别对每个模块进行说明。
■2.1 单片机控制模块图2 单片机最小系统单片机控制模块用STC89c52单片机作为控制器,STC89c52的正常工作需要时钟电路及复位电路作为单片机的最小系统。
电路如图2所示。
■2.2 温度采集模块温度采集模块使用DS18B20温度传感器实现。
该传感器可直接读出被测温度,并将读数以数字量的形式输入到单片机的I/O 口。
此外,如果需要提高精度,可以将多个DS18B20传感器连接在同一条总线上,而不会相互影响。
图3为DS18B20的内部框图。
图4为电路原理图。
图3 DS18B20内部框图图4 DS18B20电路原理图■2.3 数码管显示部分七段显示译码管分为共阳极数码管和共阴极数码管两种。
设计采用四位共阳极数码管实现。
具体电路如图5所示。
在本设计中运用了三极管作为反相器,因为共阳数码管的显示需要动态扫描进行位选,共阳数码管在高电平的情况下可以触发位选,选择动态扫描的方式数码管可以工作但是亮度基于DS18B20的简易温度报警器的设计吴坤,何英昊(大连理工大学城市学院,辽宁大连,116023)基金项目:大连理工大学城市学院教育教学研究基金一般项目“基于个性化培养的电子信息专业实践教学研究”(JXYJ2018008)。
基于单片机和DS18B20的多点温度检测报警系统摘要本文主要介绍以STC89C51单片机为上位机、以数字温度传感器DS18B20为温度采集元件的多点温度检测报警系统,其主要可以分为五个模块:温度检测模块、数据处理模块、温度显示模块、异常报警模块和系统设置模块。
该系统可以将各点的温度值实时的在上位机显示屏显示,还可以通过按键对各点的温度限值进行设定,当实际温度值超出系统温度限值时就会触发蜂鸣器进行报警。
该系统成本低、设备稳定,适用于家居、商场以及一些小型企业的仓库的温度检测与监视。
关键词单片机;数字温度传感器;温度采集与报警Multi-channel Temperature Detection Alarm System Based on Microcomputer and DS18B20引言随着我国人民生活水平的日益提升,人们越来越重视我们的人身安全问题。
现实生活中由于温度高于(或低于)温度限值而引发的火灾、爆炸等事故是人身安全的一重大隐患,显然有效地降低此类事故的发生显得格外重要,而这一目标的实现必须依靠先进的控制技术和设备对环境温度进行监控。
传统的方式是采用热电偶或热电阻,但是由于模拟温度传感器的输出为模拟信号,必须利用A/D 转换器获得数字信号后才能进行数据的处理,这使得电路的设计较复杂,而且制作成本也比较高。
基于DS18B20数字温度传感器,设计出了一个温度测量、显示及报警系统。
该系统由51单片机STC89C51控制,并由液晶显示屏实时显示温度,也可设定系统温度的上限与下限,以便在温度超过或低于限值时进行报警。
1 数字温度传感器DS18B20的结构特征介绍1.1 DS18B20是一种集成化的数字温度传感器,广泛应用于实验室、仓库以及车间等场所,其主要特性如下。
(1)采用“单总线”接口方式;(2)将温度值转换成数字的速度很快;(3)电压适应范围较宽,电压范围:3.0~5.5V;(4)DS18B20内部完整的集成了传感器件和转换电路;(5)温度测量范围:55℃~125℃,在10℃~85℃时精度为±0.5℃;(6)DS18B20支持多点组网功能,可将多个DS18B20并联在一起,实现多点测温。
DS18B20智能温度控制器DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、 DS1822 “一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V 的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20的内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
项目5《18B20温控报警器制作与调试》5.1 项目描述和要求5.1.1 项目描述本项目基于AT89S51单片机的数字温度报警器系统。
以数字温度传感器18B20作为核心元件,采用LED数码管作为显示,以蜂鸣器作为报警器,该系统可以方便的实现温度的采集和报警,并可以根据需要任意上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当做温度处理模块潜入其他系统中,作为其他主系统的辅助扩展。
DS18B20与AT89S51结合实现最简温度报警系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
5.1.2 项目要求完成作品详细要求如下:1.质量要求:温度采集、报警准确,数码管显示效果稳定清晰、无乱码。
2.安全要求:作品无短路故障,正确使用仪器仪表,凡通电测试必须经过老师同意才能执行,遇到特殊情况立即断电并报告老师。
3.文明要求:不要携带任何饮料进入实训室,统一穿好校服、佩戴好校卡,进入实训室不喧哗吵闹,书包统一放置讲台旁边。
自觉遵守实训室规定进行项目作业。
4.环保要求:制作过程能重复利用的元器件要尽量重复使用,电路布局尽量紧凑不浪费板材,下课离开实训台请关闭实训台电源。
5.2 知识准备:5.2.1 了解温控报警器图5-1 图5-2温度是科学技术中最基本的物理量之一,物理、化学、生物等学科都离不开温度。
在工业生产和实验研究中,像电力、化工、石油、冶金、航空航天、机械制造、粮食存储、酒类生产等领域内,温度常常是表征对象和过程状态的最重要的参数之一。
比如,发电厂锅炉的温度必须控制在一定的范围之内;许多化学反应的工艺过程必须在适当的温度下才能正常进行;炼油过程中,原油必须在不同的温度和压力条件下进行分馏才能得到汽油、柴油、煤油等产品。
没有合适的温度环境,许多电子设备就不能正常工作,粮仓的储粮就会变质霉烂,酒类的品质就没有保障。
一、概述传统的温度检测大多以热敏电阻为传感器,采用热敏电阻,可满足40℃至90℃测量范围,但热敏电阻可靠性差,测量温度准确率低,对于小于1℃的温度信号是不适用的,还得经过专门的接口电路转换成数字信号才能由微处理器进行处理。
目前常用的微机与外设之间进行的数据通信的串行总线主要有I2C总线,SPI总线等。
其中I2C总线以同步串行2线方式进行通信(一条时钟线,一条数据线),SPI总线则以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线)。
这些总线至少需要两条或两条以上的信号线。
而单总线( 1-wire bus ),采用单根信号线,既可传输数据,而且数据传输是双向的,CPU 只需一根端口线就能与诸多单总线器件通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
因而,这种单总线技术具有线路简单,硬件开销少,成本低廉,软件设计简单,便于总线扩展和维护。
同时,基于单总线技术能较好地解决传统识别器普遍存在的携带不便,易损坏,易受腐馈,易受电磁干扰等不足,因此,单总线具有广阔的应用前景,是值得关注的一个发展领域。
单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。
主机或从机通过一个漏极开路或三态端口连至数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线。
单总线通常要求外接一个约为4.7K的上拉电阻,这样,当总线闲置时其状态为高电平。
DS18B20数字式温度传感器,与传统的热敏电阻有所不同的是,使用集成芯片,采用单总线技术,其能够有效的减小外界的干扰,提高测量的精度。
同时,它可以直接将被测温度转化成串行数字信号供微机处理,接口简单,使数据传输和处理简单化。
部分功能电路的集成,使总体硬件设计更简洁,能有效地降低成本,搭建电路和焊接电路时更快,调试也更方便简单化,这也就缩短了开发的周期。
DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点:( 1 )采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
DS18B20 单线温度传感器一.特征:●独特的单线接口,只需 1 个接口引脚即可通信●每个设备都有一个唯一的64位串行代码存储在光盘片上●多点能力使分布式温度检测应用得以简化●不需要外部部件●可以从数据线供电,电源电压范围为3。
0V至5.5V●测量范围从—55 ° C至+125 ° C(—67 ° F至257 ° F),从-10℃至+85 ° C的精度为0.5 °C●温度计分辨率是用户可选择的9至12位●转换12位数字的最长时间是750ms●用户可定义的非易失性的温度告警设置●告警搜索命令识别和寻址温度在编定的极限之外的器件(温度告警情况)●采用8引脚SO(150mil),8引脚SOP和3引脚TO — 92封装●软件与DS1822兼容●应用范围包括恒温控制工业系统消费类产品温度计或任何热敏系统二.简介该DS18B20的数字温度计提供9至12位的摄氏温度测量,并具有与非易失性用户可编程上限和下限报警功能。
信息单线接口送入 DS1820 或从 DS1820 送出,因此按照定义只需要一条数据线(和地线)与中央微处理器进行通信.它的测温范围从-55 °C到 +125 ° C,其中从-10 °C至+85 °C可以精确到0。
5°C 。
此外,DS18B20可以从数据线直接供电(“寄生电源”),从而消除了供应需要一个外部电源。
每个 DS18B20 的有一个唯一的64位序列码,它允许多个DS18B20s的功能在同一1-巴士线。
因此,用一个微处理器控制大面积分布的许多DS18B20s是非常简单的。
此特性的应用范围包括 HVAC、环境控制、建筑物、设备或机械内的温度检测以及过程监视和控制系统。
三.综述64位ROM存储设备的独特序号。
存贮器包含2个字节的温度寄存器,它存储来自温度传感器的数字输出.此外,暂存器可以访问的1个字节的上下限温度告警触发器(TH和TL)和1个字节的配置寄存器。
DS18B20温度测量报警设定温度上下限分类:单片机2011-10-07 19:42 719人阅读评论(1) 收藏举报#include <reg52.h>#include <stdio.h>uchar DQ;uchar k;sbit ds=P2^4; //温度传感器引脚;sbit beep=P2^0; //蜂鸣器uint temp;float ftemp;uchar g1=22,g2=24,d1=20,d2=18;sbit b=P2^3; //定义按键;sbit a=P2^2; //定义按键;sbit E=P2^7;//使能信号;sbit RW=P2^6;//读写选择写指令RS=0;RW=0;D0~D7指令码;E高脉冲;sbit RS=P2^5;//数据/命令选择写数据RS=1;RW=0;D0~D7数据;E高脉冲uchar code table1[]="DS18B20 OK ! ";uchar code table2[]="TEMP IS: . ";//自定义字符显示'C ;uchar code table[8] = {0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00} ;uchar code table3[]="DS18B20 ERR0R !";uchar code table4[]="PLEASE CHECK !";uchar code table7[]="set standard "; uchar code table8[]=" tempreture ! "; uchar code table5[]="G1= ,G2= .";uchar code table6[]="D1= ,D2= .";void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //液晶写指令;{P1=com;RS=0;RW=0;E=1;delay(5);E=0;delay(5);}void write_date(uchar date) //液晶写数据;{P1=date;RS=1;RW=0;E=1;delay(5);E=0;delay(5);}void chushi(){uchar f;write_com(0x80);f=0;while(table7[f]!=0){write_date(table7[f]);f++;}write_com(0x80+0x40);f=0;while(table8[f]!=0){write_date(table8[f]);f++;}}void init() //液晶初始化状态;{write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);chushi();}dsreset(void) //DS18B20复位初始化函数{uint i;ds=0;i=103;while(i>0) i--;ds=1;i=4;while(i>0) i--;DQ=ds;i=4;while(i>0) i--;return DQ;}bit tempreadbit(void) //读一位数据函数{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0) i--;return(dat);}uchar tempread(void) //读一个字节数据函数{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1);}return(dat);}void tempwritebyte(uchar dat) //写一个字节数据函数{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //写1{ds=0;i++;i++;ds=1;i=8;while(i>0) i--;}else //写0{ds=0;i=8;while(i>0) i--;ds=1;i++;i++;}}}void tempchange(void) //DS18B20 开始获取温度并转换{dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0x44);}uint get_temp() //读取寄存器中存储的温度数据{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread();b=tempread();temp=b;temp<<=8;temp=temp|a;ftemp=temp*0.0625;temp=ftemp*10+0.5;ftemp=ftemp+0.05;return temp;}void init_com(void) //串口初始化;{PCON=0x00;SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;}void comm(char *parr) //串口发送;do{SBUF=*parr++;while(!TI);TI=0;}while(*parr!='\0');}void zdy() //自定义字符显示’C;{ uchar i;write_com(0x40);for(i=0;i<9;i++)write_date(table[i]);write_com(0x80+0x40+14);write_date(0x00);}void ok() //温度传感器存在显示温度;{uchar i;write_com(0x80);for(i=0;i<16;i++)write_date(table1[i]);write_com(0x80+0x40);for(i=0;i<16;i++)write_date(table2[i]);}void error() //温度传感器不存在显示错误;uchar i;write_com(0x80);for(i=0;i<16;i++)write_date(table3[i]);write_com(0x80+0x40);for(i=0;i<16;i++)write_date(table4[i]);}void display() //液晶显示温度;{write_com(0x80+0x40+10);write_date(temp/100+0x30); write_com(0x80+0x40+11);write_date(temp%100/10+0x30); write_com(0x80+0x40+13);write_date(temp%100%10+0x30); }void fmq(uint i) //蜂鸣器滴答;{beep=0;delay(i);beep=1;}void dywd(uchar add,uchar date) //定义温度液晶显示;{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void di() //蜂鸣器滴答;{beep=0;delay(100);beep=1;}uint keyscan() //按键扫描,调标准温度;{uchar f;if(a==0){delay(10);if(a==0){k++;while(!a);di();write_com(0x80);f=0;while(table5[f]!=0){write_date(table5[f]);f++;}write_com(0x80+0x40); f=0;while(table6[f]!=0){write_date(table6[f]);f++;}dywd(4,g1);dywd(12,g2);dywd(4+0x40,d1); dywd(12+0x40,d2);if(k==1){write_com(0x80+5); write_com(0x0f);}if(k==2){write_com(0x80+13); write_com(0x0f);}if(k==3){write_com(0x80+0x40+5); write_com(0x0f);}if(k==4){write_com(0x80+0x40+13); write_com(0x0f);}if(k==5){write_com(0x0c);}}}if(k!=0){if(b==0){delay(10);if(b==0){while(!b);di();if(k==1){g1--;if(g1==0)g1=60;dywd(4,g1);write_com(0x80+5);}if(k==2){g2--;if(g1==0)g2=60;dywd(12,g2);write_com(0x80+13);}if(k==3){d1--;if(g1==0)d1=60;dywd(4+0x40,d1);write_com(0x80+0x40+5); }if(k==4){d2--;if(g1==0)d2=60;dywd(12+0x40,d2);write_com(0x80+0x40+13); }}}}return g1;return g2;return d1;return d2;}void warn(uint temp) //温度报警;{uchar a=d2,b=d1,c=g1,d=g2;if(temp<=a*10) //灯1,2 亮;{P0=0xfc;fmq(250);display();}else if((temp<b*10)&&(temp>=a*10)) //灯3 亮; {P0=0xfb;fmq(20);display();}else if((temp<c*10)&&(temp>=a*10)) //灯4,5 亮;{P0=0xe7;display();beep=1;}if((temp>c*10)&&(temp<d*10)) //灯6 亮;{P0=0xdf;fmq(20);display();}else if(temp>=d*10) //灯7,8 亮;{P0=0x3f;fmq(250);display();}}void main() //主函数{uchar buff[4];init_com(); //串口初始化;init(); //液晶初始化状态;dsreset(); //DS18B20复位初始化函数;tempchange(); //DS18B20 开始获取温度并转;get_temp(); //读取寄存器中存储的温度数据while(1){keyscan();if(k==5){ok(); //温度传感器存在程序;do{tempchange();sprintf(buff,"%f",ftemp);comm(buff); //串口发送;zdy();warn(get_temp());}while(!DQ);error(); //温度传感器不存在程序;do{fmq(1);dsreset();P0=0x00;}while(DQ);}}。
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^6;sbit BEEP=P3^7;sbit HI_LED=P1^4;sbit LO_LED=P1^5;bit HI_Alarm=0,LO_Alarm=0;bit DS18B20_IS_OK=1;uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; / /数码管共阴极段码uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}; //温度小数位对照表ucharCurrentT=0;//温度整数部分ucharDisplay_Digit[]={0,0,0,0}; //数码管待显示的各位温度ucharTemp_Value[]={0x00,0x00}; //DS0832读取的温度值uintTime0_Count=0; / / 定时器中断计数char Alarm_Temp_HL[2]={70,-20};/***********延时程序*************/void Delay(uint x){while(--x);}/**********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;}/**********DS18B20读字节********/ 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;}/**********DS18B20写字节********/void WriteOneByte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat & 0x01;Delay(5); DQ=1; dat>>=1; }}/**********从DS18B20读取温度********/void Read_Temperature(){if( Init_DS18B20()==1)DS18B20_IS_OK=0;else{WriteOneByte(0xCC);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xCC);WriteOneByte(0xBE);Temp_Value[0]=ReadOneByte();Temp_Value[1]=ReadOneByte();DS18B20_IS_OK=1;}}/**********给DS18B20设置报警值********/void Set_Alarm_Temp_Value(){Init_DS18B20();WriteOneByte(0xcc); //跳过序列号WriteOneByte(0x4e); //将设定的温度报警值写入DS18B20WriteOneByte(Alarm_Temp_HL[0]); //写THWriteOneByte(Alarm_Temp_HL[1]); //写TLWriteOneByte(0x7f); //12位精度Init_DS18B20();WriteOneByte(0xcc); //跳过序列号WriteOneByte(0x48); //将温度报警值存入DS18B20}/**********温度值显示******************/void Display_Temperature() //显示温度{uchar i;uchar t=150; //延时值uchar ng=0,np=0; //负数标示,及负号显示位置char Signed_Current_Temp;if((Temp_Value[1]&0xf8)==0xf8) //如果为负数,取反加1;设置负数标示及负号显示位置{Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng=1;np=0xfd;}Display_Digit[0]=df_Table[Temp_Value[0]&0x0f]; //查表显示温度小数位CurrentT=((Temp_Value[0]&0xf0)>>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;if(Display_Digit[3]==0) //高位为0,不现实,负号后移{ Display_Digit[3]=10;np=0xfb;if(Display_Digit[2]==0){Display_Digit[2]=10;np=0xf7;}}for(i=0;i<30;i++) //刷新数码管显示温度值{P0=0X39;P2=0X7F;Delay(t);P2=0XFF;P0=0X63;P2=0XBF;Delay(t);P2=0XFF;P0=DSY_CODE[Display_Digit[0]];P2=0XDF;Delay(t);P2=0XFF;P0=(DSY_CODE[Display_Digit[1]])|0X80;P2=0XEF;Delay(t);P2=0XFF;P0=DSY_CODE[Display_Digit[2]];P2=0XF7;Delay(t);P2=0XFF;P0=DSY_CODE[Display_Digit[3]];P2=0XFB;Delay(t);P2=0XFF;if(ng){P0=0X40;P2=np;Delay(t);P2=0XFF;}}}/**********定时器0中断,控制报警声音********/ 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=1;if(LO_Alarm)LO_LED=~LO_LED;else LO_LED=1;}}void main(){IE=0X82;TMOD=0X01; //方式1计数TH0=-1000/256;TL0=-1000%256;TR0=0;HI_LED=1;LO_LED=1;Set_Alarm_Temp_Value();Read_Temperature();Delay(50000); Delay(50000);while(1){Read_Temperature();if(DS18B20_IS_OK){if(HI_Alarm==1||LO_Alarm==1)TR0=1; else TR0=0;Display_Temperature();}else{P0=P2=0X00;}}}。