DS18B20使用教程
第3讲 如何使用DS18B20温度传感器

第讲如何使用DS18B20温度传感器教学方法:讲授法授课时数:2学时教学目的:1、掌握DS18B20的硬件结构2、掌握DS18B20的操作时序3、初步DS18B20的使用编程方法教学重点:DS18B20的使用编程方法教学难点:DS18B20的使用编程方法教学环节:组织教学:检查学生人数,强调作业要求。
新授课:DS18B20的使用编程方法教学目的:1、……..2、……. 教学重点作业一、DS18B20的硬件结构1、……2、……3、……..二、DS18B20的操作时序1、…….2、…….3、……... 三、DS18B20的使用编程方法1、…….2、…….参考资料:DALLAS 达拉斯公司的相应产品资料;《数字温度传感器DS1820(DS18B20)的应用》Skyle整理----skyle@-----有不对之处请来信指正一、DS18B20的硬件结构每只D51820都可以设置成两种供电方式即数据总线供电方式和外部供电方式采取数据总线供电方式可以节省一根导线但完成温度测量的时间较长采取外部供电方式则多用一根导线但测量速度较快DSl820中还有用于贮存测得的温度值的两个8位存贮器RAM编号为0号和1号1号存贮器存放温度值的符号如果温度为负()则1号存贮器8位全为1否则全为00号存贮器用于存放温度值的补码LSB(最低位)的1表示0.5将存贮器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-550-125)温度计算1、Ds1820用9位存贮温值度最高位为符号位下图为18b20的温度存储方式负温度S=1正温度S=0如00AAH为+85,0032H为25FF92H为552、Ds18b20用12位存贮温值度最高位为符号位下图为18b20的温度存储方式负温度S=1正温度S=0如0550H为+850191H为25.0625,FC90H为-55二、DS18B20的操作时序DSl820工作过程及时序DSl820工作过程中的协议如下初始化、ROM操作命令、存储器操作命令、处理数据1、初始化单总线上的所有处理均从初始化开始2、ROM操作品令总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如指令代码Read ROM(读ROM) [33H]Match ROM(匹配ROM) [55H]Skip ROM(跳过ROM] [CCH]Search ROM(搜索ROM) [F0H]Alarm search(告警搜索) [ECH]3、存储器操作命令指令代码Write Scratchpad(写暂存存储器) [4EH]Read Scratchpad(读暂存存储器) [BEH]Copy Scratchpad(复制暂存存储器) [48H]Convert Temperature(温度变换) [44H]Recall EPROM(重新调出) [B8H]Read Power supply(读电源) [B4H]4、时序主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位(1)、初始化时序见图2.25-2主机总线to时刻发送一复位脉冲(最短为480us的低电平信号)接着在tl 时刻释放总线并进入接收状态DSl820在检测到总线的上升沿之后等待15-60us接着DS1820在t2时刻发出存在脉冲(低电平持续60-240 us)如图中虚线所示以下子程序在MCS51仿真机上通过其晶振为12M.初始化子程序RESETPUSH B ;保存B寄存器PUSH A 保存A寄存器MOV A,#4 ;设置循环次数CLR P1.0 ;发出复位脉冲MOV B,#250 ;计数250次DJNZ B,$ ;保持低电平500usSETB Pl.0 ;释放总线MOV B,#6 ;设置时间常数CLR C ;清存在信号标志WAITL: JB Pl.0,WH ;若总线释放跳出循环DJNZ B,W AITL ;总线低等待DJNZ ACC,W AITL;释放总线等待一段时间SJMP SHORTWH: MOV B,#111WH1: ORL C,P1.0DJNZ B,WH1 ;存在时间等待SHORT: POP APOP BRET(2)写时间隙当主机总线t o时刻从高拉至低电平时就产生写时间隙见图2253图2254从to时刻开始15us 之内应将所需写的位送到总线上DSl820在t后15-60us间对总线采样若低电平写入的位是0见图2253若高电平写入的位是1见图2254连续写2位间的间隙应大于1us写位子程序(待写位的内容在C中)WRBIT:PUSH B ;保存BMOV B,#28 ;设置时间常数CLR P1.0 ;写开始NOP ;1usNOP ;1usNOP ;1usNOP ;1usN0P ;1usMOVPl.0,C ;C内容到总线WDLT: DJNZ B,WDLT;等待56UsPOP BSETB Pl.0 ;释放总线RET ;返回写字节子程序(待写内容在A中):WRBYTB:PUSH B :保存BMOV B#8H ;设置写位个数WLOP: RRC A ;把写的位放到CACALL WRBIT ;调写1位子程序DJNZ BWLOP ;8位全写完?POP BRET(3)读时间隙见图2255主机总线to时刻从高拉至低电平时总线只须保持低电平l 7ts之后在t1时刻将总线拉高产生读时间隙读时间隙在t1时刻后t 2时刻前有效t z距to为15捍s也就是说t z时刻前主机必须完成读位并在t o后的60尸s一120 fzs内释放总线读位子程序(读得的位到C中)RDBIT:PUSH B ;保存BPUSH A ;保存AMOV B,#23 ;设置时间常数CLR P1.0 ;读开始图2255的t0时刻NOP ;1usNOP ;1usNOP ;1usNOP ;1usSETB Pl.0 ;释放总线MOV A,P1 ;P1口读到AMOV C,EOH ;P1.0内容CNOP ;1usNOP ;1usNOP ;1usNOP ;1usRDDLT: DJNZ B,RDDLT ;等待46usSETB P1.0POP APOP BRET读字节子程序(读到内容放到A中)RDBYTE:PUSH B ;保存BRLOP MOV B,#8H ;设置读位数ACALL RDBIT ;调读1位子程序RRC A ;把读到位在C中并依次送给ADJNZ B,RLOP ;8位读完?POP B ;恢复BRET三、DS18B20的使用编程方法温度转换和读取;|----------------------------------------------------------------------------------------------| ;| 获取单个ds1820转化的温度值的应用程序,P1.6接ds1820 |;|----------------------------------------------------------------------------------------------| ORG 0000HAJMP MAINORG 0020HMAIN:MOV SP,#60HLCALL GET_TEMPSJMP $GET_TEMP:CLR PSW.4SETB PSW.3 ;设置工作寄存器当前所在的区域CLR EA ;使用ds1820一定要禁止任何中断产生LCALL INT ;调用初使化子程序MOV A,#0CCHLCALL WRITE ;送入跳过ROM命令MOV A, #44HLCALL WRITE ;送入温度转换命令LCALL INT ;温度转换完全,再次初使化ds1820MOV A,#0CCHLCALL WRITE ;送入跳过ROM命令MOV A,#0BEHLCALL WRITE ;送入读温度暂存器命令LCALL READMOV R7,A ;读出温度值低字节存入R7LCALL READMOV R6,A ;读出谩度值高字节存入R6SETB EARETINT: ;初始化ds1820子程序CLR EAL0:CLR P1.6 ;ds1820总线为低复位电平MOV R2,#200L1:CLR P1.6DJNZ R2,L1 ;总线复位电平保持400usSETB P1.6 ;释放ds1820总线MOV R2,#30L4:DJNZ R2,L4 ;释放ds1820总线保持60usCLR C ;清存在信号ORL C,P1.6JC L0 ;存在吗?不存在则重新来MOV R6,#80L5:ORL C,P1.6JC L3DJNZ R6,L5SJMP L0L3:MOV R2,#240L2:DJNZ R2,L2RETWRITE: ;向ds1820写操作命令子程序CLR EAMOV R3,#8 ;写入ds1820的bit数,一个字节8个bit WR1:SETB P1.6MOV R4,#8RRC A ;把一个字节data(A)分成8个bit环移给CCLR P1.6 ;开始写入ds1820总线要处于复位(低)状态WR2:DJNZ R4,WR2 ;ds1820总线复位保持16usMOV P1.6,C ;写入一个bitMOV R4,#20WR3:DJNZ R4,WR3 ;等待40usDJNZ R3,WR1 ;写入下一个bitSETB P1.6 ;重新释放ds1820总线RETREAD:CLR EAMOV R6,#8 ;连续读8个bitRE1:CLR P1.6 ;读前总线保持为低MOV R4,#4NOPSETB P1.6 ;开始读总线释放RE2:DJNZ R4,RE2 ;持续8usMOV C,P1.6 ;从ds1820总线读得一个bitRRC A ;把读得的位值环移给AMOV R5,#30RE3:DJNZ R5,RE3 ;持续60usDJNZ R6,RE1 ;读下一个bitSETB P1.6 ;重新释放ds1820总线RETEND。
DS18B20操作方法

