DS18B20温度读取及显示讲解学习

合集下载

第31课温度传感器DS18B20详解

第31课温度传感器DS18B20详解

实验现象
通过对DS18B20的控制,读取出DS18B20所采集的温度数据并在 数码管的第4、5、6、7位进行显示,温度精确到小数点后一位。
显示方式为:020.5(温度为正)或-10.4(温度为负)。
DS18B20的命令
ROM操作命令
(1)读ROM--33H (2)匹配ROM--55H (3)跳过ROM--CC
功能命令
(1)写暂存寄存器命令--4EH (2)读暂存寄存器指令--BEH (3)复制暂存寄存器命令—48H (4)启动温度转换命令—44H (5)回传EEPROM内容指令--B8H (6)读电源类型指令--B4H
如何用DS18B20来采集温度
访问一个DS18B20必须经过初始化、ROM命令和功能命令这三个步骤 。 单个DS18B20发命令顺序 第一步: DS18B20初始化----跳过ROM命令(CCH)----启动温度转换命令(44H) 第二步: DS18B20初始化----跳过ROM命令(CCH)----读暂存寄存器指令(BEH)
DS18B20简介
DS18B20是DALLS公司推出的“1-WIRE”接口的 数字温度传感器,可以直接将温度转换为9~12位串行 数字信号供单片机处理。它具有体积小、功耗低、精度 高、抗干扰能力强等优点。
DS18B20引脚和封装
DS18B20的内部结构
DS18B20当分辨率为9,10,11,和12位时,分别对应与0.5℃, 0.25℃,0.125℃,0.0625℃的温度增量
DS18B20写数据时序图分析
①首先给DQ赋值低电平。 ②延时确定时间15us。 ③对DQ赋值,向DS18B20写入相应的高低 电平。 ④再延时时间为45us。 ⑤最后给DQ置高电平。
DS18B20读数据时序分析

(完整版)读取DS18B20温度传感器的64位ID号方法及程序

(完整版)读取DS18B20温度传感器的64位ID号方法及程序

#include <reg52.h>#define uchar unsigned char#define uint unsigned int/********************************************************************/ sbit DQ = P2^2; //温度传感器信号线sbit rs = P3^5; //LCD数据/命令选择端(H/L)位声明sbit lcden = P3^4; //LCD使能信号端位声明/********************************************************************/ //uint temp; //定义整型的温度数据//float f_temp; //定义浮点型的温度数据//uint warn_11 = 270; //定义温度设定值,是温度值乘以10后的结果//uint warn_12 = 250; //定义温度下限值//uint warn_h1 = 300; //定义温度上限值/********************************************************************/ void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数 *//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数 *//***************************************************/void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 */ /***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数 *//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数 */ /***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数 *//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{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{DQ = 0; //写0i = 8;while(i>0)i--;DQ = 1;i++;i++;}}}/***********************************************//* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令 *//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P0 = com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据 *//***********************************************/void LCD_WriteData(uchar dat){rs = 1; //选择LCD为写入数据状态lcden = 0;P0 = dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() */ /* 功能:初始化LCD,设定LCD的初始状态 *//***********************************************/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* */ /* 显示18B20序列号 *//* *//**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30); //取ASCII码elseLCD_WriteData(h+0x37); //取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); //取ASCII码elseLCD_WriteData(l+0x37); //取ASCII码}。

读取DS18B20温度,通过LCD1602显示出来,并输出控制

读取DS18B20温度,通过LCD1602显示出来,并输出控制

