DS18B20温度传感器使用方法以及代码
DS18B20温度传感器使用方法以及代码

第7章DS18B20温度传感器7.1 温度传感器概述温度传感器是各种传感器中最常用的一种,早起使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可以计算出当前环境温度。
随着科技的进步,现代的温度传感器已经走向数字化,外形小,接口简单,广泛应用在生产实践的各个领域,为我们的生活提供便利。
随着现代仪器的发展,微型化、集成化、数字化、正成为传感器发展的一个重要方向。
美国DALLS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即单片机接口仅需占用一个I/O端口,无需任何外部元件,直接将环境温度转化为数字信号,以数码方式串行输出,从而大大简化了传感器与微处理器的接口。
7.2 DS18B20温度传感器介绍DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
1.DS18B20温度传感器的特性①独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
②在使用中不需要任何外围元件。
③可用数据线供电,电压范围:+3.0~ +5.5 V。
④测温范围:-55 ~+125 ℃。
固有测温分辨率为0.5 ℃。
⑤通过编程可实现9~12位的数字读数方式。
DS18B20温度传感器实现代码

DS18B20温度传感器实现代码平台: freescale CodeWarriorMCU:MC9S12G128(汽车级芯⽚)#include "Ds18b20.h"/************************************************************* DS18B20 status initialization************************************************************/#pragma MESSAGE DISABLE C12056 //屏蔽警告INT8U Ds18b20StsInit(void){INT8U ack = DB_OK;INT16U outTime = 500;//DisableInterrupts/* 初始化状态 */BUS_DIR = HIGH;BUS = HIGH;DelayUs(8);/* 拉低BUS,延时500us */BUS = LOW;DelayUs(480);/* BUS上拉,延时15us-60us */BUS = HIGH;DelayUs(30);/* BUS设置为输⼊ */BUS_DIR = LOW;/* 等待DS18B20存在脉冲做出回应,0正常,60-240us */DelayUs(8);while(BUS){--outTime; //超时处理if(outTime == 0){ack = DB_ERR;break;}}/* 等待DS18B20恢复稳定 */DelayUs(128);/* BUS上拉 */BUS_DIR = HIGH;BUS = HIGH;DelayUs(280);//EnableInterruptsreturn (ack);}/************************************************************* Write data to ds18b20************************************************************/PRIVATE void Ds18b20WriteData(INT8U cmd){INT8U i;DisableInterruptsfor(i = 0; i < 8; i++){//BUS = LOW; //HIGH->LOW 启动写时序//Tim_Delay8Us(2);if(cmd & 0x01) //从低位开始发送数据,15us完成 {BUS = 0; //写1时序DelayUs(5);BUS = 1;}else{BUS = 0; //写0时序DelayUs(5);}DelayUs(60); //等待从器件采集数据BUS = HIGH; //拉⾼总线,起始状态DelayUs(8);cmd >>= 0x01;}EnableInterrupts}#if 1/************************************************************* Read data from ds18b20************************************************************/ PRIVATE INT8U Ds18b20ReadData(void){INT8U i;INT8U data = 0x00;BUS = HIGH;DelayUs(8);DisableInterruptsfor(i = 0; i < 8; i++){data >>= 0x01;BUS = LOW; //拉低总线,进⾏读时序操作 DelayUs(8);BUS = HIGH; //拉低总线,进⾏读时序操作 DelayUs(8);BUS_DIR = LOW; //配置为输⼊asm("nop");//Tim_Delay8Us(1);if(BUS){data |= 0x80;}DelayUs(60); //等待数据读缓存BUS_DIR = HIGH;BUS = HIGH;DelayUs(8);}EnableInterruptsreturn (data);#endifINT8U Dt = 0, Dt1 = 0;/************************************************************* Get data from ds18b20************************************************************/INT16U Ds18b20GetTemperature(void){INT16U data = CLEAR;INT8U temp[2] = {0};Dt = Ds18b20StsInit();Ds18b20WriteData(0xcc); //跳过rom命令Ds18b20WriteData(0x44); //启动温度转换Dt1 = Ds18b20StsInit();Ds18b20WriteData(0xcc); //跳过rom命令Ds18b20WriteData(0xbe); //读暂存寄存器temp[0] = Ds18b20ReadData();temp[1] = Ds18b20ReadData();data = (temp[1] << 8) | temp[0];return (data);}调试DS18B20遇到采集数据不稳定情况: 不稳定现象:每读到⼏个正常数据后会有⼏个不正常的数据 不稳定原因:因为中断在打断我数据的读写以及采集 解决办法:因为DS18B20单总线读写时对时序要求很严格,每次读写时关闭中断即可得到稳定数据。
(完整版)读取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数字温度传感器(0001)