首先由单片机拉高时钟、数据总线,稍微延时一会儿不严格,延时时间尽量短
单片机拉低数据总线 480us-----960us 较为严格(取中间数)
单片机释放总线拉高,延时(15--60us)
单片机检测数据总线的电平值,延时(大于480us)可以去560us
单片机拉高总线
复位结束
2、往DS18B20写一个字节
循环
{
1、单片机拉低总线,写数据,延时45us
拉高数据总线,数据位右移位
}
3、从DS18B20读出数据
单片机拉高数ቤተ መጻሕፍቲ ባይዱ总线,稍微延时,一个机器周期左右即可
拉低数据总线,延时6us左右,
拉高总线,稍微延时6us左右,准备读取数据
读取数据,延时40us左右
DS18B20实用教程

//显示单元数
/*************************11us 延时函数*****************************/ // void delay(unsigned int t) {
for (;t>0;t); } //
/*****************************延时 882us****************************/
读操作
n 当单片机将总线t0时刻从高拉至低电平时,总线只须 保持低电平4us之后,在t1时刻将总线拉高,产生读 时间隙,读时间在t1时刻后t2时刻前有效,t2距t0为 15us,也就是说,t2时刻前主机必须完成读位 并在t0 后的60us~120us内释放总线。
启动温度转换
n 三个步骤: n 1、复位DS18B20
P17=0; delay882us(); P22=1; P23=0; P1=l[xx[3]]; delay882us(); P23=1;
}
/********************************主函数*****************************/
void main()
{
ቤተ መጻሕፍቲ ባይዱ
P0=0xff;
n 2、发出Skip ROM命令(CCH)
n 3、发出Convert T命令(44H)
n 其中Skip ROM命令仅适用于总线上只有一个DS18B20时的情况。
读取温度
n 五个步骤: n 1、复位DS18B20 n 2、发出Skip ROM命令(CCH) n 3、发出Read命令(BEH) n 4、读两字节的温度 n 5、温度格式转换
void delay882us(void)
ds18b20 非阻塞写法

ds18b20 非阻塞写法
DS18B20是一种数字温度传感器,它可以通过一种非阻塞的方
式进行读取。
非阻塞写法通常指的是一种编程技术,可以在不阻塞
程序执行的情况下进行数据读取或写入操作。
在使用DS18B20传感
器时,非阻塞写法可以提高程序的响应速度和效率。
在Arduino或其他类似的嵌入式系统中,可以使用以下步骤实
现DS18B20的非阻塞读取:
1. 初始化DS18B20传感器,首先,需要初始化DS18B20传感器,包括设置引脚和其他相关参数。
2. 发送读取命令,使用非阻塞的方式发送读取温度的命令到
DS18B20传感器。
3. 检查读取状态,在非阻塞的情况下,可以通过轮询的方式检
查DS18B20传感器的读取状态,以确定是否已经完成读取操作。
4. 读取温度数据,当DS18B20传感器完成温度数据的读取时,
可以通过非阻塞的方式获取温度数据。
5. 处理温度数据,最后,可以对获取的温度数据进行进一步处
理或应用,比如进行温度转换或者在程序中使用这些数据。
使用非阻塞的方式读取DS18B20传感器的温度数据可以确保程
序在等待传感器响应的同时可以执行其他任务,提高了程序的并发
性和效率。
同时,需要注意在编程中合理处理读取状态和错误处理,以确保数据的准确性和程序的稳定性。
总的来说,采用非阻塞的方式读取DS18B20传感器的温度数据
可以提高程序的效率和响应速度,适用于需要同时处理多个任务的
嵌入式系统和应用场景。
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温度传感器使用手册一、传感器实物图二、引脚说明(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);}}。
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温度传感器使⽤简介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)报警搜索。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
外接电源工. 作方式
6
锐志RZ-51V2.0开发板18B20连接示意图
(因为我们开发板上P0—P3口均有上拉电阻 所以此处没有画出)
.
7
DS18B20内部构成
DS18B20 内部结构主要由四部分组成: 64 位光刻 ROM 、温度传感器、非挥发的温度 报警触发器 TH 和 TL 、配置寄存器。
温度的低八位数据 温度的高八位数据 高温阀值 低温阀值 保留 保留 计数剩余值 每度计数值 CRC 校验
.
0 1 2 3 4 5 6 7 8
11
DS18B20的工作时序
DS18B20的一线工作协议流程是:
初始化→ROM操作指令→存储器操作指令→数据传输。
读时序
.
12
9
其中配置寄存器的格式如下: 低五位一直都是"1",TM是测试模式位,用于设置DS18B20在
工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置 分辨率,如下图所示:(DS18B20出厂时被设置为12位)
配置寄存器与分辨率关系表
.
10
高速暂存存储器由9个字节组成,当温度转换命令发布后,经转换所得的温度值以二字节补 码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据, 读取时低位在前,高位在后,对应的温度计算:当符号位S=0时,直接将二进制位转换 为十进制;当S=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 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电 压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址 序列码。 64 位光刻 ROM 的排列是:开始 8 位(地址: 28H )是产品类型标号,接着 的 48 位是该 DS18B20 自身的序列号,并且每个 DS18B20 的序列号都不相同,因此它 可以看作是该 DS18B20 的地址序列码;最后 8 位则是前面 56 位的循环冗余校验码 ( CRC=X8+X5+X4+1 )。由于每一个 DS18B20 的 ROM 数据都各不相同,因此微控 制器就可以通过单总线对多个 DS18B20 进行寻址,从而实现一根总线上挂接多个 DS18B20 的目的。
.
4
DS18B20管脚排列
DS18B20的管脚排列 1. GND为电源 地; 2. DQ为数字信号输入/输出端; 3. VDD为外接供电电源输入端 (在寄生电源接线方式时接地,
.
5
寄生电源工作方式 (电源从IO口上获得)
注意:当温度高于 100℃ 时,不能使用寄生电源,因为此时 器件中较大的漏电流会使总线不能可靠检测高低电平,从而导致
.
8
DS18B20中的温度传感器完成对温度的测量,用16位二进制形式提供,形式表达,其中S 为符号位。
例 如+125℃的数字输出为07D0H (正温度 直接吧16进制数转成10进制即得到温度值 ) -55℃的数字输出为 FC90H。 (负温度 把得到的16进制数 取反后 加1 再转成10进制数)
.
初始化时序
主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后 的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。 若无低电平出现一直都是高电平说明总线上无器件应答。
做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低 电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微 秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。
单总线数字温度传感器 DS18B20
.
1
单线总线特点
单总线即只有一根数据线,系统中的数据 交换,控制都由这根线完成。
单总线通常要求外接一个约为 4.7K—10K 的 上拉电阻,这样,当总线闲置时其状态为 高电平。
.
2
DS18B20的特点
DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器
.
13
对DS18B20的写和读操作
接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节, 接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0 和读1的。
.
3
DS18B20内部结构如图所示,
主要由4部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置 寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作 是该DS18B20的地址 序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码 (CRC=X^8+X^5+X^4+1)。 ROM的作用是使每一个DS18B20都各不相同,这样就 可以实现一根总线上挂接多个DS18B20的目的。