读取DS18B20温度,通过LCD1602显示出来,并输出控制电路原理图程序1.main.c#include #include"lcd.h"#include"temp.h" void LcdDisplay(int); sbit K1=P2^0;sbit K2=P2^1;sbit K3=P2^2;sbit K4=P2^3; extern int th=20; extern int tl=-10; sbit beep=P1^0;void main(){LcdInit(); LcdWriteCom(0xc7); LcdWriteData('C'); while(1){if(K1==0){Delay1ms(500);if(K1==0);th++;}if(K2==0){Delay1ms(500);if(K2==0);th--;}if(K3==0){Delay1ms(500);if(K3==0);tl++;}if(K4==0){Delay1ms(500);if(K4==0);tl--;}LcdDisplay(Ds18b20ReadTemp());}}void LcdDisplay(int temp){int i,tt,rr,mm;unsigned char datas[] = {0, 0, 0, 0},datas1[] = {0, 0, 0},datas2[] = {0, 0, 0};float tp;if(temp< 0){LcdWriteCom(0xc0);LcdWriteData('-');i=1;temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*10+0.5;mm=-temp;}else{LcdWriteCom(0xc0);LcdWriteData('+');tp=temp;temp=tp*0.0625*10+0.5;mm=temp;}datas[0] = temp / 1000; datas[1] = temp % 1000 / 100; datas[2] = temp % 100 / 10; datas[3] = temp% 10;if(th < 0){LcdWriteCom(0x89);LcdWriteData('-');tt=-th;}else{LcdWriteCom(0x89);LcdWriteData('+');tt=th;}datas1[0] = tt / 100;datas1[1] = tt% 100 / 10; datas1[2] = tt % 10; LcdWriteCom(0x87); LcdWriteData('H'); LcdWriteCom(0x88); LcdWriteData(':'); LcdWriteCom(0x8a); LcdWriteData('0'+datas1[0]); LcdWriteCom(0x8b); LcdWriteData('0'+datas1[1]); LcdWriteCom(0x8c); LcdWriteData('0'+datas1[2]);if(tl < 0){LcdWriteCom(0x90);LcdWriteData('-');rr=-tl;}else{LcdWriteCom(0x90);LcdWriteData('+');rr=tl;}datas2[0] = rr / 100;datas2[1] = rr% 100 / 10; datas2[2] = rr % 10; LcdWriteCom(0x8e); LcdWriteData('L'); LcdWriteCom(0x8f); LcdWriteData(':'); LcdWriteCom(0x91); LcdWriteData('0'+datas2[0]); LcdWriteCom(0x92);LcdWriteData('0'+datas2[1]); LcdWriteCom(0x93); LcdWriteData('0'+datas2[2]);if(mm>=(th*10)||mm<=(tl*10)||th<=tl) beep=0;elsebeep=1;LcdWriteCom(0x80); LcdWriteData('T');LcdWriteCom(0x81); LcdWriteData('A');LcdWriteCom(0x82); LcdWriteData('I');LcdWriteData(' ');LcdWriteCom(0x84); LcdWriteData('A');LcdWriteCom(0x85); LcdWriteData('N');LcdWriteCom(0xc1); LcdWriteData('0'+datas[0]); LcdWriteCom(0xc2); LcdWriteData('0'+datas[1]);LcdWriteCom(0xc3);LcdWriteData('0'+datas[2]);LcdWriteCom(0xc4);LcdWriteData('.');LcdWriteCom(0xc5);LcdWriteData('0'+datas[3]);LcdWriteCom(0xc6);LcdWriteData('"');}2.lcd.h#ifndef __LCD_H_/********************************** 当使用的是4位数据传输的时候定义,使用8位取消这个定义**********************************/ #define LCD1602_4PINS /********************************** 包含头文件#include//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif/********************************** PIN口定义**********************************/ #define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;/********************************** 函数声明/*在51单片机12MHZ时钟下的延时函数*/ void Lcd1602_Delay1ms(uint c); //误差0us /*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat) ;/*LCD1602初始化子程序*/void LcdInit();#endif3.temp.h#define __TEMP_H_#includesbit DSPORT=P3^7;void Delay1ms(unsigned int );unsigned char Ds18b20Init();void Ds18b20WriteByte(unsigned char com); unsigned char Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadT emp();#endif4.lcd.c#include"lcd.h"void Lcd1602_Delay1ms(uint c) //延时{uchar a,b;for (; c>0; c--){for (b=19;b>0;b--){for(a=1;a>0;a--);}}}#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) //写入一个字节命令{LCD1602_E = 0;LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;}#elsevoid LcdWriteCom(uchar com){LCD1602_E = 0;LCD1602_RW = 0;LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = com << 4; //发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;}#endif#ifndef LCD1602_4PINSvoid LcdWriteData(uchar dat) //写入一个字节数据{LCD1602_E = 0;LCD1602_RS = 1;LCD1602_DATAPINS = dat;Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;}#elsevoid LcdWriteData(uchar dat){LCD1602_E = 0;LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4; //写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;}#endif#ifndef LCD1602_4PINSvoid LcdInit() //LCD初始化子程序{LcdWriteCom(0x38);LcdWriteCom(0x0c);LcdWriteCom(0x06);LcdWriteCom(0x01);LcdWriteCom(0x80);}#elsevoid LcdInit(){LcdWriteCom(0x32); LcdWriteCom(0x28); LcdWriteCom(0x0c); LcdWriteCom(0x06); LcdWriteCom(0x01); LcdWriteCom(0x80);}#endif5.temp.c#include"temp.h"void Delay1ms(unsigned int y) //延时{ unsigned int x;for(y;y>0;y--)for(x=110;x>0;x--);}unsigned char Ds18b20Init() //初始化{ unsigned int i;DSPORT=0;i=70;while(i--);DSPORT=1;i=0;while(DSPORT){i++;if(i>5000)return 0;//失败}return 1;//成功}void Ds18b20WriteByte(unsigned char dat) //写字节{unsigned int i,j;for(j=0;j<8;j++){DSPORT=0; //每写入一位数据之前先把总线拉低1us (数据手册上模糊)i++;DSPORT=dat&0x01;i=6;while(i--);DSPORT=1;dat>>=1;}}unsigned char Ds18b20ReadByte(){unsigned char byte,bi;unsigned int i,j;for(j=8;j>0;j--){DSPORT=0;i++;DSPORT=1;i++;i++;bi=DSPORT;byte=(byte>>1)|(bi<<7);i=4;while(i--);}return byte;}void Ds18b20ChangTemp() //温度转换{Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0x44);}void Ds18b20ReadTempCom() //读取温度命令{ Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0xbe);}int Ds18b20ReadT emp() //读取温度{int temp=0;unsigned char tmh,tml;Ds18b20ChangT emp();Ds18b20ReadTempCom();tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();temp=tmh;temp<<=8;temp|=tml;。

DS18B20的工作原理

DS18B20的工作原理