DS18B20数字温度传感器DS18B20温度传感器DS18B20,常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
面对着扁平的那一面,左负右正,一旦接反就会立刻发热,有可能烧毁!同时,接反也是导致该传感器总是显示85℃的原因。
引脚封装TO-92封装1 接地接地2 数字信号输入输出,一线输出:源极开路3 电源可选电源管脚。
见"寄生功率"一节细节方面。
电源必须接地,为行动中,寄生虫功率模式。
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。
主要根据应用场合的不同而改变其外观。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。
耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
①、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
②、测温范围-55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前是错误的)1℃。
③、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
④、工作电源: 3.0~5.5V/DC (可以数据线寄生电源)⑤、在使用中不需要任何外围元件⑥、测量结果以9~12位数字量方式串行传送⑦、不锈钢保护管直径Φ6⑧、适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备测温⑨、标准安装螺纹M10X1, M12X1.5, G1/2”任选⑩、PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
应用范围1 该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域2 轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制。
DS18B20温度传感器使用方法以及代码

第7章DS18B20温度传感器温度传感器概述温度传感器是各种传感器中最常用的一种,早起使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可以计算出当前环境温度。
随着科技的进步,现代的温度传感器已经走向数字化,外形小,接口简单,广泛应用在生产实践的各个领域,为我们的生活提供便利。
随着现代仪器的发展,微型化、集成化、数字化、正成为传感器发展的一个重要方向。
美国DALLS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即单片机接口仅需占用一个I/O端口,无需任何外部元件,直接将环境温度转化为数字信号,以数码方式串行输出,从而大大简化了传感器与微处理器的接口。
DS18B20温度传感器介绍DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
1.DS18B20温度传感器的特性①独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
②在使用中不需要任何外围元件。
③可用数据线供电,电压范围:+~ + V。
④测温范围:-55 ~+125 ℃。
固有测温分辨率为℃。
⑤通过编程可实现9~12位的数字读数方式。
⑥用户可自设定非易失性的报警上下限值。
DS18B20温度传感器的使用方法

DS18B20温度传感器的使用方法;这是关于DS18B20的读写程序,数据脚P2.2,晶振11.0592mhz;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒;可以将检测到的温度直接显示到AT89C51的两个数码管上;显示温度00到99度,很准确无需校正!ORG 0000H;单片机内存分配申明!TEMPER_L EQU 29H;用于保存读出温度的低8位TEMPER_H EQU 28H;用于保存读出温度的高8位FLAG1 EQU 38H;是否检测到DS18B20标志位a_bit equ 20h ;数码管个位数存放内存位置b_bit equ 21h ;数码管十位数存放内存位置MAIN:LCALL GET_TEMPER;调用读温度子程序;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度;显示范围00到99度,显示精度为1度;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数MOV A,29HMOV C,40H;将28H中的最低位移入CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISPLAY;调用数码管显示子程序CPL P1.0AJMP MAIN; 这是DS18B20复位初始化子程序INIT_1820:SETB P2.2NOPCLR P2.2;主机发出延时537微秒的复位低脉冲MOV R1,#3TSR1:MOV R0,#107DJNZ R0,$DJNZ R1,TSR1SETB P2.2;然后拉高数据线NOPNOPNOPMOV R0,#25HTSR2:JNB P2.2,TSR3;等待DS18B20回应DJNZ R0,TSR2LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在CLR P1.7;检查到DS18B20就点亮P1.7LEDLJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在CLR P1.1LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间TSR7:SETB P2.2RET; 读出转换后的温度值GET_TEMPER:SETB P2.2LCALL INIT_1820;先复位DS18B20JB FLAG1,TSS2CLR P1.2RET ; 判断DS1820是否存在?若DS18B20不存在则返回TSS2:CLR P1.3;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒LCALL DISPLAYLCALL INIT_1820;准备读温度前先复位MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200; 将读出的温度数据保存到35H/36HCLR P1.4RET;写DS18B20的子程序(有具体的时序要求)WRITE_1820:MOV R2,#8;一共8位数据CLR CWR1:CLR P2.2MOV R3,#5DJNZ R3,$RRC AMOV P2.2,CMOV R3,#21DJNZ R3,$SETB P2.2NOPDJNZ R2,WR1SETB P2.2RETREAD_18200: ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOV R2,#8;数据一共有8位RE01:CLR CSETB P2.2NOPNOPCLR P2.2NOPNOPNOPSETB P2.2MOV R3,#8RE10:DJNZ R3,RE10MOV C,P2.2MOV R3,#21RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;显示子程序display: mov a,29H;将29H中的十六进制数转换成10进制mov b,#10 ;10进制/10=10进制div abmov b_bit,a ;十位在amov a_bit,b ;个位在bmov dptr,#numtab ;指定查表启始地址mov r0,#4dpl1: mov r1,#250 ;显示1000次dplop: mov a,a_bit ;取个位数MOVC A,@A+DPTR ;查个位数的7段代码mov p0,a ;送出个位的7段代码clr p2.7 ;开个位显示acall d1ms ;显示1mssetb p2.7mov a,b_bit ;取十位数MOVC A,@A+DPTR ;查十位数的7段代码mov p0,a ;送出十位的7段代码clr p2.6 ;开十位显示acall d1ms ;显示1mssetb p2.6djnz r1,dplop ;100次没完循环djnz r0,dpl1 ;4个100次没完循环ret;1MS延时D1MS: MOV R7,#80DJNZ R7,$RET;实验板上的7段数码管0~9数字的共阴显示代码numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH END。
DS18B20介绍、流程图和程序源代码

