DS18B20原理及程序编写
DS18B20+LCD(原理图+汇编程序)
;****************************************************************************** ***;****************************************************************************** **;* 描述: *;* DS18B20温度控制1602LCD显示*;**;* 使用方法参考readme.txt文档*;**;**;****************************************************************************** ***;****************************************************************************** **TEMP_ZH DATA 24H ;实时温度值存放单元TEMPL DATA 25H ;TEMPH DATA 26H ;TEMP_TH DATA 27H ;高温报警值存放单元TEMP_TL DATA 28H ;低温报警值存放单元TEMPHC DATA 29H ;TEMPLC DATA 2AHK1 EQU P1.4K2 EQU P1.5K3 EQU P1.6K4 EQU P1.7BEEP EQU P3.7RELAY EQU P1.3LCD_X EQU 2FH ;LCD 地址变量LCD_RS EQU P2.0LCD_RW EQU P2.1LCD_EN EQU P2.2flag1 equ 20H.0 ;DS18B20是否存在标记KEY_UD EQU 20H.1 ;设定KEY 的UP与DOWN 标记date_line equ p3.3;=====================================================ORG 0000HJMP MAINORG 0030HMAIN: MOV SP,#60HMOV A,#00HMOV R0,#20H ;将20H-2FH 单元清零MOV R1,#10HCLEAR: MOV @R0,AINC R0DJNZ R1,CLEARCALL SET_LCDCALL RE_18B20start: CALL RESET ;18B20复位子程序JNB FLAG1,START1 ;DS1820不存在CALL MENU_OKCALL READ_E2CALL TEMP_BJ ;显示温度标记JMP START2START1: CALL MENU_ERRORCALL TEMP_BJ ;显示温度标记JMP $START2:CALL RESETJNB FLAG1,START1 ;DS1820不存在MOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#44H ; 发出温度转换命令CALL WRITECALL RESETMOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#0BEH ; 发出读温度命令CALL WRITECALL READcall CONVTEMPCall DISPBCDCALL CONVCALL TEMP_COMPCALL PROC_KEY ; 键扫描SJMP START2;-----------------------------------------------------PROC_KEY:JB K1,PROC_K1 ; 按键K1处理CALL BEEP_BLJNB K1,$MOV DPTR,#M_ALAX1MOV A,#1CALL LCD_PRINTCALL LOOK_ALARMJB K3,$CALL BEEP_BLJMP PROC_K2PROC_K1: ; 按键K2处理JB K2,PROC_ENDCALL BEEP_BLJNB K2,$MOV DPTR,#RESET_A1MOV A,#1CALL LCD_PRINTCALL SET_ALARMCALL RE_18B20 ;将设定的TH,TL值写入DS18B20内CALL WRITE_E2PROC_K2:CALL MENU_OKCALL TEMP_BJPROC_END:RET;============================================;设定报警值TH、TL;============================================SET_ALARM:;CALL RESET_ALARMCALL LOOK_ALARMAS0:JB K1,AS00CALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWN 标记AS00: JB 20H.1,ASZ01 ;20H.1=1,UPJMP ASJ01 ;20H.1=0,DOWNASZ01: JB K2,ASZ02 ;TH值调整(增加)CALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: CALL LOOK_ALARMMOV R5,#10CALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03 ;TL值调整(增加)CALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00HASZ021: CALL LOOK_ALARM ;MOV R5,#10CALL DELAYJMP ASZ02ASZ03: JB K4,AS0 ;确定调整OKCALL BEEP_BLJNB K4,$RETASJ01:JB K2,ASJ02 ;TH值调整(减少)CALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011JMP ASJ022ASJ011: CALL LOOK_ALARMMOV R5,#10CALL DELAYJMP AS0ASJ02: JB K3,ASJ03 ;TL值调整(减少)CALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: CALL LOOK_ALARM ;MOV R5,#10CALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRESET_ALARM:MOV DPTR,#RESET_A1 ;指针指到显示信息区MOV A,#1 ;显示在第一行CALL LCD_PRINTRETRESET_A1:DB "RESET ALERT CODE";==================================================== ;实际温度值与标记温度值比较子程序;==================================================== TEMP_COMP:MOV A,TEMP_THSUBB A,TEMP_ZH ;减数>被减数,则JC CHULI1 ;借位标志位C=1,转MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC CHULI2 ;借位标志位C=1,转MOV DPTR,#BJ5CALL TEMP_BJ3CLR RELAY ;继电器吸合RETCHULI1:MOV DPTR,#BJ3CALL TEMP_BJ3SETB RELAY ;继电器关闭CALL BEEP_BLRETCHULI2:MOV DPTR,#BJ4CALL TEMP_BJ3CALL BEEP_BLRET;-----------------------------------------TEMP_BJ3:MOV A,#0CEHCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3:DB ">H"BJ4:DB "<L"BJ5:DB " !";================================================== ;显示温度标记子程序;================================================== TEMP_BJ:MOV A,#0CBHCALL WCOMMOV DPTR,#BJ1 ;指针指到显示消息MOV R1,#0MOV R0,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1:DB 00H,"C";================================================= MENU_OK:MOV DPTR,#M_OK1 ;指针指到显示消息MOV A,#1 ;显示在第一行CALL LCD_PRINTMOV DPTR,#M_OK2 ;指针指到显示消息MOV A,#2 ;显示在第一行CALL LCD_PRINTRETM_OK1:DB " DS18B20 OK ",0M_OK2:DB " TEMP: ",0;-----------------------------------------------MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息1MOV A,#1 ;显示在第一行CALL LCD_PRINTMOV DPTR,#M_ERROR2 ;指针指到显示消息1MOV A,#2 ;显示在第一行CALL LCD_PRINTRETM_ERROR1:DB " DS18B20 ERROR ",0M_ERROR2:DB " TEMP: ---- ",0;==================================================== reset: setb date_linenopclr date_linemov r0,#6bh ;主机发出延时复位低脉冲mov r1,#04htsr1: djnz r0,$mov r0,#6bhdjnz r1,tsr1setb date_line ;然后拉高数据线nopnopnopmov r0,#32htsr2: jnb date_line,tsr3 ;等待DS18B20回应djnz r0,tsr2jmp tsr4 ; 延时tsr3: setb flag1 ; 置标志位,表示DS1820存在jmp tsr5tsr4: clr flag1 ; 清标志位,表示DS1820不存在jmp tsr7tsr5: mov r0,#06bhtsr6: djnz r0,$ ; 时序要求延时一段时间tsr7: setb date_lineret;=======================================================RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#4EH ;写暂存寄存器LCALL WRITEMOV A,TEMP_TH ;TH(报警上限)LCALL WRITEMOV A,TEMP_TL ;TL(报警下限)LCALL WRITEMOV A,#7FH ;12位精确度LCALL WRITERET;------------------------------------------------------------WRITE_E2:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#48H ;把暂存器里的温度报警值拷贝到EEROMLCALL WRITERET;--------------------------------------------------------------READ_E2:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器CALL WRITERET;--------------------------------------------------------------;将自定义字符写入LCD1602的CGRAM中;--------------------------------------------------------------STORE_DATA:MOV A,#40HCALL WCOMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA:MOV A,R3MOVC A,@A+DPTRCALL WDATA ;写入数据INC R3DJNZ R2,S_DATARETD_DATA:DB 0CH,12H,12H,0CH,00H,00H,00H,00H;============================================================== write: mov r2,#8 ;一共8位数据CLR Cwr1:clr date_line ;开始写入DS18B20总线要处于复位(低)状态mov r3,#07djnz r3,$ ;总线复位保持16微妙以上rrc a ;把一个字节DATA 分成8个BIT环移给Cmov date_line,c ;写入一个BITmov r3,#3CHdjnz r3,$ ;等待100微妙setb date_line ;重新释放总线nopdjnz r2,wr1 ;写入下一个BITsetb date_lineret;--------------------------------------------------------------------read: mov r4,#4 ; 将温度低位、高位、TH、TL从DS18B20中读出mov r1,#TEMPL ; 存入25H、26H、27H、28Hre00: mov r2,#8re01: clr cysetb date_linenopnopclr date_line ;读前总线保持为低nopnopnopsetb date_line ;开始读总线释放mov r3,#09 ;延时18微妙djnz r3,$mov c,date_line ;从DS18B20总线读得一个BITmov r3,#3CHdjnz r3,$ ;等待100微妙rrc a ;把读得的位值环移给Adjnz r2,re01 ;读下一个BITmov @r1,ainc r1djnz r4,re00ret;*****************************************************; 处理温度BCD 码子程序;**************************************************** CONVTEMP: MOV A,TEMPH ;判温度是否零下ANL A,#80HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,ASJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ;+TEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分BCDMOV A,TEMPL ;整数部分ANL A,#0F0H ;取出高四位SWAP AMOV TEMPL,AMOV A,TEMPH ;取出低四位ANL A,#0FHSWAP AORL A,TEMPL ;重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW = 十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI = 个位数BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEMPC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI = 百位数BCDANL A,#0FHORL A,R4MOV TEMPHC,ATEMPC12: RET;---------------------------------------------------------------HEX2BCD1:MOV B,#064H ;十六进制-> BCDDIV AB ;B= A % 100MOV R4,A ;R7 = 百位数MOV A,#0AHXCH A,BDIV AB ;B = A % BSWAP AORL A,BRET;-------------------------------------------------------------; 小数部分码表;------------------------------------------------------------- TEMPDOTTAB:DB 00H,00H,01H,01H,02H,03H,03H,04HDB 05H,05H,06H,06H,07H,08H,08H,09H;===================================================== LOOK_ALARM:MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2 ;显示在第二行CALL LCD_PRINTMOV A,#0C6HCALL TEMP_BJ1MOV A,TEMP_TH ;加载TH数据MOV LCD_X,#3 ;设置位置CALL SHOW_DIG2H ;显示数据MOV A,#0CEHCALL TEMP_BJ1MOV A,TEMP_TL ;加载TL数据MOV LCD_X,#12 ;设置位置CALL SHOW_DIG2L ;显示数据RET;--------------------------------------------M_ALAX1:DB " LOOK ALERT CODE",0M_ALAX2:DB "TH: TL: ",0;--------------------------------------------TEMP_BJ1:CALL WCOMMOV DPTR,#BJ2 ;指针指到显示信息区MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRCALL WDATAINC R1DJNZ R0,BBJJ2RETBJ2:DB 00H,"C";---------------------------------------------------SHOW_DIG2H: ;在LCD 的第二行显示数字MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HCALL LCDP2RETSHOW_DIG2L: ;在LCD 的第二行显示数字MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HCALL LCDP2RET;-------------------------------------------------------------;显示区BCD 码温度值刷新子程序;-------------------------------------------------------------DISPBCD:MOV A,TEMPLCANL A,#0FHMOV 70H,A ;小数位MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;个位MOV A,TEMPHCANL A,#0FHMOV 72H,A ;十位MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;百位MOV A,TEMPHCANL A,#0F0HCJNE A,#010H,DISPBCD0SJMP DISPBCD2DISPBCD0: MOV A,TEMPHCANL A,#0FHJNZ DISPBCD2 ;十位数是0MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号DISPBCD2: RET;========================================================== ; LCD 1602 显示子程序;========================================================== CONV:MOV A,73H ;加载百位数据MOV LCD_X,#6 ;设置位置CJNE A,#1,CONV1JMP CONV2CONV1: MOV A,#" "MOV B,LCD_XCALL LCDP2JMP CONV3CONV2: CALL SHOW_DIG2 ;显示数据CONV3: INC LCD_X ;mov a,72h ;十位CALL SHOW_DIG2inc LCD_Xmov a,71h ;个位CALL SHOW_DIG2inc LCD_XMOV A,#'.'MOV B,LCD_XCALL LCDP2MOV A,70h ;加载小数点位INC LCD_X ;设置位置CALL SHOW_DIG2 ;显示数据RET;-------------------------------------------------------SHOW_DIG2: ;在LCD 的第二行显示数字ADD A,#30HMOV B,LCD_XCALL LCDP2RET;---------------------------------------------------------LCDP2: ;在LCD的第二行显示字符PUSH ACC ;MOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址CALL WCOM ;写入命令POP ACC ;由堆栈取出ACALL WDATA ;写入数据RET;---------------------------------------------------------SET_LCD: ;对LCD 做初始化设置及测试CLR LCD_ENCALL INIT_LCD ;初始化LCDCALL STORE_DATA ;将自定义字符存入LCD的CGRAMRETINIT_LCD: ;8位I/O控制LCD 接口初始化MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMcall delay1MOV A,#38HCALL WCOMcall delay1MOV A,#38HCALL WCOMcall delay1MOV A,#0CH ;开显示,显示光标,光标不闪烁CALL WCOMcall delay1MOV A,#01H ;清除LCD 显示屏CALL WCOMcall delay1RET;==================================================CLR_LINE1: ;清除LCD的第一行字符MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;MOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDCALL WDATA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;==================================================LCD_PRINT: ;在LCD的第一行或第二行显示字符CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置LCD 的第二行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD 的第二行地址CALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: CALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;=========================================CLR_LINE: ;清除该行LCD 的字符MOV R0,#24CL1: MOV A,#' 'CALL WDATADJNZ R0,CL1RETDE: MOV R7,#250DJNZ R7,$RET;============================================WCOM: ;以8位控制方式将命令写至LCD MOV P0,A ;写入命令CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲CLR LCD_RWSETB LCD_ENACALL DELAY1CLR LCD_ENRET;=============================================WDATA: ;以8位控制方式将数据写至LCD MOV P0,A ;写入数据SETB LCD_RSCLR LCD_RWSETB LCD_ENCALL DECLR LCD_ENCALL DERET;=============================================;PRINT A CHAR ON LINE 1;A=ASC DATA, B=LINE X POS;==============================================LCDP1: ;在LCD的第一行显示字符PUSH ACC ;MOV A,B ;设置显示地址ADD A,#80H ;设置LCD的第一行地址CALL WCOM ;写入命令POP ACC ;由堆栈取出ACALL WDATA ;写入数据RET;============================================== BEEP_BL:MOV R6,#100BL2: CALL DEX1CPL BEEPDJNZ R6,BL2MOV R5,#10CALL DELAYRETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RETDELAY: ;(R5)*延时10MSMOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: ;延时5MSMOV R6,#25DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RET;================================================ END。
DS18B20原理及程序编写
DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。
内部有64位唯一的ID编码。
工作电压从3.0~5.5V。
测量温度范围从-55℃~125℃。
最高±0.0625℃分辩率。
其内部结构如下图所示。
DS18B20的核心功能是直接数字温度传感器。
温度传感器可以配置成9、10、11和12位方式。
相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。
默认的分辨率为12位。
DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。
主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。
接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。
如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。
DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。
地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。
DS18B20内部寄存器映射如下图所示。
配置寄存器的格式如表2和表3所示。
DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。
//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。
DS18B20的工作原理
DS18B20的工作原理DS18B20是一种数字温度传感器,具有高精度和广泛的应用范围。
它采用单总线接口进行通信,可以直接与微处理器或者其他数字设备连接。
下面将详细介绍DS18B20的工作原理。
1. 原理概述DS18B20采用了数字温度传感器的工作原理,通过测量温度对应的电压值来获取温度信息。
它内部集成为了温度传感器、模数转换器和数据存储器,可以直接输出数字信号。
2. 温度传感器DS18B20使用了特殊的温度传感器,这个传感器是由一对金属导线组成的,其中一个导线是纯铜,另一个导线是由铜和镍合金组成的。
当温度发生变化时,导线的电阻值也会发生变化,通过测量电阻值的变化可以得到温度信息。
3. 单总线接口DS18B20使用单总线接口进行通信,这意味着它只需要一个引脚来连接到主控设备。
单总线接口可以减少连接线的数量,简化电路设计。
4. 工作原理DS18B20的工作原理如下:- 当主控设备发送开始信号时,DS18B20会进入工作状态,并开始测量温度。
- DS18B20将温度转换成数字信号,并将其存储在内部的数据存储器中。
- 主控设备发送读取命令后,DS18B20会将存储的温度值发送给主控设备。
- 主控设备接收到温度值后,可以进行进一步的处理和显示。
5. 精度和分辨率DS18B20具有高精度和可调节的分辨率。
它可以提供从9位到12位的温度测量分辨率,分辨率越高,测量精度越高。
例如,当分辨率设置为12位时,温度测量精度可以达到±0.0625°C。
6. 供电方式DS18B20可以通过主控设备提供的电源进行供电,也可以使用独立的电源。
它的工作电压范围为3V至5.5V,电流消耗较低,适合在低功耗应用中使用。
7. 应用领域DS18B20广泛应用于各种需要温度测量的领域,例如:- 家用电器:空调、冰箱、洗衣机等。
- 工业自动化:温度监测和控制系统。
- 农业:温室控制、畜牧业等。
- 汽车电子:发动机温度监测、空调系统等。
DS18B20温度传感器设计原理图及c程序代码
/*******************代码部分**********************//*************** writer:shopping.w ******************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit DQ = P3^3;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar code Temp_Disp_Title[]={"Current Temp : "};uchar Current_Temp_Display_Buffer[]={" TEMP: "};uchar code Temperature_Char[8] ={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};uchar code df_Table[]=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};uchar CurrentT = 0;uchar Temp_Value[]={0x00,0x00}; uchar Display_Digit[]={0,0,0,0};bit DS18B20_IS_OK = 1;void DelayXus(uint x){uchar i;while(x--){for(i=0;i<200;i++);}}bit LCD_Busy_Check(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;return result;}void Write_LCD_Command(uchar cmd) {while(LCD_Busy_Check());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void Write_LCD_Data(uchar dat){while(LCD_Busy_Check());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void LCD_Initialise(){Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);}void Set_LCD_POS(uchar pos){Write_LCD_Command(pos|0x80); }void Delay(uint x){while(--x);}uchar Init_DS18B20(){uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);DQ = 1;return status;}uchar ReadOneByte(){uchar i,dat=0;DQ = 1;_nop_();for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0X80;Delay(30);DQ = 1;}return dat;}void WriteOneByte(uchar dat) {uchar i;for(i=0;i<8;i++){DQ = 0;DQ = dat& 0x01;Delay(5);DQ = 1;dat >>= 1;}}void Read_Temperature(){if(Init_DS18B20()==1)DS18B20_IS_OK=0;else{WriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);Temp_Value[0] = ReadOneByte();Temp_Value[1] = ReadOneByte();DS18B20_IS_OK=1;}}void Display_Temperature(){uchar i;uchar t = 150, ng = 0;if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1] = ~Temp_Value[1];Temp_Value[0] = ~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng = 1;}Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);Display_Digit[3] = CurrentT/100;Display_Digit[2] = CurrentT%100/10;Display_Digit[1] = CurrentT%10;Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';Current_Temp_Display_Buffer[10] = '.';Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';if(Display_Digit[3] == 0)Current_Temp_Display_Buffer[7] = ' ';if(Display_Digit[2] == 0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8] = ' ';if(ng){if(Current_Temp_Display_Buffer[8] == ' ')Current_Temp_Display_Buffer[8] = '-';else if(Current_Temp_Display_Buffer[7] == ' ')Current_Temp_Display_Buffer[7] = '-';elseCurrent_Temp_Display_Buffer[6] = '-';}Set_LCD_POS(0x00);for(i=0;i<16;i++){Write_LCD_Data(Temp_Disp_Title[i]);}Set_LCD_POS(0x40);for(i=0;i<16;i++){Write_LCD_Data(Current_Temp_Display_Buffer[i]);}Set_LCD_POS(0x4d);Write_LCD_Data(0x00);Set_LCD_POS(0x4e);Write_LCD_Data('C');}void main(){LCD_Initialise();Read_Temperature();Delay(50000);Delay(50000);while(1){Read_Temperature();if(DS18B20_IS_OK)Display_Temperature();DelayXus(100);}}。
DS18B20的工作原理
DS18B20的工作原理DS18B20是一种数字温度传感器,可以通过一根单线串行总线与微处理器或者其他设备进行通信。
它采用了数字温度传感技术,可以准确地测量环境温度,并将温度数据以数字形式传输给主设备。
DS18B20的工作原理如下:1. 温度测量原理:DS18B20使用了一个精确的温度传感器,该传感器基于温度对半导体材料电阻值的影响。
在DS18B20中,温度传感器是由一对金属电极和一个细丝电阻器组成的。
当温度升高时,电阻值增加,反之亦然。
通过测量电阻值的变化,可以确定环境温度。
2. 单线串行总线通信:DS18B20通过单线串行总线与主设备通信,这意味着只需要一根数据线就可以实现数据传输。
通信过程中,主设备发送指令给DS18B20,DS18B20将温度数据以数字形式传输回主设备。
这种通信方式简化了硬件连接,降低了成本。
3. 温度转换和精度:DS18B20将温度数据转换为数字形式,并以12位精度表示。
它可以测量的温度范围为-55℃至+125℃,精度为±0.5℃。
DS18B20还具有可编程的分辨率功能,可以选择9位、10位、11位或者12位的温度分辨率。
4. 供电和工作模式:DS18B20可以通过总线路线提供供电,也可以通过外部电源提供供电。
它还具有多种工作模式,包括连续转换模式和温度警报模式。
在连续转换模式下,DS18B20可以周期性地测量温度并发送数据。
在温度警报模式下,DS18B20可以设置上下限温度阈值,当温度超过或者低于设定阈值时,会触发警报信号。
总结:DS18B20是一种数字温度传感器,采用了数字温度传感技术。
它通过测量温度对半导体材料电阻值的影响来测量环境温度,并将温度数据以数字形式传输给主设备。
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单线数字温度传感器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 单片机数码管显示原理图和程序
WriteOneChar(0xCC);//跳过读序号列号得操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就就是温度/
delay(5);
a=ReadOneChar(); //读取温度值低位/
b=ReadOneChar();//读取温度值高位/
delay1(5);
wx3=1;
wx4=0;
P0=table[12];//显示C字符
delay1(5);
wx4=1;
}
void main()
{
while(1)
{
ReadTemperature();
wenduxianshi();
}
}
{
unsigned char x=0;
DQ=1;//DQ复位ds18b20通信端口
delay(8);//稍做延时
DQ = 0;//单片机将DQ拉低
delay(80);//精确延时大于 480us
DQ=1;//拉高总线
delay(4);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(20);
if(DQ)
dat|=0x80;//
delay(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
voidWriteOneChar(unsignedchardat)
{
unsigned char i=0;
for (i=8;i>0;i——)
最近天气热了,想要就是做个能显示温度得小设备就好了,于就是想到DIY个电子温度计,网上找了很多资料,结合自己得材料,设计了这个用单片机控制得实时电子温度计。作为单片机小虾得我做这个用了2天时间,当然就是下班后,做工不行见谅了.
温度传感器ds18b20实验报告
温度传感器ds18b20实验报告温度传感器DS18B20实验报告引言:温度传感器是一种用于测量环境温度的设备,它在许多领域都有广泛的应用,如气象学、工业控制、冷链物流等。
本实验报告将介绍DS18B20温度传感器的原理、实验装置和实验结果,并对其性能进行评估。
一、实验原理DS18B20温度传感器是一种数字温度传感器,采用单总线接口进行通信。
它采用了最新的数字温度传感器技术,具有高精度、低功耗、抗干扰等特点。
其工作原理是利用温度对半导体材料电阻值的影响,通过测量电阻值的变化来确定温度。
二、实验装置本实验使用的实验装置包括DS18B20温度传感器、Arduino开发板、杜邦线和计算机。
Arduino开发板用于读取传感器的温度数据,并通过串口将数据传输到计算机上进行处理和显示。
三、实验步骤1. 连接电路:将DS18B20温度传感器的VCC引脚连接到Arduino开发板的5V 引脚,GND引脚连接到GND引脚,DQ引脚连接到Arduino开发板的数字引脚2。
2. 编写代码:使用Arduino开发环境编写代码,通过OneWire库和DallasTemperature库读取DS18B20传感器的温度数据。
3. 上传代码:将编写好的代码上传到Arduino开发板上。
4. 监测温度:打开串口监视器,可以看到DS18B20传感器实时的温度数据。
四、实验结果在实验过程中,我们将DS18B20温度传感器放置在不同的环境中,记录了其测得的温度数据。
实验结果显示,DS18B20温度传感器具有较高的精度和稳定性,能够准确地测量环境温度。
五、实验评估本实验评估了DS18B20温度传感器的性能,包括精度、响应时间和抗干扰能力。
实验结果表明,DS18B20温度传感器具有较高的精度,能够在0.5℃的误差范围内测量温度。
响应时间较快,能够在毫秒级别内完成温度测量。
同时,DS18B20温度传感器具有较好的抗干扰能力,能够在干扰环境下保持稳定的测量结果。
DS18B20的工作原理
DS18B20的工作原理引言概述:DS18B20是一种数字温度传感器,具有精确度高、体积小、功耗低等特点,被广泛应用于各种温度测量场景。
本文将详细介绍DS18B20的工作原理及其相关特点。
一、温度传感原理1.1 热敏电阻原理DS18B20采用热敏电阻作为温度传感元件。
热敏电阻的电阻值随温度的变化而变化,其本质是利用材料在温度变化下的电阻变化特性来测量温度。
1.2 热敏电阻的特性热敏电阻的电阻值与温度呈负相关关系,即温度升高时电阻值下降,温度降低时电阻值上升。
这种特性使得热敏电阻可以通过测量电阻值的变化来间接测量温度。
1.3 DS18B20的温度测量原理DS18B20通过将热敏电阻与一个精确的参考电阻进行比较,利用电阻的变化来测量温度。
通过测量电阻值的变化,DS18B20可以准确地计算出当前的温度值,并以数字信号的形式输出。
二、数字温度传感器的工作原理2.1 单总线通信DS18B20采用单总线通信方式,即通过一个引脚同时实现数据传输和电源供应。
这种通信方式简化了电路设计,提高了系统的可靠性。
2.2 温度转换过程DS18B20在进行温度转换时,会向传感器发送一个转换命令。
传感器接收到命令后,会进行温度测量,并将测量结果存储在内部寄存器中。
用户可以通过读取寄存器的方式获取温度值。
2.3 精确度和分辨率DS18B20具有高精确度和可调节的分辨率。
其精确度可以达到±0.5℃,分辨率可调节为9位、10位、11位或者12位,分别对应0.5℃、0.25℃、0.125℃和0.0625℃的分辨率。
三、DS18B20的电气特性3.1 供电电压DS18B20的供电电压范围为3V至5.5V,可以适应不同的电源系统。
3.2 通信速率DS18B20的通信速率可以选择为标准速率(最高16.25kbps)或者高速速率(最高100kbps),可以根据实际需求进行设置。
3.3 工作温度范围DS18B20的工作温度范围为-55℃至+125℃,可以适应各种极端环境下的温度测量需求。
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温度传感器是一种数字温度传感器,它基于热电效
应来测量温度。
该传感器由一个精密的温度传感器和一个数字转换器组成。
以下是DS18B20温度传感器的工作原理:
1. 热电效应:DS18B20温度传感器利用热电效应来测量温度。
当两个不同材料的接触点形成温度梯度时,就会产生电动势。
传感器中的温度传感器部分采用的材料对温度变化非常敏感,因此产生的电动势可以反映出温度的变化。
2. 温度传感器:DS18B20温度传感器中的温度传感器部分是
由一个特殊的材料制成的。
该材料具有温度敏感性,当温度变化时,该材料会产生电动势。
这个电动势可以通过传感器的引脚进行读取和转换。
3. 数字转换器:DS18B20温度传感器具有内置的数字转换器。
这个数字转换器可以将从温度传感器获得的电压信号转换为数字信号。
数字信号可以直接读取和处理,而无需进行模拟信号转换。
4. 串行总线通信:DS18B20温度传感器通过一种称为One-
Wire总线的串行通信协议与主控制器进行通信。
传感器和主
控制器之间只需使用单一的数据线进行通信,使得传感器的连接变得简单方便。
总结起来,DS18B20温度传感器工作原理是利用热电效应测
量温度,并通过温度传感器和数字转换器来转换和读取温度信号。
该传感器通过One-Wire总线与主控制器进行通信。
DS18B20的工作原理
DS18B20的工作原理引言概述:DS18B20是一种数字温度传感器,广泛应用于各种领域,包括气象、工业自动化、电子设备等。
本文将详细介绍DS18B20的工作原理,帮助读者更好地理解该传感器的工作机制。
一、传感器基本原理1.1 温度测量原理DS18B20通过测量温度对应的电阻值来实现温度测量。
其内部集成了一个精确的温度传感器,该传感器的电阻值与温度呈线性关系。
通过测量电阻值,可以准确地获取温度信息。
1.2 电压与温度转换DS18B20的工作电源一般为3V到5V的电压。
传感器内部的模拟电路将输入的电压转换为与温度成比例的数字信号。
这个转换过程通过一系列的电路和算法实现,确保了温度测量的准确性和稳定性。
1.3 数字信号输出DS18B20通过一条单线总线输出数字信号。
该总线采用了特殊的通信协议,使得多个传感器可以共享同一条总线。
传感器通过发送一系列特定的命令和数据,将温度信息以数字信号的形式传输给主控设备。
二、传感器内部结构2.1 温度传感器DS18B20内部集成了一个温度传感器,该传感器采用了特殊的材料和结构,使其能够对温度变化非常敏感。
传感器的输出电阻与温度成线性关系,通过测量电阻值可以准确地获取温度信息。
2.2 模拟电路DS18B20内部的模拟电路负责将输入的电压转换为与温度成比例的模拟信号。
该电路包括放大器、滤波器和比较器等组件,通过精确的电路设计和校准,确保了温度测量的准确性和稳定性。
2.3 数字电路DS18B20内部的数字电路负责将模拟信号转换为数字信号,并通过总线输出给主控设备。
该电路包括模数转换器、通信接口和控制逻辑等组件,通过特殊的通信协议实现与主控设备的数据交互和温度信息的传输。
三、传感器工作流程3.1 初始化DS18B20在开始温度测量之前需要进行初始化操作。
初始化过程包括发送复位信号、搜索传感器和读取传感器信息等步骤。
通过初始化,主控设备可以识别出连接在总线上的DS18B20传感器。
DS18B20原理及应用实例(源程序+原理图+Proteus仿真)
2 / 13
2012 年 8 月 13 日星期一
举例如下:
4ቤተ መጻሕፍቲ ባይዱDS18B20 的初始化:
根据 DS18B20 的通讯协议,主机(单片机)控制 DS18B20 完成温度转换必须经过三个 步骤:每一次读写之前都要对 DS18B20 进行复位操作,复位成功后发送一条 ROM 指令, 最后发送 RAM 指令,这样才能对 DS18B20 进行预定的操作。复位要求主 CPU 将数据线下 拉 500 微秒,然后释放,当 DS18B20 收到信号后等待 16~60 微秒左右,后发出 60~240 微秒的存在低脉冲,主 CPU 收到此信号表示复位成功。 (1) 先将数据线 DQ 置高电平“1”。 (2) 延时(该时间要求的不是很严格,但是尽可能的短一点) (3) 数据线拉到低电平“0”。 (4) 延时 750 微秒(该时间的时间范围可以从 480 到 960 微秒) 。 (5) 数据线拉到高电平“1”。 (6) 延时等待(如果初始化成功则在 15 到 60 微妙时间之内产生一个由 DS18B20 所返回 的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使 程序进入死循环,所以要进行超时控制) 。 (7) 若 CPU 读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平 算起(第(5)步的时间算起)最少要 480 微秒。 (8) 将数据线再次拉高到高电平“1”后结束。 初始化程序如下: uchar Init_DS18B20() { uchar status; //status 为 DS18B20 返回的状态 DQ = 1; Delay(8); DQ = 0; Delay(90); DQ = 1;
8、DS18B20 应用举例(一)
如下图所示:DQ 通过 4.7K 上拉电阻外接正电源(由于单总线为开漏所以需要外接一 个 4.7K 的上拉电阻),并连接单片机 P3.3 口。 本例中,1602LCD 显示 DS18B20 所测量的外部温度,调节 DS18B20 模拟改变外界 温度时,新的温度将刷新显示在 LCD 上。
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温度传感器详解带c程序
00A2H
+0.5
0000 0000 0000 000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {
ds18b20详解及程序
最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。
DS18B20 产品的特点: (1)、只要求一个I/O 口即可实现通信。
(2)、在DS18B20 中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃; (5)、数字温度计的分辨率用户可以从9 位到12 位选择。
将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。
DS18B20引脚分布图DS18B20 详细引脚功能描述:1、GND 地信号;2、DQ数据输入出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5kΩ的上拉电阻.3、VDD可选择的VDD 引脚。
电压范围:3~5.5V; 当工作于寄生电源时,此引脚必须接地。
DS18B20存储器结构图暂存储器的头两个字节为测得温度信息的低位和高位字节;第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新;第9字节是前面8个字节的CRC检验值.配置寄存器的命令内容如下:MSBLSBR0和R1是温度值分辨率位, 按下表进行配置.默认出厂设置是R1R0 = 11, 即12位.温度值分辨率配置表4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低一位代表的温度值)12位分辨率时的两个温度字节的具体格式如下:低字节:高字节:其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:, 高字节不变....一些温度与转换后输出的数字参照如下:由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).DS18B20 的使用方法:由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
DS18B20的工作原理
DS18B20的工作原理DS18B20是一种数字温度传感器,常用于测量环境温度。
它采用单总线接口,具有高精度、低功耗和可靠性等特点。
下面将详细介绍DS18B20的工作原理。
1. 基本原理DS18B20采用了微处理器技术,内部集成了温度传感器和ADC(模数转换器),能够将温度转换为数字信号输出。
其工作原理基于半导体材料的温度特性,通过测量半导体材料的电阻值来计算温度。
2. 温度传感器DS18B20采用了精确度高的温度传感器,传感器的核心部分是一个由硅材料制成的温度感应器。
硅材料的电阻值随温度的变化而变化,通过测量电阻值的变化可以得到温度的信息。
3. 单总线接口DS18B20采用了单总线接口,即数据线(DQ)同时兼具供电和数据传输的功能。
通过单总线接口,可以实现多个DS18B20传感器的串联连接,从而方便进行温度的多点测量。
4. 工作原理DS18B20的工作原理如下:- 初始化:主机发送复位脉冲,DS18B20接收到复位脉冲后进行初始化操作。
- 通信:主机发送指令,DS18B20接收到指令后执行相应的操作,如温度转换、读取温度值等。
- 温度转换:DS18B20在接收到温度转换指令后,通过内部的温度传感器测量环境温度,并将温度转换为数字信号。
- 数据传输:DS18B20将转换后的温度值以序列的形式通过单总线接口发送给主机。
- 校验:主机接收到温度值后进行校验,确保数据的准确性。
5. 精度和分辨率DS18B20具有高精度和可调节的分辨率。
它可以实现0.5℃、0.25℃、0.125℃和0.0625℃四种分辨率的温度测量。
通过配置寄存器,可以根据需求选择不同的分辨率。
6. 供电方式DS18B20可以通过单总线接口直接从主机获取供电,也可以通过外部供电方式进行供电。
在从主机获取供电时,DS18B20的工作电流非常低,通常在1-1.5mA 之间。
7. 应用领域DS18B20广泛应用于温度测量和控制领域,如室内温度监测、恒温控制、气象站、冷链物流等。
DS18B20的工作原理
DS18B20的工作原理DS18B20是一种数字温度传感器,采用单总线接口进行通信。
它可以精确测量环境温度,并将温度值以数字形式传输给微控制器或其他设备。
DS18B20是一种广泛应用于工业自动化、家用电器、医疗设备等领域的温度传感器。
DS18B20的工作原理如下:1. 温度测量原理:DS18B20采用了基于半导体的温度测量原理。
它内部集成了温度传感器和模数转换器(ADC),可以将环境温度转换为数字信号。
DS18B20使用的是温度依赖的电阻器件,称为温度传感器。
当温度升高时,温度传感器的电阻值会发生变化,DS18B20利用这种变化来测量温度。
2. 单总线通信:DS18B20采用了单总线通信协议,即通过单根数据线进行数据传输。
这种通信方式简化了连接和控制的复杂性,只需使用一个引脚即可实现数据的传输和控制。
在单总线通信中,DS18B20作为从设备,由主控制器发出指令,DS18B20接收指令并返回温度数据。
3. 工作原理:DS18B20的工作原理可以分为三个步骤:初始化、温度转换和读取温度。
3.1 初始化:在通信开始前,主控制器需要发送初始化指令来识别和准备DS18B20。
初始化指令包括发送复位脉冲和读取DS18B20的存在脉冲。
复位脉冲使DS18B20进入准备接收指令的状态,存在脉冲用于检测DS18B20是否存在于总线上。
3.2 温度转换:初始化完成后,主控制器发送温度转换指令给DS18B20。
温度转换指令包括启动温度转换和等待转换完成。
DS18B20接收到指令后,开始测量环境温度,并将结果存储在内部寄存器中。
温度转换时间取决于DS18B20的分辨率设置,一般为750ms到12秒不等。
3.3 读取温度:温度转换完成后,主控制器发送读取温度指令给DS18B20。
DS18B20将温度值以数字形式传输给主控制器。
主控制器接收到温度数据后,可以进行进一步的处理和显示。
4. 分辨率设置:DS18B20支持多种温度分辨率设置,包括9位、10位、11位和12位。
DS18B20编程
uint8 read_byte(void)
{
uint8 tem=0;
uint8 i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();
tem=tem>>1;
DQ=0;
nops();
DQ=1;
nops();
if(DQ)
tem|=0x80;
delay_us(6);
write_byte(0x44); //发转换命令
}
/****************************
*读温度*
*****************************/
uint16 read_temp(void)
{
uint8 temp_data[2];
uint16 temp;
DS18B20_reset();
{
uint8 i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();
DQ=0;
nops();
DQ=byte & 0x01;
delay_us(6);//nops();
byte=byte>>1;
}
DQ=1;
delay_us(1);
}
/**********************
对DS18B20读1字节
ans=read_temp();
a=ans/10%10;
b=ans%10;
refresh_led();
}
{
DQ = 1;
delay_us(1);
DQ = 0;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。
内部有64位唯一的ID编码。
工作电压从3.0~5.5V。
测量温度范围从-55℃~125℃。
最高±0.0625℃分辩率。
其内部结构如下图所示。
DS18B20的核心功能是直接数字温度传感器。
温度传感器可以配置成9、10、11和12位方式。
相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。
默认的分辨率为12位。
DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。
主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。
接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。
如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。
DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。
地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。
DS18B20内部寄存器映射如下图所示。
配置寄存器的格式如表2和表3所示。
DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。
//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。
//** 使用时请注明出处。
//********************************************************************** #include <REG52.h>#ifndef UCHAR#define UCHAR unsigned char#endif#ifndef UINT#define UINT unsigned int#endifsbit DQ = P1^0; //DS18B20单总线引脚定义#include "DS18B20.h"#include "LED8.h"//********************************************************************** //函数功能:11us延时//输入参数:t :延时长度,单位11us//输出参数:无//********************************************************************** void _delay(UINT t){ //11usfor(;t>0;t--);}//********************************************************************** //函数功能:DS18B20复位操作函数//输入参数:无//输出参数:为1说明器件不存在,为0说明器件存在//**********************************************************************UCHAR _DS18B20Reset(void){DQ = 1;_delay(1);DQ = 0;_delay(50);DQ = 1;_delay(10);if(!DQ) {_delay(50);return 0;}else {return 1;}}//********************************************************************** //函数功能:DS18B20写操作函数//输入参数:待写入的数据//输出参数:无//********************************************************************** void _DS18B20Write(UCHAR d){UCHAR i;for(i=0;i<8;i++){DQ = 0;_delay(1);DQ = d&0x01; //最低位先发送出去_delay(4);DQ = 1;d >>=1;}}//********************************************************************** //函数功能:DS18B20读操作函数//输入参数:无//输出参数:读取的数据//********************************************************************** UCHAR _DS18B20Read(void){UCHAR i,d;d=0;for(i=0;i<8;i++){DQ = 0;d >>=1;_delay(1);DQ = 1;if(DQ){d|=0x80; //最低位先接收到}_delay(4);DQ = 1;}return d;}//********************************************************************** //函数功能:DS18B20读寄存器操作函数//输入参数:无//输出参数:读取的温度数据// 高8位为温度值整数部分// 低8位为温度值小数部分//********************************************************************** UINT DS18B20ReadTemp(void){static UCHAR TH,TL;UCHAR *pp;UINT TEM;static enum _s{s1,s11,s12,s2,s3,s4}s;bit EAflag;EAflag = EA;EA = 0;switch(s){case s1:while(_DS18B20Reset()){ //无芯片连接时,显示“no-18b20” pp = LED8GetRam();*pp++ =22;*pp++ =0;*pp++ =11;*pp++ =1;*pp++ =8;*pp++ =23;*pp++ =2;*pp++ =0;LED8Display();}s=s11;break;case s11:_DS18B20Write(0xCC); //跳过ROM操作命令_DS18B20Write(0xBE); //读中间寄存器s=s12;break;case s12:TL = _DS18B20Read();TH = _DS18B20Read();TH = (TH<<4)|(TL>>4);TL = (TL&0x0F);s=s2;break;case s2:_DS18B20Reset();_DS18B20Write(0xCC); //跳过ROM命令_DS18B20Write(0x44); //开始转换s=s3;break;case s3:if(DQ){ s=s1; }break;default:s = s1; break;}EA = EAflag;TEM=TH;TEM=(TEM<<8)+TL; return TEM;}。