DS18B20的工作原理DS18B20是一种数字温度传感器,具有高精度和数字输出的特点。

它采用一线通信协议,可以直接与微控制器通信,广泛应用于温度监测领域。

本文将详细介绍DS18B20的工作原理。

一、温度测量原理1.1 DS18B20采用数字式温度传感器芯片,内部集成了温度传感器和ADC转换器,能够直接输出数字信号。

1.2 DS18B20的温度传感器采用特殊的材料,随温度的变化而改变其电阻值,通过ADC转换器将电阻值转换为数字信号。

1.3 DS18B20的数字输出信号经过微处理器处理后,可以直接显示温度数值或者通过串口通信传输到其他设备。

二、通信协议2.1 DS18B20采用一线通信协议,只需一根数据线即可与微控制器通信,简化了连接方式。

2.2 通信协议中包括初始化、发送命令、读取数据等步骤,确保数据的准确传输。

2.3 通过一线通信协议,DS18B20可以实现多个传感器的串联连接,方便实现多点温度监测。

三、精度和分辨率3.1 DS18B20具有高精度的温度测量能力,温度测量误差仅为±0.5℃。

3.2 DS18B20的分辨率可调节,最高可达12位,能够满足不同应用场景的需求。

3.3 高精度和可调节的分辨率使得DS18B20在工业控制、医疗设备等领域得到广泛应用。

四、工作电压和功耗4.1 DS18B20的工作电压范围广泛,可在3V至5.5V之间工作,适用于不同的电源供应环境。

4.2 DS18B20的功耗较低,工作电流仅为1mA左右,可以节省能源。

4.3 低功耗和广泛的工作电压范围使得DS18B20适用于电池供电或者低功耗设备。

五、应用领域5.1 DS18B20广泛应用于温度监测系统、气象站、医疗设备等领域。

5.2 DS18B20的高精度和数字输出特点使得其在工业控制、实验室研究等领域得到广泛应用。

5.3 DS18B20的一线通信协议和低功耗特点使得其在移动设备、智能家居等领域具有广阔的应用前景。

DS18B20的使用法解析

DS18B20的使用法解析


DS18B20共有三种形态的存储器资源:
1、ROM 只读存储器,用于存放DS18B20的ID编码,其前8 位是单线系列编码(DS18B20的是 28H),后面48位是芯 片唯一的序列号,最后8位是以上56位的CRC码(冗余校验)。 数据在出产时设置不由用户更改。DS18B20共64位ROM。
2、RAM 数据暂存器,用于内部计算和数据存取,数据在掉 电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、 2个字节是温度转换后的数据值(温度寄存器),第3、4个字 节是用户EEPROM(温度报警值TH、TL储存)的镜像。在上 电复位时其值将被刷新。第5个字节则是用户第3个EEPROM 的镜像(配置寄存器)。第6、7、8个字节为计数寄存器,是 为了让用户得到更高的温度分辨率而设计的,同样也是内部温 度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。 3、EEPROM 非易失性记忆体,用于存放长期需要保存的数 据,上下限温度报警值和校验数据,DS18B20共3位 EEPROM,并在RAM都存在镜像,以方便用户操作。
这是向RAM中写入数据的指令,随后写入的两 个字节的数据将会被存到地址2(报警RAM之TH) 和地址3(报警RAM之TL)。写入过程中可以用复 位信号中止写入。
Read Scratchpad (从RAM中读数据)[BEH]
此指令从RAM中读数据,读地址从地址0开始, 一直可以读到地址9,完成整个RAM数据的读出。芯 片允许在读过程中用复位信号中止读取,即可以不 读后面不需要的字节以减少读取时间。
Read Power Supply(工作方式切换)[B4H]
此指令发出后发出读时间隙,芯片会返回它的 电源状态字,“0”为寄生电源状态,“1”为外部 电源状态。

数字温度传感器DS18B20详解

数字温度传感器DS18B20详解

一、概述传统的温度检测大多以热敏电阻为传感器,采用热敏电阻,可满足40℃至90℃测量范围,但热敏电阻可靠性差,测量温度准确率低,对于小于1℃的温度信号是不适用的,还得经过专门的接口电路转换成数字信号才能由微处理器进行处理。

目前常用的微机与外设之间进行的数据通信的串行总线主要有I2C总线,SPI总线等。

其中I2C总线以同步串行2线方式进行通信(一条时钟线,一条数据线),SPI总线则以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线)。

这些总线至少需要两条或两条以上的信号线。

而单总线( 1-wire bus ),采用单根信号线,既可传输数据,而且数据传输是双向的,CPU 只需一根端口线就能与诸多单总线器件通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

因而,这种单总线技术具有线路简单,硬件开销少,成本低廉,软件设计简单,便于总线扩展和维护。

同时,基于单总线技术能较好地解决传统识别器普遍存在的携带不便,易损坏,易受腐馈,易受电磁干扰等不足,因此,单总线具有广阔的应用前景,是值得关注的一个发展领域。

单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。

主机或从机通过一个漏极开路或三态端口连至数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线。

单总线通常要求外接一个约为4.7K的上拉电阻,这样,当总线闲置时其状态为高电平。

