用DS18B20做的数字温度计
- 格式:doc
- 大小:270.00 KB
- 文档页数:13
使用DS18B20制作电子温度计——中北大学:马政贵本制作中使用单总线数字温度传感器DS18B20进行温度的测定,并通过51单片机控制1602液晶进行显示。
制作好的电子温度计如下图所示(显示当前温度为20.5摄氏度):第一部分:DS18B20的使用先介绍一下单总线的特点:单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。
单总线通常要求外接一个约为 4.7K —10K 的上拉电阻,这样,当总线闲置时其状态为高电平。
再介绍一下DS18B20的特点:( 1 )采用单总线的接口方式,与微处理器连接时,仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。
单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
( 2 )测量温度范围宽,测量精度高: DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范围内,精度为 ± 0.5°C 。
( 3 )在使用中不需要任何外围元件。
( 4 )支持多点组网功能:多个 DS18B20 可以并联在惟一的单线上,实现多点测温。
( 5 )供电方式灵活:DS18B20 可以通过内部寄生电路从数据线上获取电源。
因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
( 6 )测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
( 7 )负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
( 8 )掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
基于DS18B20+89C52单片机的数字温度计设计简介数字温度计是现代生活中常见的电子设备之一,其广泛应用于医疗、环境监测、生产制造等领域。
本文介绍基于DS18B20+89C52单片机的数字温度计设计。
DS18B20是一款高精度数字温度传感器,能够实现0.5℃的温度测量精度,同时具备防水、防腐等特性。
89C52是一款高性能单片机,具备高速计算、高稳定性等特点。
本文将分析DS18B20的原理及使用方法,并结合89C52单片机设计出一款数字温度计。
DS18B20工作原理DS18B20是一种数字温度传感器,内置了AD转换器、数字信号处理器等。
其工作原理为利用其内部的温度传感器测量物体的温度,将温度转换为增量数字量输出,输出端为单总线,同时具备多级地址识别能力,因此可进行多个传感器测温。
DS18B20使用方法1.按照DS18B20的引脚标识将其连接至单总线上;2.DS18B20提供了ROM查询指令,用于查询DS18B20的唯一地址;3.测温需要通过读取DS18B20的EEPROM寄存器得到,读取指令由主控制器发出,DS18B20在收到读取指令后进行温度转换,然后将转换后的温度值存储至EEPROM中;4.读取温度值需要使用读温度命令,该命令由主控制器发出,DS18B20回送温度值。
89C52单片机使用方法89C52是一款AT89C系列单片机,具备丰富的I/O端口、高速时钟、EEPROM等特点。
在使用89C52进行数字温度计设计时,需要进行以下操作: 1.通过端口设定进行DS18B20的唤醒和读温度操作; 2. 通过定时器进行延时操作,调整温度传感器的读取时间; 3. 将温度值加以整型处理并显示。
数字温度计设计数字温度计的设计需要综合考虑到DS18B20的特性以及89C52单片机的能力和特点。
下面是数字温度计的设计实现过程: 1. 连接DS18B20至89C52单片机的I/O口; 2. 设计读取DS18B20的温度值程序; 3. 设计处理温度值的程序,并将其显示至数码管上; 4. 加入延时程序,以保障温度读取的准确性和稳定性。
基于DS18B20室内数字温度计日常生活中人们需要测量各种各样的温度。
环境温度对工业、农业、商业都有很大的影响。
传统的测温仪测量费时,准确度也较低,数字温度计与传统的温度计相比,具有读数速度快,测温范围广,其输出温度采用数字显示,便于用户使用。
随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,本设计所介绍的数字温度计使用单片机stc89C51,测温传感器使用DS18B20,用数码管实现温度显示,利用DS18B20和一片stc89C51单片机即可构成一个简洁但功能强大的低电压温度测量控制系统。
一、设计前言1.1 设计目的1.理论联系实际,单片机应用,尝试设计案例程序2.对主要元件功能有所了解3.学会用C语言编写程序4.培养设计项目程序流程图的思想5.掌握项目中所使用到的元器件的硬件原理,并用Proteus软件仿真,并用protell99se画PCB1.2设计内容1.所设计实验装置以MCS-51系列单片机为核心器件,组成一个数字式温度计。
2.所设计实验装置能够利用数码管直接显示出外界温度及温度变化。
3.所设计实验装置测试外界温度误差范围在±0.5℃之间。
4.手机充电器作稳压电源。
1.3设计要求1.独立设计原理图及相应的硬件电路。
2.独立焊接电路板并对电路板调试。
3.针对选择的设计题目,设计系统软件。
软件要做到:操作方便,实用性强,稳定可靠。
4.设计说明书格式规范,层次合理,重点突出。
并附上设计原理图、电路板图及相应的源程序。
二、设计方案2.1方案论证鉴于此设计题目,以下想到两种可能方案:方案一热敏电阻由于此设计是测温电路,所以想到使用热敏电阻,利用它的感温效应,在实验过程中记录在其温度变化时的电压或电流,进行A/D转换后,就可以用单片机进行数据处理,在显示电路上,就可以将被测温度显示出来。
方案二温度传感器此设计利用温度传感器,采用一只温度传感器DS18B20,控制器单片机AT89S51,用液晶显示器显示温度。
基于DS18B20的数字温度计设计一、课程设计目的1.培养学生文献检索的能力,如何利用Internet检索需要的文献资料。
2.培养学生综合分析问题、发现问题和解决问题的能力。
3.培养学生综合运用知识的能力和工程设计的能力。
4.培养学生理论联系实际的能力。
5.提高学生课程设计报告撰写水平。
二、设计内容、技术条件和要求1设计内容数字温度计的设计要能实现温度的实时采集与显示,以AT89S51单片机为核心芯片,使用DS18B20数字温度传感器采集环境温度,并通过一组4位共阴极数码管将温度显示出来,也可用LM1602液晶显示屏。
方案一:使用按钮控制温度的采集与显示。
方案二:使用定时控制温度的采集与显示,时间间隔1S。
2 设计要求•设计单片机最小系统(包括复位按钮、晶振电路等);•DS18B20应用电路设计。
•按键电路设计。
•可使用实验室的实验箱实物实现,也可使用仿真软件Proteus实现。
•绘制实现本设计内容的硬件电路(原理图),系统的组成框图。
•编写本课程设计内容的软件设计(包含程序流程图和对程序注释)。
三、总体设计思想本设计以检测温度并显示温度提供上下限报警为目的,按照系统设计功能的要求,确定系统由5个模块组成:主控器[4]、测温电路,报警电路,按键电路及显示电路。
系统以DS18B20为传感器用以将温度模拟量转化为电压数字量以总线传入单片机,以AT89S51为主芯片,在主芯片对DS18B20传入的温度值进行处理,由单片机程序控制,将经处理后的温度由LM1602液晶显示屏显示出来。
图3-1 数字温度计设计总体的原理图四、硬件设计1、硬件设计图见附件。
2、单片机复位电路工作原理及设计。
硬件图如下图一原理是通过使复位端经电阻与Vcc电源接通而产生按键复位电平,保证复位信号高电平持续时间大于2个机器周期。
3、单片机晶振电路工作原理及设计硬件图如下图二晶振电路是提供系统时钟信号。
为了各部分的同步应当引入公用的外部脉冲信号作为振荡脉冲。
//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: 0.0~ +99.9度#include<AT89X52.H>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define DATAPORT P0 //定义P0口为Led数据口//#define SETTEMP P1 //定义P1口为设定温度#define SELECT P2 //定义P2口为选择信号sbit L1 = P1^1; //灯作为电机sbit L2 = P1^2;sbit L3 = P1^3;sbit DQ = P3^4; //定义ds18b20通信端口charNum[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9int temp1,temp2,ID=0,set=0,blink;int temp1=27,xs=5; //定义整数和小数unsigned int max,mid,min,flag;/////////////////////下面是小板的地址///大板对应为0xc700,0xc600,0xc500////#define led_data XBYTE[0xe000] //显示数据端口#define led_sel XBYTE[0xc000] //显示器选择端#define key_addr XBYTE[0xa000] //按键端口//uchar d[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0x0F8,0x80,0x90};//仿真时用到/*********延时>K*1ms,*//////*12.000mhz>11.0596有误差********/void delayms(int ms){uchar i;while(ms--){for(i=250;i>0;i--);}}/***********ds18b20延迟子函数(晶振11.0596MHz )*******/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位 ds18b20通信端口delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于 480usDQ = 1; //拉高总线delay_18B20(4);x=DQ; //稍做延时后如果x=0则初始化成功 x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 高电平拉成低电平时读周期开始dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80; // | *delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0; //从高电平拉至低电平时,写周期的开始DQ = dat&0x01; //数据的最低位先写入delay_18B20(5); //60us到120us延时DQ = 1;dat>>=1; //从最低位到最高位传入}}/**************读取ds18b20当前温度************/void ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位temp1=b<<4; //高8位中后三位数的值temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值 temp1室温整数值temp2=a&0x0f; //小数的值// temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示 xs小数//上、下限温度值可自动保存,掉电不会丢失。
Hefei University of T echnology课程设计题目:基于数字温度传感器的数字温度计。
设计要求:利用数字温度传感器DS18B20与单片机结合来测量温度。
数字温度传感器DS18B20测量温度并转化成二进制数保存在其内部的存储器中;单片机读取其中的信息并处理,在LED数码管上显示相应的温度值。
数字温度计所测量的温度采用数字显示,微控制器使用单片机STC89C54RD+,测温传感器使用DS18B20,用4位共阴极LED数码管以串口传送数据,实现温度显示。
(1)DS18B20DS18B20温度传感器是美国DALLAS半导体公司推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字读数方式。
下面介绍DS18B20的主要特点和部分使用方法,其他详细信息见DS18B20的数据手册:(a)主要特点独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
与此同时,更低的硬件开销意味者软件的复杂程度增加,而且必须严格按照其规定的时序进行读、写操作。
工作电压3.0~5.5V/DC,在温度不是太高的情况下,还可以使用“寄生电源”模式,即DS18B20的电源引脚不接电源,而是从数据总线中“窃取”能量。
向DS18B20发送测量温度指令之后,DS18B20将温度数据分成两个字节存放。
第一个字节LSB存放温度数据小数部分(存放在LSB的低四位)和整数部分的低四位(存放在LSB的高四位);第二个字节MSB存放温度数据整数部分的高四位(存放在MSB的低四位),MSB的高四位存放温度数据的正负标志。
所有的数据都是以二进制补码的形式存放的。
(b)使用方法:见C51程序的注释。
(2)STC89C54RD+单片机STC89C54RD+单片机是由80C51改良得到的,原理相同,操作方法类似。
基于ds18b20的数字温度计设计报告
一、引言
随着科技的进步,温度的测量和控制变得越来越重要。
DS18B20是一款数字温度传感器,具有测量准确度高、体积小、接口简单等优点,广泛应用于各种温度测量场合。
本报告将介绍基于DS18B20的数字温度计设计。
二、DS18B20简介
DS18B20是一款由美国Dallas公司生产的数字温度传感器,可以通过数据线与微处理器进行通信,实现温度的测量。
DS18B20的测量范围为-55℃~+125℃,精度为±0.5℃。
三、数字温度计设计
1.硬件设计
数字温度计的硬件部分主要包括DS18B20温度传感器、微处理器、显示模块等。
其中,DS18B20负责采集温度数据,微处理器负责处理数据并控制显示模块显示温度。
2.软件设计
软件部分主要实现DS18B20与微处理器的通信和控制显示模块显示。
首先,微处理器通过数据线向DS18B20发送命令,获取温度数据。
然后,微处理器将数据处理后发送给显示模块,实现温度的实时显示。
四、测试结果
经过测试,该数字温度计的测量精度为±0.5℃,符合设计要求。
同时,该温度
计具有测量速度快、体积小、使用方便等优点,可以广泛应用于各种温度测量场合。
五、结论
基于DS18B20的数字温度计具有高精度、低成本、使用方便等优点,可以实现高精度的温度测量和控制。
随着科技的发展,数字温度计的应用将越来越广泛,具有广阔的市场前景。
摘要温度是一种最基本的环境参数,人们生活与环境温度息息相关,在工业生产过程中需要实时测量温度,在工业生产中也离不开温度的测量,因此研究温度的测量方法和控制具有重要的意义。
本论文介绍了一种以单片机为主要控制器件,以DS18B20为温度传感器的新型数字温度计。
主要包括硬件电路的设计和系统程序的设计。
硬件电路主要包括主控制器,测温控制电路和显示电路等,主控制器采用单片机AT8 9C52,温度传感器采用美国DALLAS半导体公司生产的DS18B20,显示电路采用8位共阴极LED数码管,ULN2803A为驱动的动态扫描直读显示。
测温控制电路由温度传感器和预置温度值比较报警电路组成,当实际测量温度值大于预置温度值时,发出报警信号,即发光二极管亮。
系统程序主要包括主程序,测温子程序和显示子程序等。
DS18B20新型单总线数字温度传感器是DALLAS 公司生产的单线数字温度传感器, 集温度测量和 A /D转换于一体,直接输出数字量,具有接口简单、精度高、抗干扰能力强、工作稳定可靠等特点。
由于采用了改进型智能温度传感器DS18B20作为检测元件,与传统的温度计相比,本数字温度计减少了外部的硬件电路,具有低成本和易使用的特点。
DS18B20温度计还可以在高温报警、远距离多点测温控制等方面进行应用开发,具有很好的发展前景。
此外,还介绍了系统的调试和性能分析。
关键词:显示电路,单片机,AT89C52,温度传感器,DS18B20 ,单总线目录1前言 (1)2设计任务及方案分析 (2)2.1设计任务及要求 (2)2.2 设计总体方案及方案论证 (2)2.3芯片选择 (2)2.4测温和显示流程图 (3)3芯片功能简介 (3)3.1AT89C52芯片简介 (3)3.1.1引脚功能说明 (4)3.2 DS18B20的功能简介 (5)3.2.1 芯片简介 (5)3.2.2 DS18B20外形和内部结构 (6)3.2.3 DS18B20的工作时序 (9)3.2.4 DS18B20与单片机的典型接口设计 (10)3.2.5 DS18B20的用到的ROM命令 (11)3.3 LCD1602的功能简介 (11)3.3.1 芯片引脚介绍 (11)3.3.2 LCD1602指令说明及时序 (13)3.3.3 LCD1602的RAM地址映射和标准字库表 (16)3.3.4 LCD1602的一般初始化过程 (18)4系统硬件电路的设计 (18)5结论 (20)6参考文献 (20)1前言测量温度的关键是温度传感器,温度传感器正从模拟式向数字式、从集成化向智能化、网络化的方向发展。
DS18B20数字温度计(原创)单片机DIY 2008-01-12 19:39:27 阅读2659 评论0 字号:大中小订阅1.原理图:2.实物图:3.汇编程序:;******************************************** 汇编*********************************************************************** **;*MCU: AT892051 *;*MCU-crystal: 12M *;*Version: 01 *;*Last Updata: 2007-5-27 *;*Author: zhaojun *;*Description: *;DS18B20的读写程序,数据脚P3.4 *;温度传感器18B20汇编程序, 采用器件默认的12位转化 *;最大转化时间750微秒,显示温度-55到+125度,显示精度 *;为0.1度,显示采用4位LED共阳显示测温值*;*************************************************;单片机内存分配申明!;*************************************************TEMPER_L EQU 40H ;用于保存读出温度的低8位TEMPER_H EQU 41H ;用于保存读出温度的高8位FLAG1 EQU 38H ;是否检测到DS18B20标志位SEC EQU 20H ;数码管个位数存放内存位置MIN EQU 21H ;数码管十位数存放内存位置TEMPL EQU 30H ;用于保存读出温度的低8位TEMPH EQU 31H ;用于保存读出温度的高8位TEMPHC EQU 32H ;温度转换寄存器低8位TEMPLC EQU 33H ;温度转换寄存器高8位BUF1 EQU 34H ;显示缓冲寄存器小数位BUF2 EQU 35H ;显示缓冲寄存器个数位BUF3 EQU 36H ;显示缓冲寄存器十数位BUF4 EQU 37H ;显示缓冲寄存器百数位TEMPDIN BIT P3.4 ;数据脚定义DIN BIT P1.7 ;小数点控制;**********************************************ORG 0000H ;主程序入口地址AJMP MAIN ;转主程序ORG 0003H ;外中断0中断入口DB 00H,00H,00H,00H,00H,00H,00H;RETI ;跳至INTEX0执行中断服务程序ORG 000BH ;定时器T0中断入口地址DB 00H,00H,00H,00H,00H,00H,00H ;RETI ;跳至定时器T0执行中断服务程序ORG 0013H ;外中断1中断入口DB 00H,00H,00H,00H,00H,00H,00H ;RETI ;跳至INTEX1执行中断服务程序ORG 001BH ;定时器T1中断入口地址DB 00H,00H,00H,00H,00H,00H,00H ;RETI ;中断返回(不开中断)ORG 0023H ;串行口中断入口地址DB 00H,00H,00H,00H,00H,00H,00H ;RETI ;中断返回(不开中断);**********************************************;两位数码管来显示温度,显示范围00到99度,显示精度为1度;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度;无需乘于0.0625系数;**********************************************MAIN:MOV SP, #50H ;MOV P1, #0FFH ;LPTEMP:LCALL GET_TEMPER ;调用读温度子程序LCALL CONVTEMP ;温度BCD码计算处理子程序LCALL DISPBCD ;显示区BCD码温度值刷新子程序;*************************************LCALL DISPLAY ;调用数码管显示子程序;*************************************;CPL P3.0 ;AJMP LPTEMP ;;*************************************; 这是DS18B20复位初始化子程序;*************************************INIT_1820:SETB TEMPDINNOPCLR TEMPDIN ;主机发出延时537微秒的复位低脉冲MOV R1,#3TSR1: MOV R0,#107DJNZ R0,$DJNZ R1,TSR1SETB TEMPDIN ;然后拉高数据线NOPNOPNOPMOV R0,#25HTSR2:JNB TEMPDIN,TSR3 ;等待DS18B20回应DJNZ R0,TSR2LJMP TSR4 ;延时TSR3:SETB FLAG1 ;置标志位,表示DS1820存在;CLR P3.7 ;检查到DS18B20就点亮P3.7LEDLJMP TSR5TSR4:CLR FLAG1 ;清标志位,表示DS1820不存在;CLR P3.1TSR5: MOV R0,#117TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间TSR7: SETB TEMPDIN ;RET;****************************************; 读出转换后的温度值;****************************************GET_TEMPER:SETB TEMPDIN ;LCALL INIT_1820 ;先复位DS18B20JB FLAG1,TSS2RET ;判断DS1820是否存在?若DS18B20不存在则返回TSS2:;CLR P3.3 ;DS18B20已经被检测到!!MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#44H ;发出温度转换命令LCALL WRITE_1820;*****************************************;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒;*****************************************LCALL DISPLAY;*****************************************LCALL INIT_1820 ;准备读温度前先复位MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ;发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;将读出的温度数据保存到35H/36HRET;*******************************************;写DS18B20的子程序(有具体的时序要求);*******************************************WRITE_1820:MOV R2,#8 ;一共8位数据CLR C ;WR1:CLR TEMPDIN ;MOV R3,#6DJNZ R3,$RRC AMOV TEMPDIN,C ;MOV R3,#23SETB TEMPDIN ;NOPDJNZ R2,WR1 ;SETB TEMPDIN ;RET;*************************************;处理温度BCD码子程序;************************************* CONVTEMP: MOV A,TEMPH ;ANL A,#80H ;JZ TEMPC1 ; 判断温度是否在零下?CLR C ; 温度值补码变成原码MOV A,TEMPL ;CPL AADD A,#01H ;MOV TEMPL,A ;MOV A, TEMPH ; -CPL A ;ADDC A,#00H ;MOV TEMPH,A ; TEMPHC HI=符号位MOV TEMPHC,#0BH ; 置"-"标志SJMP TEMPC11 ;TEMPC1: MOV TEMPHC,#0AH ; 置"+"标志;**************************************TEMPC11: MOV A,TEMPHC ; 计算小数位温度BCD值SWAP AMOV TEMPHC,A ;MOV A,TEMPL ;ANL A,#0FH ; 乘0.0625MOV DPTR,#TEMPDOTTAB ;MOVC A,@A+DPTR ;MOV TEMPLC,A ; TEMPLC LOW= 小数部分BCD ;**************************************MOV A,TEMPL ; 计算整数位温度BCD值ANL A,#0F0H ;SWAP A ;MOV TEMPL,A ;MOV A,TEMPH ;ANL A,#0FH ;SWAP A ;ORL A,TEMPL ;MOV TEMPER_L ,A ;LCALL HEX2BCD1 ; 调用单字节十六进制转BCD子程序;************************************MOV TEMPL,A ;ANL A,#0F0H ;SWAP A ;ORL A,TEMPHC ; TEMPHC LOW = 十位数BCDMOV TEMPHC,A ;MOV A,TEMPL ;ANL A,#0FH ;SWAP A ; TEMPLC HI = 个位数BCDORL A,TEMPLC ;MOV TEMPLC,A ;MOV A,R7 ;JZ TEMPOUT ;ANL A,#0FH ;SWAP A ;MOV R7,A ;MOV A,TEMPHC ; TEMPHC HI = 百位数BCDANL A,#0FH ;ORL A,R7 ;MOV TEMPHC,A ;TEMPOUT: RET ;;**************************************;小数部分分码表;************************************** TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H DB 06H,07H,08H,08H,09H,09H ;;**************************************;显示区BCD 码温度值刷新子程序;**************************************DISPBCD: MOV A,TEMPLC ; 温度数据移入显示寄存器ANL A,#0FH ;MOV BUF1,A ; 显示小数MOV A,TEMPLC ;SWAP A ;ANL A,#0FH ;MOV BUF2,A ; 显示个位MOV A,TEMPHC ;ANL A,#0FH ;MOV BUF3,A ; 显示十位MOV A,TEMPHC ;SWAP A ;ANL A,#0FH ;MOV BUF4,A ; 显示百位MOV A,TEMPHC ;ANL A,#0F0H ;CJNE A,#10H,DISPBCD0 ; 百位数=0?SJMP DISPOUT ;DISPBCD0:MOV A, TEMPHC ;ANL A, #0FH ;JNZ DISPOUT ; 十位数是0?MOV A,TEMPHC ;SWAP A ;ANL A,#0FH ;MOV BUF4,0AH ; 符号位不显示MOV BUF3,A ; 十位数显示符号DISPOUT: RET ;;*************************************;单字节十六进制转BCD;*************************************HEX2BCD1:MOV B,#64H ; 十六进制->BCD DIV AB ; B=A%100MOV R7,A ; R7=百位数MOV A,#0AH ;XCH A,B ;DIV AB ; B=A%BSWAP A ;ORL A,B ;RET ;;*************************************; Calculate CRC-8 Values, Uses The;CCITT-8 Polynomial,Expressed As; X^8+X^5+X^4+1;*************************************CRC8CAL: PUSH ACC ;MOV R7,#08H ; Number Bits Byte CRC8LOOP1:XRL A,B ; Calculate CRCRRC A ; Move T0 CarryMOV A,B ; Get The Last CRC ValueJNC CRC8LOOP2 ; Skip If Data==0XRL A,#18H ; Update The CRC Value CRC8LOOP2:RRC A ; Position The New CRCMOV B,A ; Store The New CRCPOP ACC ; Get The Remaining BitsRR A ; Possition The Next BitPUSH ACC ; Save The Remaining BitsDJNZ R7,CRC8LOOP1 ; Repeat For 9 BitsPOP ACC ;RET ;;******************************************;读DS18B20的程序,从DS18B20中读出9个字节数据;开始的两个字节为温度数据;******************************************READ_18200:MOV R4,#9 ; 将温度高位和低位从DS18B20中读出MOV R1,#TEMPER_L ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H) MOV B, #00H ;;************************************RE00:MOV R2,#8 ; 数据一共有8位RE01:CLR CSETB TEMPDIN ;NOPNOPCLR TEMPDIN ;NOPNOPNOPSETB TEMPDIN ;MOV R3,#9RE10:DJNZ R3,RE10 ;MOV C,TEMPDIN ;MOV R3,#23RE20:DJNZ R3,RE20 ;RRC ADJNZ R2,RE01 ;;************************************MOV @R1,A ;INC R1 ;LCALL CRC8CAL ;DJNZ R4,RE00 ;MOV A,B ;JNZ READ_OUT ;MOV TEMPL,TEMPER_L ;MOV TEMPH,TEMPER_H ;READ_OUT: RET;*****************************************;显示子程序;***************************************** DISPLAY:MOV DPTR,#NUMTAB ; 指定查表启始地址MOV R0,#4DP11: MOV R1,#250 ; 显示1000次DPLP: SETB P1.7MOV A,BUF1 ; 取小位数MOVC A,@A+DPTR ; 查小位数的7段代码MOV P1,A ; 送出小位的7段代码CLR P3.0 ; 开小位显示ACALL DL1ms ; 显示1msSETB P3.0 ;MOV A,BUF2 ; 取个位数MOVC A,@A+DPTR ; 查个位数的7段代码MOV P1,A ; 送出个位的7段代码CLR P1.7CLR P3.1 ; 开个位显示ACALL DL1ms ; 显示1msSETB P3.1 ;SETB P1.7MOV A,BUF3 ; 取十位数MOVC A,@A+DPTR ; 查十位数的7段代码MOV P1,A ; 送出十位的7段代码CLR P3.2 ; 开十位显示ACALL DL1ms ; 显示1msSETB P3.2 ;SETB P1.7MOV A,BUF4 ; 取百位数MOVC A,@A+DPTR ; 查百位数的7段代码MOV P1,A ; 送出百位的7段代码CLR P3.3 ; 开百位显示ACALL DL1ms ; 显示1msSETB P3.3 ;DJNZ R1,DPLP ; 250次没完循环DJNZ R0,DP11 ; 4个100次没完循环RET;****************************************;0.2MS延时(按12MHZ算);****************************************DL1MS: MOV R7,#100DJNZ R7,$RET;****************************************;7段数码管0~9数字的共阳显示代码;****************************************NUMTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;; "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-";****************************************END=============================== 汇编结束===============================================4.C51程序://********************************************* C程序 *************************************************************************** **////*MCU: AT892051 ////*MCU-crystal: 12M ////*Version: 01 ////*Last Updata: 2007-6-9 ////*Author: zhaojun ////*Description: ////DS18B20的读写程序,数据脚P3.4 ////温度传感器18B20汇编程序,采用器件默认的12位转化////最大转化时间750微秒,显示温度-55到+125度,显示精度////为0.1度,显示采用4位LED共阳显示测温值////P1口为段码输入,P0~P3为位选////***************WAVE-E6000/T**********************//#include "reg52.h"#define uchar unsigned char#define uint unsigned int#define Disdata P1 // 段码入口sbit DQ=P3^4; // 温度输入口uint temp; // variable of temperature 定义一个变量uchar flag1; // 定义一个标志,标志温度是负还是正,1为负,0为正sbit DIN=P1^7; // 小数点控制#define discan P3 //扫描口uchar h; // 定义变量//位选位定义sbit DEC=P3^0; // 小数sbit POS=P3^1; // 个位sbit TEN=P3^2; // 十位sbit HUN=P3^3; // 百位,符号位unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳数码管段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "灭" "-"unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的编码//共阳数码管带小数点段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9"uchar data temp_data[2]={0x00,0x00};//读出温度暂放uchar data Dis_play[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09 };//小数部分对应十进制"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F"uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //列扫描控制字/***************************************//* 延时子程序*//***************************************/void delay(uint i) //delay{while(i--);}/************************************************//* 初始化ds18b2子函数* *//************************************************/Init_DS18B20(void){uchar x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);}/*************************************************//* 读字节子函数*//*************************************************/ReadOneChar(void){uchar i = 0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1; // 数据右移一位DQ = 1; // 给脉冲信号if(DQ) // DQ为1dat|=0x80; // 读出数据delay(4); // 延时}return(dat);}/*************************************************/ /* 写字节子函数*//*************************************************/ WriteOneChar(unsigned char dat){uchar i = 0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01; //写入一位数据delay(5);DQ = 1;dat>>=1; //右移一位数据}}/*************************************************/ /* DS18B20写命令函数*//*************************************************/ /*void tmpwritebyte(uchar dat) // write a byte to ds18b20 { // 给温度传感器写一个字节uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //写入1{DQ=0;i++;i++;DQ=1;i=8;while(i>0)i--; // 适当延时}else //写入0{DQ=0;i=8;while(i>0)i--; // 适当延时DQ=1;i++;i++;}}}*//******************************************//* 发送温度转换命令*//******************************************/void tmpchange(void) // DS18B20 begin change{Init_DS18B20(); // 初始化DS18B20delay(200); // 延时WriteOneChar(0xcc); // 跳过序列号命令WriteOneChar(0x44); // 发送温度转换命令}/******************************************//* 读出温度函数*//******************************************/uint tmp() //get the temperature{// float tt;Init_DS18B20(); // 初始化ds18b2子函数delay(1);WriteOneChar(0xcc); // 跳过ROM命令WriteOneChar(0xbe); // 发送读取数据命令temp_data[0]=ReadOneChar(); // 连续读两个字节数据temp_data[1]=ReadOneChar();temp=temp_data[1];temp<<=8;temp=temp|temp_data[0]; // 两字节合成一个整型变量。
DS18B20分辨率可编程单总线数字温度计特点⏹唯一的单线接口仅需要一个端口引脚来通信⏹多点能力简化了分布式温度传感系统的应用⏹不需要外围模块⏹可以由数据线供电,供电范围是3.0V-5.5V⏹不需备用电源⏹温度测量范围-55℃到+125℃。
华氏相当是-67℉到+257℉⏹在-10℃-+85℃范围内精度为±0.5℃⏹温度计分辨率9到12位可编程⏹把温度转换为12位二进制数的时间是750ms(最大值)⏹用户自定义的,非易失性温度报警设置⏹报警搜索命令可以识别和定位温度超出编程范围的器件(温度报警情况下)⏹应用范围包括恒温控制,工业系统,消费产品,温度计,或任何热敏感系统描述该DS18B20数字温度计提供9至12位(可配置)的温度读数,显示器件当前的温度。
信息送入或者送出DS18B20都是通过一根线完成,所以微处理器和DS18B20之间仅需要一根线相连。
数据的读写以及进行温度转换所需要的电源可以由数据线提供,而不需要外部电源。
由于每个DS18B20都有一个唯一的硅序号,在同一根单总线上可以挂接多个DS18B20。
这样可以把温度传感器放置在许多不同的地方。
这个特性非常有用,经常应用在空调环境控制、检测建筑物内部温度、设备或机械领域以及过程监测和控制。
表1. 详细的引脚描述DS18B20Z(8-pin SOIC):所有表中没有提到的引脚都是不需要连接的概览图1中的模块图给出了DS18B20的主要部件。
DS18B20有四个主要的数据模块。
1)64位光刻ROM,,2)温度传感器,3)非易失性温度报警触发器TH和TL,4)一个配置寄存器。
当信号线上是高电平时,器件通过往内部电容充电来获得能量,当信号线是低电平时就可以继续工作直到信号线再次回到高电平把寄生电源充满。
还有一种方式,DS18B20也可以由外部3V—5.5V的电源供电。
与DS18B20通信是通过一个单线端口进行的。
在ROM的功能协议建立之前,通过这个单线端口存储和控制功能是不可用的。
一、总体方案的设计与选择1.1 数字温度计的设计标准与要求1、设计温度测量电路;2、测量范围为-40℃~60℃;3、要求精度为0.01℃4、制作并调试所设计电路;5、掌握数字电路的设计及调试方法;1.2 系统基本方案根据系统要求,本次设计可分为三个模块,分别为以DS18B20为传感器的温度检测模块,以AT89S51的转换模块和以液晶显示的显示模块。
具体框图如图:1.3 方案的讨论与选择方案一:采用二极管做温度传感器晶体二极管或三极管的PN 结的结电压是随温度而变化的。
例如硅管的PN 结的结电压在温度每升高1℃时,下降-2mV ,利用这种特性,一般可以直接采用二极管(如玻璃封装的开关二极管1N4148)或采用硅三极管(可将集电极和基极短接)接成二极管来做PN 结温度传感器。
这种传感器有较好的线性,尺寸小,其热时间常数为0.2—2秒,灵敏度高。
测温范围为-50—+150℃。
典型的温度曲线如图1所示。
同型号的二极管或三极管特性不完全相同,因此它们的互换性较差。
方案二:用LM35做温度传感器LM35是一种得到广泛使用的温度传感器。
芯片从电源吸收的电流几乎是不变的(约50μA ),所以芯片自身几乎没有散热的问题。
这么小的电流也使得该芯片在某些应用中特别适合,比如在电池供电的场合中,输出可以由第三个引脚取出,根本无需校准。
在使用单一电源时,LM35的一个缺点是无法指示低至零度的温度。
据称利用LM35可测出20mV 的电压,这一值相当于2℃(一些情况下甚至可测出0~2mV 的电压!),但要指示零度或更低的温度时,还需一个负电源和一只下拉电阻。
而且精度不够。
方案三:用可编程器件DS18B20做温度传感器DS18B20数字温度计是DALLAS 公司生产的1-Wire ,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20产品的特点:(1)、只要求一个端口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55。
C 到+125。
C 之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
通过比较和对本次设计要求的的考虑,决定采用方案三用可编程器件DS18B20做温度传感器。
二、DS18B20的基本原理该产品采用美国DALLAS 公司生产的 DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
2.1 DS1624基本特性1、无需外围元件即可测量温度2、测量范围为-55℃~+125℃,精度为0.03125℃3、测量结果以9~12位数字量方式串行传送4、工作电源: 3~5V/DC2.2 DS18B20引脚定义:(1) DQ 为数字信号输入/输出端;(2) GND 为电源地;(3) VDD 为外接供电电源输入端(在寄生电源接线方式时接地)。
2.3.DS18B20内部结构图2.4工作原理DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms 。
DS18B20测温原理如图3所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即 为所测温度。
图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
2.5.DS18B20温度值格式表这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM 中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。
例如+125℃的数字输出为07D0H ,+25.0625℃的数字输出为0191H ,-25.0625℃的数字输出为FE6FH ,-55℃的数字输出为FC90H 。
2.6.DS18B20温度数据表三、LCD1602液晶显示器LCD1602是字符型LCD 通常有14 条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示:字符型LCD的引脚定:四、电路原理图五、设计体会对于单片机的程序编写用了很长的时间,查找了很多资料,特别是关于DS18B20的有关资料以及液晶显示的资料等各种材料。
我画出了初步的原理图,但是觉得不够理想,太麻烦,所以又查询了相关的资料,最终得到了改善后的原理图,相比较最初的图改善了很多,对于单片机的程序编写用了很长的时间,本次课设激发了我们的动手实践的热情,提高了我的分析和实践能力,也让我体会到了自己设计并制作的快乐,获益匪浅!六、程序#include<reg52.h>#include<intrins.h>unsigned char code digit[11]={"0123456789-"};unsigned char code Str[]={"081802 Y ong "};unsigned char code Error[]={"DS18B20 ERROR"};unsigned char code Error1[]={" PLEASE CHECK"};unsigned char code Temp[]={"wendu:"};unsigned char code Cent[]={"C"}; //温度单位unsigned char flag,tltemp; //负温度标志和临时暂存变量sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚void delay1ms(){unsigned char i,j;for(i=0;i<4;i++)for(j=0;j<33;j++);}void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0; //将E恢复低电平return result;}void WriteInstruction (unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,// 就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P0=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteAddress(unsigned char x){WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"}void WriteData(unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,// 就是让E从0到1发生正跳变,所以应先置"0"P0=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}void LcdInitiate(void){delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x38);delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x38); //连续三次,确保初始化成功delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x06); //显示模式设置:光标右移,字符不移delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除delaynms(5); //延时5ms,给硬件一点反应时间}sbit DQ=P3^3;unsigned char time; //设置全局变量,专门用于严格延时bit Init_DS18B20(void){bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在DQ = 1; //先将数据线拉高for(time=0;time<2;time++) //略微延时约6微秒;DQ = 0; //再将数据线从高拉低,要求保持480~960usfor(time=0;time<200;time++) //略微延时约600微秒; //以向DS18B20发出一持续480~960us的低电平复位脉冲DQ = 1; //释放数据线(将数据线拉高)for(time=0;time<10;time++); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕;return (flag); //返回检测成功标志}unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat; //储存读出的一个字节数据for (i=0;i<8;i++){DQ =1; // 先将数据线拉高_nop_(); //等待一个机器周期DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序_nop_(); //等待一个机器周期DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备for(time=0;time<2;time++); //延时约6us,使主机在15us内采样dat>>=1;if(DQ==1)dat|=0x80; //如果读到的数据是1,则将1存入datelsedat|=0x00;//如果读到的数据是0,则将0存入dat//将单片机检测到的电平信号DQ存入r[i]for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期}return(dat); //返回读出的十六进制数据}WriteOneChar(unsigned char dat){unsigned char i=0;for (i=0; i<8; i++){DQ =1; // 先将数据线拉高_nop_(); //等待一个机器周期DQ=0; //将数据线从高拉低时即启动写时序DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样DQ=1; //释放数据线for(time=0;time<1;time++);//延时3us,两个写时序间至少需要1us的恢复期dat>>=1; //将dat中的各二进制位数据右移1位}for(time=0;time<4;time++); //稍作延时,给硬件一点反应时间}void ReadyReadTemp(void){Init_DS18B20(); //将DS18B20初始化WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delaynms(200); //转换一次需要延时一段时间Init_DS18B20(); //将DS18B20初始化WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位}void display_error(void){unsigned char i;WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示i = 0; //从第一个字符开始显示while(Error[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Error[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //延时100ms较长时间,以看清关于显示的说明}WriteAddress(0x40); //写显示地址,将在第1行第1列开始显示i = 0; //从第一个字符开始显示while(Error1[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Error1[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //延时100ms较长时间,以看清关于显示的说明}while(1) //进入死循环,等待查明原因;}void display_explain(void){unsigned char i;WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示i = 0; //从第一个字符开始显示while(Str[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Str[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //延时100ms较长时间,以看清关于显示的说明}}void display_symbol(void){unsigned char i;WriteAddress(0x40); //写显示地址,将在第2行第1列开始显示i = 0; //从第一个字符开始显示while(Temp[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Temp[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(50); //延时1ms给硬件一点反应时间}}void display_dot(void){WriteAddress(0x49); //写显示地址,将在第2行第10列开始显示WriteData('.'); //将小数点的字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反应时间}void display_cent(void){unsigned char i;WriteAddress(0x4c); //写显示地址,将在第2行第13列开始显示i = 0; //从第一个字符开始显示while(Cent[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Cent[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(50); //延时1ms给硬件一点反应时间}}void display_temp1(unsigned char x){unsigned char j,k,l; //j,k,l分别储存温度的百位、十位和个位j=x/100; //取百位k=(x%100)/10; //取十位l=x%10; //取个位WriteAddress(0x46); //写显示地址,将在第2行第7列开始显示if(flag==1) //负温度时显示“—”{WriteData(digit[10]); //将百位数字的字符常量写入LCD}else{WriteData(digit[j]); //将十位数字的字符常量写入LCD}WriteData(digit[k]); //将十位数字的字符常量写入LCDWriteData(digit[l]); //将个位数字的字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反应时间}void display_temp2(unsigned char x){unsigned char a,b,c;a=x;b=x*100%10;WriteAddress(0x4a); //写显示地址,将在第2行第11列开始显示WriteData(digit[a]);WriteData(digit[b]); //将小数部分的第一位数字字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间}void main(void){unsigned char TL; //储存暂存器的温度低位unsigned char TH; //储存暂存器的温度高位unsigned char TN; //储存温度的整数部分unsigned char TD; //储存温度的小数部分LcdInitiate(); //将液晶初始化delaynms(5); //延时5ms给硬件一点反应时间if(Init_DS18B20()==1)display_error();display_explain();display_symbol(); //显示温度说明display_dot(); //显示温度的小数点display_cent(); //显示温度的单位while(1) //不断检测并显示温度{ flag=0;ReadyReadTemp(); //读温度准备TL=ReadOneChar(); //先读的是温度值低位TH=ReadOneChar(); //接着读的是温度值高位if((TH&0xf8)!=0x00)//判断高五位得到温度正负标志{flag=1;TL=~TL; //取反TH=~TH; //取反tltemp=TL+1; //低位加1TL=tltemp;if(tltemp>255) TH++; //如果低8位大于255,向高8位进1TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16//这样得出的是温度的整数部分,小数部分被丢弃了TD=(TL%16)*100/16; //计算温度的小数部分,将余数乘以10再除以16取整,}TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16//这样得出的是温度的整数部分,小数部分被丢弃了TD=(TL%16)*100/16; //计算温度的小数部分,将余数乘以10再除以16取整,//这样得到的是温度小数部分的第一位数字(保留1位小数)display_temp1(TN); //显示温度的整数部分display_temp2(TD); //显示温度的小数部分delaynms(10);}}。