DS18B20单线数字温度传感器DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器,体积更小、适用电压更宽、更经济。
一线总线独特而且经济的特点,使用户可轻松地组建温度传感器网络,为测量系统的构建引入全新概念。
DS18B20、DS1822 “一线总线”数字化温度传感器同DS1820一样,支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C,而DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C,分辨率设定,以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS1822与DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
1、 DS18B20性能特点DS18B20的性能特点:①采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位),②测温范围为-55℃-+125℃,测量分辨率为0.0625℃,③内含64位经过激光修正的只读存储器ROM,④适配各种单片机或系统机,⑤用户可分别设定各路温度的上、下限,⑥内含寄生电源。
Ds18b20温度传感器使用手册

Ds18b20温度传感器使用手册一、传感器实物图二、引脚说明(1)1 VCC 3.0~5.5V/DC 3 GND42 DQ 数字信号输入/输出端(2)1 5 GND2 63 VCC 3.0~5.5V/DC 74 DQ 数字信号输入/输出8端三、软件设计功能说明:ds18b20采集温度并显示在1602液晶上#include <reg52.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned intsbit ds=P2^4; //温度传感器信号线uint temp;float f_temp;sbit rs=P1^0; //sbit lcden=P1^2; // 液晶sbit wr=P1^1; //void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/***********液晶**************/void write_com(uchar com){//写液晶命令函数rs=0;lcden=0;P0=com;delay(3);lcden=1;delay(3);lcden=0;}void write_date(uchar date){//写液晶数据函数rs=1;lcden=0;P0=date;delay(3);lcden=1;delay(3);lcden=0;}void init() //液晶初始化{lcden=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);}/***********ds18b20**********/void dsreset(void) //18B20复位,初始化函数{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit tempreadbit(void) //读1位函数{uint i;bit dat;ds=0;i++; //i++ 起延时作用ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return (dat);}uchar tempread(void) //读1个字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}void tempwritebyte(uchar dat) //向18B20写一个字节数据{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{ds=0; //写0i=8;while(i>0)i--;ds=1;i++;i++;}}}void tempchange(void) //DS18B20 开始获取温度并转换{dsreset();delay(1);tempwritebyte(0xcc); // 写跳过读ROM指令tempwritebyte(0x44); // 写温度转换指令}uint get_temp() //读取寄存器中存储的温度数据{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); //读低8位b=tempread(); //读高8位temp=b;temp<<=8; //两个字节组合为1个字temp=temp|a;f_temp=temp*0.0625; //温度在寄存器中为12位分辨率位0.0625°temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入f_temp=f_temp+0.05;return temp; //temp是整型}uchar change(uchar a) //将数字转换为字符{uchar b;if(a==0) b='0';if(a==1) b='1';if(a==2) b='2';if(a==3) b='3';if(a==4) b='4';if(a==5) b='5';if(a==6) b='6';if(a==7) b='7';if(a==8) b='8';if(a==9) b='9';return b;}void dis_temp(uint t) //显示程序{uchar a,b;write_com(0x80+0x40);a=t/100;b=change(a);write_date(b); //十位数delay(5);a=t%100/10;b=change(a); //个位数write_date(b);delay(5);write_date(0x2e); //小数点delay(5);a=t%100%10;b=change(a); //十分位write_date(b);delay(5);write_date(0xdf); //摄氏度的符号delay(5);write_date(0x43);delay(5);}void main(){wr=0;init();while(1){write_com(0x01);tempchange();dis_temp(get_temp());delay(500);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第7章 DS18B20温度传感器7.1 温度传感器概述温度传感器是各种传感器中最常用的一种,早起使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可以计算出当前环境温度。
随着科技的进步,现代的温度传感器已经走向数字化,外形小,接口简单,广泛应用在生产实践的各个领域,为我们的生活提供便利。
随着现代仪器的发展,微型化、集成化、数字化、正成为传感器发展的一个重要方向。
美国DALLS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即单片机接口仅需占用一个 I/O端口,无需任何外部元件,直接将环境温度转化为数字信号,以数码方式串行输出,从而大大简化了传感器与微处理器的接口。
7.2 DS18B20温度传感器介绍DS18B20是美国DALLAS^导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9〜12位的数字值读数方式。
可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入 DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较 DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
1. DS18B20温度传感器的特性①独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20勺双向通讯。
②在使用中不需要任何外围元件。
③可用数据线供电,电压范围:+3.0~ +5.5 V。
④测温范围:-55 ~+125 C。
固有测温分辨率为0.5 C。
⑤通过编程可实现9~12位的数字读数方式。
⑥用户可自设定非易失性的报警上下限值。
⑦支持多点组网功能,多个 DS18B20可以并联在惟一的三线上,实现多点测温。
⑧负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
2. 引脚介绍DS18B20有两种封装:三脚TO-92直插式(用的最多、最普遍的封装)和八脚SOIC贴片式。
下图为实验板上直插式 DS18B20的原理图。
3. 工作原理单片机需要怎样工作才能将DS18B2 0中的温度数据独取出来呢?F面将给出详细分析首先我们来看看控制DS18B2啲指令:(1)读命令(33H 通过该命令主机可以读出 ROM中 8位系列产品代码、48位产品序列号和8位CRC码。
读命令仅用在单个DS18B20 在线情况,当多于一个时由于DS18B20为开漏输出将产生线与,从而引起数据冲突。
(2)选择定位命令(55H)多片DS18B20在线时,主机发出该命令和一个64位数列,DS18B2C内部ROM与主机数列一致者,才响应主机发送的寄存器操作命令,其他DS18B2C等待复位。
该命令也可以用在单片DS18B2C情况。
(3)跳过ROM序列号检测命令(CCH 对于单片DS18B2C在线系统,该命令允许主机跳过ROM序列号检测而直接对寄存器操作,从而节省时间。
对于多片DS18B2C在线系统,该命令将引起数据冲突。
(4)查询命令(F0H 当系统初建时,主机可能不知道总线上有多少设备,以及他们各自的64位序列号,用该命令可以做到这点。
(5)报警查询命令(ECH 该命令操作过程同ROM查询命令,但是,仅当上次温度测量值已置位报警标志(由于高于TH或低于TL 时),DS18B20才响应该命令,如果 DS18B20处于上电状态,该标志将保持有效,直到遇到下列两种情况:(1)本次测量温度发生变化,测量值处于TH TL之间;(2)TH TL改变,温度值处于新的范围之间。
设置报警时要考虑到EEROMP 的值。
如果主机只是对一个DS18B2C进行操作,进不需要读取ROM编码一级匹配ROM编码了,只要跳过RO(CCH命令,就可以进行如下温度转换和读取操作。
(1)写入(4EH 用此命令把数据写入寄存第2~4字节,从第2 字节(TH 开始。
复位信号发出之前必须把这三个字节写完。
(2)读出(BEH 用此命令读出寄存器中的内容,从第 1字节开始,直到读完第9字节,如果仅需要寄存器中部分内容,主机可以在合适时刻发送复位命令结束该过程。
(3)复制(48H)用该命令把暂存器第2〜4字节转存到DS18B20 的EERO 中,如果DS18B2C是由信号线供电,主机发出此命令后,总线必须保证至少10ms的上拉,当发出命令后,主机发出读时隙来读总线,如果转存正在进行,读结果为 0,转存结束为1。
(4)开始转换(44H)D S18B20收到该命令后立刻开始温度转换,不需要其他数据。
此时DS18B2C处于空闲状态,当温度转换正在进行时,主机读总线将收到0,转换结束为1。
如果DS18B20是由信号线供电,主机发出此命令后主机必须立即提供至少相应于分辨率的温度转换时间的上拉电平。
(5)回调(B8H 执行该命令把EEROI中的内容回调到寄存器TH TL和设置寄存器单元中,DS18B2C上电时能自动回调,因此设备上电后TH TL就存在有效数据。
该命令发出后,如果主机跟着读总线,读到0意味着忙,1为回调结束。
(6)读电源标志(B4H 主机发出命令后读总线,DS18B2C将发送电源标志,0为信号线供电,1为外接电源。
同为低电平DS18B20在出厂时默认配置为12位,其中最高位为符号位,即 温度值共11位,单片机在读取数据时,一次会读两字节共 16位,读 完后将低11位的二进制数转化为十进制数后再乘以 0.0625变为所测 的实际温度值。
另外,还需要判断温度的正负。
前5个数字为符号位, 这5位同时变化,我们只需要判断其中1位就可以了。
前5位为1时, 读取的温度为负值,且测到的数值需要取反加 1再乘以0.0625才可 得到实际温度值。
前五位为0时;读取的温度为正值,只要将测得的 数值乘以0.0625即可得到实际温度值。
4. 工作时序图图16.26为时序图中各总线状态即626时序图中各总线狀态(1)初始化(时序图见图1) 先将数据线置高电平1。
2) 延时(该时间要求不是很严格,但是要尽可能短一点)。
3) 数据线拉到低电平0。
4) 延时750卩s (该时间范围可以在 480-960卩s )。
5) 数据线拉到高电平1。
6) 延时等待,如果初始化成功则在15-60ms 内产生一个由DS18B20 返回的低电平0,据该状态可以确定它的存在。
但是应注意, 不能无限地等待,不然会使程序进入死循环,所以要进行超时判断。
7) 若CPU卖到数据线上的低电平0后,还要进行延时,其延时时间从发出高电平算起(第5步的时间算起)最少要480卩s。
8) 将数据线再次拉到高电平1后结束。
(2)DS18B20写数据(时序图见图1) 数据线线置低电平0。
2) 延时确定的时间为15卩s、3) 按从地位到高位的顺序发送数据(一次只发送一位)。
4) 延时时间45卩s。
5) 将数据线拉到高电平1.6) 重复1-5步骤,直到发送完整个字节。
7) 最后将数据线拉咼到1。
(3)DS18B20卖数据 (时序图见图1) 将数据线拉高到12) 延时2卩s。
3) 将数据线拉到04) 延时6卩s。
5) 将数据线拉高到1.6) 延时4卩s。
7) 读数据线的状态得到一个状态位,并进行数据处理。
8) 延时30卩s。
9) 重复1-7步骤,直到读取完一个字节。
7.3 综合实验四:读取18B20的信息并显示在1602上/*程序功能:在1602液晶显示从DS18B20温度传感器中读出的温度*/#in elude <reg52.h>typedef un sig ned char uchar;typedef un sig ned int uint;sbit ds = P1A6; //温度传感器信号线sbit beep = PM5; //定义蜂鸣器端口sbit LCD_RS =卩2八6; //数据/命令选择端(H/L)sbit LCD_RW =卩2八5; //读写选择端(1/0)sbit LCD_EP = P2A7; // 使能信号uint temp;float f_temp;uchar code table1[] = {"DATA:2014-7-10"};uchar code table2[] = {"Temperature:xx c"};uchar code table3[] = {"09"};void delay( uint xms){ //延时函数uint i,j;for(i = xms;i > 0;i--)for(j = 110;j > 0;j--);}/*******************************************************************/ /*/* DS18B20温度传感器模块/*/*******************************************************************/ void dsreset(void) //18B20 复位,初始化函数{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit tempreadbit() // 读 1 位数据函数{uint i;bit dat;ds=O;i++; 〃i++起延时作用ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return dat;}uchar tempread() // 读 1 个字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j«7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里}return dat;}void tempwritebyte(uchar dat) // 向 DS18B20写一个字节数据函数{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{ds=0; // 写 0i=8;while(i>0)i--;ds=1;i++;i++;}}void tempcha nge(void) //DS18B20 开始获取温度并转换{dsreset();delay(1);tempwritebyte(0xcc); // 写跳过读 ROM 指令tempwritebyte(0x44); // 写温度转换指令}uin t get_temp() 〃读取寄存器中存储的温度数据函数{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); // 读低 8 位b=tempread(); // 读高 8 位temp=b;temp<<=8; //两个字节组合为1个字temp=temp|a;f_temp=temp*0.0625; //温度在寄存器中为12位分辨率位0.0625°temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,力卩0.5是四舍五入f_temp=f_temp+0.05;return temp; //temp 是整型}/*******************************************************************//*/* 1602液晶模块/* /*******************************************************************/ void lcd_wcmd(uchar cmd) // 写入指令数据到 LCD{ //RS=L,RW=L,丘=高脉冲,D0-D7=f令码。