DS18B20数字式温度传感器,与传统的热敏电阻有所不同的是,使用集成芯片,采用单总线技术,其能够有效的减小外界的干扰,提高测量的精度。

同时,它可以直接将被测温度转化成串行数字信号供微机处理,接口简单,使数据传输和处理简单化。

部分功能电路的集成,使总体硬件设计更简洁,能有效地降低成本,搭建电路和焊接电路时更快,调试也更方便简单化,这也就缩短了开发的周期。

DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点:( 1 )采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

DS18B20详细使用方法

DS18B20详细使用方法

DS18B20的详细使用方法1.DS18B20概述DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

2、DS18B20产品的特点〔1〕.只要求一个端口即可实现通信。

〔2〕.在DS18B20中的每个器件上都有独一无二的序列号。

〔3〕.实际应用中不需要外部任何元器件即可实现测温。

〔4〕.测量温度范围在-55。

C到+125。

C之间。

〔5〕.数字温度计的分辨率用户可以从9位到12位选择。

〔6〕.内部有温度上、下限告警设置。

3、DS18B20引脚图及引脚功能介绍TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。

〔底视图〕图1表1DS18B20详细引脚功能描述4.DS18B20的使用方法由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。

DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。

该协议定义了几种信号的时序:初始化时序、读时序、写时序。

所有时序都是将主机作为主设备,单总线器件作为从设备。

而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。

数据和命令的传输都是低位在先。

DS18B20的复位时序DS18B20的读时序对于DS18B20的读时序分为读0时序和读1时序两个过程。

对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。

DS18B20在完成一个读时序过程,至少需要60us才能完成。

DS18B20温度传感器使用简介

DS18B20温度传感器使用简介

DS18B20温度传感器使⽤简介DS18xx系列温度传感器是数字式温度传感器,相对于传统温度传感器精度⾼、稳定性好、电路简单、控制⽅便,在这⾥以DS18B20为例做简单应⽤介绍。

详细资料请参阅芯⽚⼿册。

⼀、特性:(1)应⽤中不需要外部任何元器件即可实现测温电路。

(2)测温范围-55~+125℃,最⼤精度0.0625℃。

(3)只通过⼀条数据线即可实现通信。

(4)每个DS1820器件上都有独⼀⽆⼆的序列号,所以⼀条数据线上可以挂接很多该传感器。

(5)内部有温度上、下限告警功能。

⼆、操作简介DS18B20⼯作时需要接收特定的指令来完成相应功能(指令,可以简单的理解为可以被识别并有相应意义的⼀系列⾼低电平信号),它的指令可分为ROM指令和RAM指令;ROM指令主要对其内部的ROM进⾏操作,如查所使⽤DS18B20的序列号等,如果只使⽤⼀个DS18B20,ROM操作⼀般就可以直接跳过了;RAM指令主要是完成对其内RAM中的数据进⾏操作,如让其开始进⾏数据采集、读数据等。

DS18B20数字温度传感器是单总线器件,数据的读写只通过⼀条数据线进⾏并且这⼀条线上允许挂很多该传感器;这样对器件进⾏读写指令时就会⿇烦⼀些,必须应⽤特定时序来识别⾼低电平信号(如写⾼电平1,并不是把数据线直接拉⾼,⽽是⽤有⼀定时序关系的⾼低电平来代表写1),所以指令表中的0、1在写给DS18B20时就得变成代表0、1电平的时序段序列。

同样,从DS18B20读数据时,也是由特定的时序来完成数据读取。

对DS18B20进⾏读写的时序图如下:硬件连接⽅式有两种,⼀种是由单独电源供电(3~5V);第⼆种是由数据线为DS18B20供电(⼯作速度相对较慢)。

单独电源供电⽅式数据线为DS1820供电⽅式三、DS1820的⼯作过程:1. 复位操作2. 执⾏ROM操作的5条指令之⼀:1)读ROM,2)匹配ROM,3)搜索ROM,4)跳过ROM,5)报警搜索。

ds18b20程序设计傻瓜式讲解

ds18b20程序设计傻瓜式讲解

ds18b20程序设计傻瓜式讲解
DS18B20 是一款数字温度传感器,可以直接读出被测温度,并采用 9 位数字量串行输出。

下面是一个简单的 DS18B20 程序设计讲解:
1. 初始化
在 DS18B20 通信过程中,首先需要初始化数据线,即将其置为高电平。

在初始化时,需要持续至少 480 微秒的高电平。

2. 跳过 ROM
在 DS18B20 中,每个传感器都有一个唯一的 ROM 序列号,可以通过跳过ROM 操作来避免对 ROM 进行操作。

具体操作是先发出一个低电平,然后持续至少 60 微秒的高电平。

3. 发送命令
在跳过 ROM 后,需要向传感器发送命令。

常用的命令有温度转换命令和读取温度命令。

温度转换命令是 0x44,读取温度命令是 0xBE。

4. 读取数据
在发送命令后,需要等待传感器响应。

传感器响应的标志是数据线上的低电平。

在低电平持续约 60-240 微秒后,数据线将变为高电平,此时可以开始读取数据。

每次读取一位数据后,需要将数据线置为低电平,等待传感器响应。

5. 数据解析
DS18B20 的数据由 9 位数字量组成,其中最高位是符号位。

