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)报警搜索。
DS18B20使用方法
DS18B20的外形和内部结构
DS18B20内部结构主要由4部分组成:64位光刻ROM、温度传感器、非挥发的 温度报警触发器TH和TL、配置寄存器。DS18B20的外形及管脚排列如图所示。
DS18B20引脚定义如下: (1)DQ为数字信号输入/输出端。 (2)GND为电源地。 (3)VDD为外接供电电源输入端 (在寄生电源接线方式时接地)。
DS18B20外形及引脚排列图
DS18B20工作原理
DS18B20测温原理框图如图所示: DS18B20测温原理框图
图中低温度系数晶振的振荡频率受温度影响很小, 用于产生固定频率的脉冲信号送给计数器1。高温 度系数晶振随温度变化其振荡频率明显改变,所产 生的信号作为计数器2的脉冲输入。计数器1和温度 寄存器被预置在55℃所对应的一个基数值。计数 器1对低温度系数晶振产生的脉冲信号进行减法计 数,当计数器1的预置值减到0时,温度寄存器的值 将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数, 如此循环直到计数器2计数到0时,停止温度寄存器 值的累加,此时温度寄存器中的数值即为所测温度。 斜率累加器用于补偿和修正测温过程中的非线性, 其输出用于修正计数器1的预置值。
单总线的时序
One-Wire协议定义了复位脉冲、应答脉冲、写0、读0和读1时序等几种 信号类型。所有的单总线命令序列(初始化,ROM命令,功能命令) 都是由这些基本的信号类型组成的。在这些信号中,除了应答脉冲外, 其他均由主机发出同步信号,并且发送的所有命令和数据都是字节的低 位在前。
• 初始化时序
数字化温度传感器DS18B20
美国DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支 持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用 户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新 一代的DS18B20体积更小、更经济、更灵活。DS18B20测量温度范围为 55℃~+125℃。在10℃~+85℃范围内,精度为0.5℃。现场温度直接 以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
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 温度传感器使用手册
1) DS18B20 是DALLAS 公司生产的一线制数字温度传感器; 2) 具有3 引脚TO-92 小体积封装形式; 3) 温度测量范围为-55℃~+125℃; 4) 电源供电范围为3V~5.5V ; 5) 可编程为9 位~12 位数字表示;6) 测温分辨率可达0.0625℃,被测温度用符号扩展的16 位数字量方式串行输出;7) 其工作电源既可在远端引入,也可采用寄生电源方式产生;8) 多个DS18B20 可以并联到3 根(VDD、DQ 和GND)或2 根(利用DQ 线供电、GND)线上,CPU 只需一根端口线就能与总线上的多个串联的DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
TO-92封装的DS18B20DS18B20 的管脚排列及不同封装形式如图 2所示,DQ 为数字信号输入/输出端;GND 为电源地;VDD 为外接供电电源输入端(在寄生电源接线方式时接地,见),NC 表示无连接。
管脚图DS18B20内部结构如图3所示,主要由4 部分组成:64 位ROM 、温度传感器、非易失性存储的温度报警触发器TH 和TL 、配置寄存器。
DS18B20管脚DS18B20概述DS18B20内部结构图非常适用于远距离多点温度检测系统。
DQ-数据输入输出。
漏极开路1 线接口。
也在寄生电源模式时给设备提供电源。
访问DS18B20 的顺序如理初始化;DS18B20读写 连接图应用领域ROM 命令(接着是任何需要的数据交换);DS18B20 函数命令(接着是任何需要的数据交换)。
每一次访问DS18B20 时必须遵循这一顺序,如果其中的任何一步缺少或打乱它们的顺序,DS18B20 将不会响应。
(1)初始化时序所有与DS18B20 的通信首先必须初始化:控制器发出复位脉冲,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半导体可编程分辨率的单总线®数字温度计特征引脚排列l独特的单线接口仅需一个端口引脚进行通讯l每个器件有唯一的64位的序列号存储在内部存储器中l简单的多点分布式测温应用l无需外部器件l可通过数据线供电。
供电范围为3.0V到5.5V。
l测温范围为-55~+125℃(-67~+257℉)l在-10~+85℃范围内精确度为±5℃l温度计分辨率可以被使用者选择为9~12位l最多在750ms内将温度转换为12位数字l用户可定义的非易失性温度报警设置l报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件l与DS1822兼容的软件l应用包括温度控制、工业系统、消费品、温度计或任何热感测系统引脚说明GND -地DQ -数据I/OVDD -可选电源电压NC -无连接说明DS18B20数字温度计提供9-12位摄氏温度测量而且有一个由高低电平触发的可编程的不因电源消失而改变的报警功能。
DS18B20通过一个单线接口发送或接受信息,因此在中央处理器和DS18B20之间仅需一条连接线(加上地线)。
它的测温范围为-55~+125℃,并且在-10~+85℃精度为±5℃。
除此之外,DS18B20能直接从单线通讯线上汲取能量,除去了对外部电源的需求。
每个DS18B20都有一个独特的64位序列号,从而允许多只DS18B20同时连在一根单线总线上;因此,很简单就可以用一个微控制器去控制很多覆盖在一大片区域的DS18B20。
这一特性在HVAC环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。
详细的引脚说明表18引脚SOIC封装* TO-9封装符号说明5 1 GND 接地。
4 2 DQ 数据输入/输出引脚。
对于单线操作:漏极开路。
当工作在寄生电源模式时用来提供电源(建“寄生电源”节)。
3 3 VDD 可选的VDD引脚。
工作与寄生电源模式时VDD必须接地。
*所有上表未提及的引脚都无连接。
DS18B20使用教程
读取RAM内的温度数据。同样,这个操作也要接照三个步骤。 1、主机发出复位操作并接收DS18B20的应答(存在)脉冲。 2、主机发出跳过对ROM操作的命令(CCH)。 3、主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发 出的从第0一第8,共九个字节的数据。如果只想读取温度数据,那在 读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。同 样读取数据也是低位在前的。整个操作的总线状态如下图:
DS18B20 单线通信功能是分时完成的,他有严格的时隙概念,如果出现序列混乱, 1-WIRE 器件将不响应主机,因此读写时序很重要。系统对 DS18B20 的各种操作必 须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转 换必须经过以下 4 个步骤 : (1)每次读写前对 DS18B20 进行复位初始化。复位要求主 CPU 将数据线 下拉 500us ,然后释放, DS18B20 收到信号后等待 16us~60us 左右,然后发出 60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。 (2)发送一条 ROM 指令
DS18B20管脚排列
DS18B20的管脚排列 1. GND为电源 地; 2. DQ为数字信号输入/输出 端; 3. VDD为外接供电电源输入端 (在寄生电源接线方式时接地,
寄生电源工作方式 (电源从IO口上获得)
注意:当温度高于 100℃ 时,不能使用寄生电源,因为此时 器件中较大的漏电流会使总线不能可靠检测高低电平,从而导致 数据传输误码率的增大。
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存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十六进制数据 }
DS18B20的具体操作流程
DS18B20的具体操作流程
一,DS18B20的初始化
(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽可能的短一点)
(3)数据线拉到低电平“0”。
(4)延时750微秒(该时间的时间范围可以从480到960微秒)。
(5)数据线拉到高电平“1”。
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
二,DS18B20的写操作
(1)数据线先置低电平“0”。
(2)延时确定的时间为15微秒。
(3)按从低位到高位的顺序发送字节(一次只发送一位)。
(4)延时时间为45微秒。
(5)将数据线拉到高电平。
(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。
(7)最后将数据线拉高。
三,DS18B20的读操作
(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时15微秒。
(5)将数据线拉高“1”。
(6)延时15微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时30微秒。
- 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的目的。