如果最高位为0,则表示温度为正数;如果最高位为 1,则表示温度为负数。

其余 8 位为温度值,可以通过一定的计算公式将其转换为实际温度值。

以上就是 DS18B20 的程序设计流程。

需要注意的是,在实际应用中,还需要考虑数据传输的校验、错误处理等问题。

DS18B20应用篇详细解说

DS18B20应用篇详细解说

板外的第一个扩展——DS18B20温度测量(1)理论知识DS18B20数字温度测量传感器,网上介绍很多,我就不罗嗦了。

见图DS18B20与前产品DS1820的不同:DS18B20继承了DS1820的全部优点,并做了如下改进 1.供电范围扩大为3.0--5.5V。

2.温度分辨力可编程。

3.转换速率有很大提高.4.内部存储器映射关系发生变化。

5.具有电源反接保护电路。

5.体积减小一半。

对我们使用来说最大的不同就是DS18B20可以程序设定9~12位的分辨率数字值,而DS1820为固定的9位数字值,且温度转换时的延时时间由2s减为750ms。

电路的接法:DS18B20说明书上介绍了几种电路的接法,但我这里就说最常用的一种接法见图:先介绍一下DS18B20内部的结构:常规的内部逻辑图我就不说了,只说说跟我们使用直接相关的内容。

DS18B20的内部存储资源分为8个字节的ROM、9个字节的RAM、3个字节的EEPROM如下图:一、ROM:在DS18B20内部光刻了一个长度为64bit的ROM,这个编码是器件的身份识别标志。

如下图:64位光刻ROM的排列是:开始(最低)8位是产品类型标号,对于DS18B20来说就是(28H),接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。

光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

二、RAM:高速暂存存储器(RAM)由9个字节组成,包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度温度的低八位,第二个字节是温度的高八位。

第三个和第四个字节是温度高限TH、温度低限TL暂存区,第五个字节是配置寄存器暂存区,第6、7、8字节是系统保留用,就相当于DS18B20的运算内存,第九个字节是冗余检验字节。

其分配如下表所示。

①、第0和第1字节:当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。

DS18B20使用教程

DS18B20使用教程

DS18B20使用教程一、硬件准备使用DS18B20前,需要准备以下硬件:1.DS18B20传感器:一种带有3引脚的传感器,其中VCC引脚连接到3.3V或5V电源,GND引脚连接到地,数据引脚连接到一个GPIO引脚。

2.上拉电阻:将数据引脚连接到一个引脚,同时引脚上接一个4.7kΩ的上拉电阻。

二、软件准备使用DS18B20需要安装相应的软件库。

根据所用的控制器和开发环境不同,可以选择不同的库。

下面以Arduino为例,介绍DS18B20的使用方法。

1.配置引脚首先,在Arduino代码中设置引脚,指定将DS18B20的数据引脚接到哪个引脚上。

可以通过如下代码片段实现,其中的`ONE_WIRE_BUS`表示数据引脚所连接的Arduino引脚编号。

```cpp#define ONE_WIRE_BUS 2 // 数据引脚连接到Arduino的2号引脚```2.加载库文件然后,在Arduino IDE中,点击“工具”->“管理库”,`OneWire`库并安装。

这个库提供了与DS18B20进行通信的函数。

3.编写代码接下来,编写代码来读取DS18B20的温度。

首先在代码中引入`OneWire`库,然后初始化一个`OneWire`对象,并将数据引脚作为参数传入。

接下来,通过`search`函数查找DS18B20设备的地址,通过`reset`函数向其发送初始化信号。

然后,使用`readTemperature`函数从DS18B20读取温度值,最后将温度值打印出来。

```cpp#include <OneWire.h>OneWire ds(ONE_WIRE_BUS); // 初始化数据引脚void setuSerial.begin(9600); // 初始化串口void loobyte i;byte present = 0;byte type_s;byte data[12];byte addr[8];float celsius, temperature;if ( !ds.search(addr))Serial.println("No more addresses.");Serial.println(;ds.reset_search(;delay(250);return;}Serial.print("ROM =");for( i = 0; i < 8; i++)Serial.write(' ');Serial.print(addr[i], HEX);}if (OneWire::crc8(addr, 7) != addr[7])Serial.println("CRC is not valid!");return;}Serial.println(;//DS18B20的型号//下面的代码是根据型号不同采用不同的温度读取方式if (addr[0] == 0x10)Serial.println(" Chip = DS18S20");type_s = 1;} else if (addr[0] == 0x28)Serial.println(" Chip = DS18B20");type_s = 0;} elseSerial.println("Device is not a DS18x20 family device.");return;}ds.reset(;ds.select(addr);ds.write(0x44, 1); // 开始温度转换delay(1000); //等待温度转换完成present = ds.reset(;ds.select(addr);ds.write(0xBE); // 读取温度for ( i = 0; i < 9; i++) { // 从DS18B20读取9个字节的温度数据data[i] = ds.read(;}//将读取到的数据进行处理int raw = (data[1] << 8) , data[0];if (type_s)raw = raw << 3; // 9 bit resolution defaultif (data[7] == 0x10)raw = (raw & 0xFFF0) + 12 - data[6];}} elsebyte cfg = (data[4] & 0x60);if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 mselse if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 mselse if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms }celsius = (float)raw / 16.0; // 将数据转换为摄氏度temperature = celsius * 1.8 + 32.0; // 将数据转换为华氏度Serial.print(" Temperature = ");Serial.print(celsius);Serial.print(" Celsius, ");Serial.print(temperature);Serial.println(" Fahrenheit");```4.上传代码最后,在Arduino IDE中将代码上传到Arduino板上。

DS18B20温度读取及显示讲解学习

DS18B20温度读取及显示讲解学习
sbit DS=P3^7;
void delay6us(uchar z){
while(z--);
}
void delayms(uchar z){
uchar i,j;
for(i=0;i<z;i++)
for(j=0;j<160;j++);
}
void init(){
uchar presence=1;
while(presence){
DS=ch&0x01;
delay6us(11);
DS=1;
delay6us(1);
ch>>=1;
}
}
void DSchange(){
DS=1;
init();
ds_write(0xcc);
ds_write(0x44);
}
void DSreadtempcom(){
DS=1;
init();
ds_write(0xcc);
return temp;
}
void display(uint wendu){
uchar bai,shi,ge,sfen,bfen,qfen;
uchar s,பைடு நூலகம்p,th,tl;
uint xs,flag;
flag=wendu&0x8000;
if(flag!=0)
wendu=~(wendu-1);
th=wendu/256;
wela=0;
if(flag!=0){
dula=0x40;//显示负号
}else
dula=0x00;
delayms(10);
wela=1;
if(bai!=0){

测温芯片DS18B20详细解读剖析

测温芯片DS18B20详细解读剖析

第一部分:DS18B20的封装和管脚定义首先,我们来认识一下DS18B20这款芯片的外观和针脚定义,DS18B20 芯片的常见封装为TO-92,也就是普通直插三极管的样子,当然也可以找到以SO (DS18B20Z )和ySOP (DS18B20U )形式封装的产品,下面为DS18B20T692封装(DS18820 )NCNCV DDDQSO封装(DS18B20Z )DQNCNCGNDNCNCNCGNDV DDNCNCNCp SOP封装(DS18B20U )各种封装的图示及引脚图底部视角了解了这些该芯片的封装形式,下面就要说到各个管脚的定义了,如下表即为该芯片的管脚定义:上面的表中提到了一个“奇怪”的词一一“寄生电源”,那我有必要说明一下了,DS18B20芯片可以工作在“寄生电源模式”下,该模式允许DS18B20工作在无外部电源状态,当总线为高电平时,寄生电源由单总线通过VDD引脚, 此时DS18B20可以从总线“窃取”能量,并将“偷来”的能量储存到寄生电源储能电容(Cpp )中,当总线为低电平时释放能量供给器件工作使用。

所以,当DS18B20工作在寄生电源模式时,VDD引脚必须接地。

第二部分:DS18B20的多种电路连接方式如下面的两张图片所示,分别为外部供电模式下单只和多只DS18B20测温系统的典型电路连接图。

(1)外部供电模式下的单只DS18B20芯片的连接图DS18B20单片机VW... __ _____ _|I f ? n1y 7 j r W(2)外部供电模式下的多只Vpu单片机这里需要说明的是,DS18B20芯片通过达拉斯公司的单总线协议依靠一个单线端口通讯,当全部器件经由一个三态端口或者漏极开路端口与总线连接时,控制线需要连接一个弱上拉电阻。

在多只DS18B20连接时,每个DS18B20都拥有一个全球唯一的64位序列号,在这个总线系统中,微处理器依靠每个器件独有的64位片序列号辨认总线上的器件和记录总线上的器件地址,从而允许多只DS18B20同时连接在一条单线总线上,因此,可以很轻松地利用一个微处理器去控制很多分布在不同区域的 DS18B20 ,这一特性在环境控制、探测建筑物、 仪器等温度以及过程监测和控制等方面都非常有用。

51单片机DS18B20温度传感器原理及实验

51单片机DS18B20温度传感器原理及实验

51单片机DS18B20温度传感器原理及实验一、引言温度传感器是一种常用的传感器器件,它的作用是将物体的温度变化转换为电信号输出,以实现温度的监测和控制。

DS18B20是一种数字温度传感器,采用数字信号输出,具有体积小、精度高、线性度好等特点,被广泛应用于各种温度控制系统中。

本文将介绍DS18B20的工作原理及实验方法。

二、DS18B20的工作原理DS18B20是一种基于一线传输协议的数字温度传感器,其工作原理如下:1.接口电路:DS18B20具有三个引脚,分别是VDD、DQ和GND。

其中,VDD是供电引脚,DQ是数据引脚,GND是地引脚。

2.传感器原理:DS18B20内部包含一个温度传感器和一个数字转换器。

温度传感器采用热敏电阻的原理,通过测量热敏电阻的电阻值来反映物体的温度变化。

数字转换器将传感器测得的电阻值转换为数字信号输出。

三、实验流程以下是使用51单片机对DS18B20温度传感器进行实验的详细流程:1.硬件准备:-将DS18B20的VDD引脚连接到单片机的VCC引脚,DQ引脚连接到单片机的任意IO引脚,GND引脚连接到单片机的GND引脚。

-确保DS18B20的供电电压和单片机的工作电压一致。

2.初始化:-在程序中定义DS18B20的DQ引脚所对应的单片机的IO引脚。

-初始化DS18B20,即发送初始化指令给DS18B20。

3.温度转换:-发送温度转换指令给DS18B20,DS18B20开始测量温度。

-等待一定的延时,确保DS18B20完成温度转换。

4.读取温度:-发送读取温度指令给DS18B20,DS18B20将温度的原始数据发送给单片机。

-单片机通过计算将原始数据转换为温度值。

-温度值可以通过串口或LCD等方式进行显示。

5.循环实验:-以上步骤需要不断重复,以便实时监测温度的变化。

四、总结DS18B20温度传感器是一种常用的数字温度传感器,具有精度高、体积小、线性度好等特点,适用于各种温度控制系统。

DS18B20温度传感器学习

DS18B20温度传感器学习

TL=read18B20byte(); // LSB 连续读,先读去地位再读取高位数据 TH=read18B20byte(); // MSB 第三步 温度数据的处理,提取符号位和数据位 数据的格式如下图,读取的两个字节中,高字节的二进制中的前面 5 位是符号位,如果测 得的温度大于 0,这 5 位为 0,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小 于 0,这 5 位为 1,测到的数值需要取反加 1 再乘于 0.0625 即可得到实际温度。所以程序中当 高字节大于 7(0000 0111)时,符号位为负,否则为正。最后返回算出的温度值。
在 DS18B20 测温程序设计中,向 DS18B20 发出温度转换命令后,程序总要等待 DS18B20 的 返回信号,一旦某个 DS18B20 接触不好或断线,当程序读该 DS18B20 时,将没有返回信号,程 序进入死循环。这一点在进行 DS18B20 硬件连接和软件设计时也要给予一定的重视。
测温电缆线建议采用屏蔽 4 芯双绞线,其中一对线接地线与信号线,另一组接 VCC 和地线, 屏蔽层在源端单点接地
言实现。 在 DS18B20 的有关资料中均未提及单总线上所挂 DS18B20 数量问题,容易使人误认为可以
挂任意多个 DS18B20,在实际 Nhomakorabea用中并非如此。当单总线上所挂 DS18B20 超过 8 个时,就需要 解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。
连接 DS18B20 的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过 50m 时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达 150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况 主要是由总线分布电容使信号波形产生畸变造成的。因此,在用 DS18B20 进行长距离测温系统 设计时要充分考虑总线分布电容和阻抗匹配问题。

友台半导体有限公司 DS18B20H 单总线温度传感器说明书

友台半导体有限公司 DS18B20H 单总线温度传感器说明书

特点 ● 单总线接口,节约布线资源● 应用简单,无需额外器件● 转换温度时间500ms● 可编程9~12位数字输出●宽供电电压范围● 每颗芯片有可编程的ID 序列号 ● 用户可自行设置报警值 ● 超强ESD 保护能力(HBM>8000V )● 典型待机电流功耗1µA @3V ●典型换电流功耗0.6mA@3V典型应用● 便携应用,手机与穿戴设备● 温度监控 ●粮情监测● 智能家电系统 ● 水温测量● 建筑、设备或机房内部温度监测系统● 过程监测和控制系统概述是一款高精度的单总线温度测量芯片。

温度传感器的测温范围为-55°C 到+125°C ;根据用户需要通过配置寄存器可以设定数字转换精度和测温速度。

芯片内置4byte 非易失性存储单元供用户使用,2byte 用于高低温报警,另外2byte 用于保存用户自定义信息。

在-10°C 到+85°C 范围内最大误差为±°C 。

用户可自主选择电源供电模式和寄生供电模式。

单总线接口允许多个设备挂在同一总线,该特性使得也非常便于部署分布型温度采集系统。

管脚图和管脚描述34167852GNDDQ VDD MSOP82.5V-5.5V DS18B20H DS18B200.4DS18B20图1 DS18B20框图结构框图图1是DS18B20的原理框图。

64位ROM存储了器件的唯一序列码。

暂存器包含了两个字节的温度寄存器,存储来自于温度传感器的数字输出。

另外,暂存器提供了一高一低两个报警触发阈值寄存器(TH和TL)。

配置寄存器允许用户设定温度数字转换的分辨率为9,10,11或12位。

2个字节的用户可编程E2PROM是非易失性存储,器件掉电时数据不会失去。

DS18B20使用单总线协议,总线通讯通过一根控制信号线实现。

控制线需要一个弱上拉电阻这样所有的器件都通过三态或者开漏极端口(就是DS18B20的DQ引脚)连接到总线上。

DS18B20的使用方法和注意事项

DS18B20的使用方法和注意事项

DS18B20的使用方法和注意事项DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。

与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

因而使用DS18B20可使系统结构更趋简单,可靠性更高。

他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。

DS18B20简介(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(2)在使用中不需要任何外围元件。

(3)可用数据线供电,电压范围:+3.0~ +5.5 V。

(4)测温范围:-55 ~+125 ℃。

固有测温分辨率为0.5 ℃。

(5)通过编程可实现9~12位的数字读数方式。

(6)用户可自设定非易失性的报警上下限值。

(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。

(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

单线(1—wire)技术该技术采用单根信号线,既可传输时钟,也能传输数据,而且是双向传输!适用于单主机系统,主机能够控制一个或多个从机设备,通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能释放该线,而让其他设备使用。

单线通常要求外接一个5K的上拉电阻,这样当该线空闲时!其状态为高电平!主机和从机之间的通讯分三个步骤:初始化单线器件!识别单线器件和单线数据传输!单线1—wire协议由复位脉冲,应答脉冲,写0,写1,读0,读1这几种信号类型实现,这些信号中除了应答脉冲其他都由主机发起!并且所有指令和数据字节都是低位在前!芯片图自己找NC:1、2、6、7、8脚空悬空不使用VDD:可选电源脚,电源电压范围3——5.5V,当工作于寄生电源时,此脚必须接地DQ:数据输入/输出脚。

ds18b20温度转换

ds18b20温度转换
DS18B20
一、初始化
1、步骤:
1)、有总线控制器发出复位脉冲
2)、从机发出存在脉冲。(存在脉冲让总线知道DS15B20在总线上已准备好操作、一旦总线控制器探测到一个存在脉冲,就可以发出ROM命令)
2、初始化过程“复位”和“存在”脉冲
3、过程:
送1复位——送0拉低(800us)——送1产生一个上升沿(50us)——检测低电平——检测高电平
write0();
else
write1();
k=_cror_(k,1);
_nop_();
_nop_();
}
}
uchar ds1820rd()//读数据
{
uchar a,b,i,dat = 0,dat1 = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号0
_nop_();
DQ = 1; //给脉冲信号1
wr18b20(0xcc);//写入跳过序列号命令字Skip Rom
wr18b20(0x44);//写入温度转换命令字Convert T
init_1820();
wr18b20(0xcc);//写入跳过序列号命令字Skip Rom
wr18b20(0xbe);//写入读取数据令字Read Scratchpad
2)I/O线电平拉低后,DS18B20在一个15us到60us的时候对I/O线采样。如果线上为高电平,就是写1,如果线上是低电平,就是写0
2、写时序图:
1)写0:先把数据线拉低15us,然后在至少保持15us的低电平,进行写0(数据线必须被拉至逻辑低电平且至少保持30us),然后必须拉高恢复(至少1us,不用考虑)。
_nop_();
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return temp;
}
void display(uint wendu){
uchar bai,shi,ge,sfen,bfen,qfen;
uchar s,tp,th,tl;
uint xs,flag;
flag=wendu&0x8000;
if(flag!=0)
wendu=~(wendu-1);
th=wendu/256;
ds_write(0xbe);
}
uint DSreadtemp(){
int temp=0;
uchar tmh,tml;
DSchange();
delayms(1);
DSreadtempcom();
tml=ds_read();
tmh=ds_read();
DS=1;
temp=tmh;
temp<<=8;
temp|=tml;
tl=wendu%256;
s=tl&0x0f;
xs=0.0625*s*1000;
th<<=4;
tl>>=4;
tp=th|tl;
bai=tp/100;
shi=(tp%100)/10;
ge=tp%10;
sfen=xs/100;
bfen=(xs%100)/10;
qfen=xs%10;//显示的百位十位个位以及小数点后三位
DS=ch&0x01;
delay6us(11);
DS=1;
delay6us(1);
ch>>=1;
}
}
void DSchange(){
DS=1;
init();
ds_write(0xcc);
ds_write(0x44);
}
void DSreadtempcom(){
DS=1;
init();
ds_write(0xcc);
DS=0;
delay6us(1);
DS=1;
delay6us(1);
bi=DS;
byt=(byt>>1)|(bi<<7);
delay6us(11);
}
return byt;
}
void ds_write(uchar ch){
uchar i;
for(i=0;i<8;i++){
DS=0;
delay6us(1);
DS=0;
delay6us(80);//延时480us以上
DS=1;
delay6us(15);
if(DS==0){
presence=0;
while(DS==0);
}
else
presence=1;
}
}
uchar ds_read(){
uchar byt,bi;
uchar i;
for(i=0;i<8;i++){
DS18B20温度读取及显示
DS18B20温度读取及显示
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define wela P2
#define dula P0
uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit DS=P3^7;
void delay6us(uchar z){
while(z--);
}
void delayms(uchar z){
uchar i,j;
for(i=0;i<z;i++)
for(j=0;j<160;j++);
}
void init(){
uchar presence=1;
while(presence){
wela=0;
if(flag!=0){
dula=0x40;//显示负号
}else
dula=0x00;
delayms(10);
wela=1;
if(bai!=0){
dula=table[bai];
}else
dula=0x00;
delayms(10);
wela=2;
dula=table[shi];
delayms(10);
wela=3;
dula=table[ge]|0x80;//加小数点
delayms(10);
wela=4;
dula=table[sfen];
delayms(10);
wela=5;
dula=table[bfen];
delayms(10);
wela=6;
dula=table[qfenΒιβλιοθήκη ;delayms(10);
}
void main(){
uint temp;
while(1){
temp=DSreadtemp();
display(temp);
}
}
相关文档
最新文档