DS18B20介绍、流程图和程序源代码_第1页
DS18B20介绍、流程图和程序源代码_第2页
DS18B20介绍、流程图和程序源代码_第3页
DS18B20介绍、流程图和程序源代码_第4页
DS18B20介绍、流程图和程序源代码_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DS18B20单线数字温度传感器DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器,体积更小、适用电压更宽、更经济。一线总线独特而且经济的特点,使用户可轻松地组建温度传感器网络,为测量系统的构建引入全新概念。DS18B20、 DS1822 “一线总线”数字化温度传感器同DS1820一样,支持“一线总线”接口,测量温度范围为-55°C+125°C,在-10+85°C范围内,精度为±0.5°C,而DS1822的精度较差为± 2°C 。现场温度直接以“一线总线”的数字方式传输,大大

2、提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。DS18B20可以程序设定912位的分辨率,精度为±0.5°C,分辨率设定,以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS1822与 DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更

3、多的选择,让我们可以构建适合自己的经济的测温系统。1、    DS18B20性能特点 图1  DS18B20引脚分布图DS18B20的性能特点:采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位),测温范围为-55-+125,测量分辨率为0.0625,内含64位经过激光修正的只读存储器ROM,适配各种单片机或系统机,用户可分别设定各路温度的上、下限,内含寄生电源。 2、    DS18B20内部结构 DS18B20内部结

4、构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。DS18B20的管脚排列如图1所示。64位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号,不同的器件地址序列号不同。  8位产品系列号48位产品序号8位CRC编码   DS18B20高速暂存器共9个存储单元,如表所示: 序号寄存器名称作    用序号寄存器名称作    用0温度低字节以16位补码形式存放4、5保留字节1、21温度高字节6计数器余值2TH/用户字节1存放温度上限7计数器/3

5、HL/用户字节2存放温度下限8CRCCRC校验   以12位转化为例说明温度高低字节存放形式及计算:12位转化后得到的12位数据,存储在18B20的两个高低两个8位的RAM中,二进制中的前面5位是符号位。如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度(等价说明:高8位字节的低3位和低8位字节的高4位组成温度整数值的二进制数;或者说:12位测量时,所测数值乘以0.0625(=1/16),即右移4位后去掉了二进制数的小数部分);如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625才能得到实际温度(等价说明:当温度小于0时,整数

6、部分就是各位取反,小数部分则是各位取反后加1)。 高8位SSSSS262524低8位232221202-12-22-32-4说明:温度测量分辨率有四种,即9位测量分辨率0.5;10位测量分辨率0.25;11位测量分辨率0.125;12位测量分辨率0.0625;912位的测量,无论采用哪种分辨率,温度整数的有效位均是表中2620;以12位为例:温度值二进制数十六进制数+1250000 0111 1101 000007D0H+25.06250000 0001 1001 00010191H+10.1250000 0000 1010 001000A2H+0.50000 0000 0000 100000

7、08H00000 0000 0000 00000000H-0.51111 1111 1111 1000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 0110 1111FF6FH-1251111 1100 1001 0000FC90H1、DS18B20控制方法 在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接5k左右的上拉电阻。DS18B20有六条控制命

8、令,如下表所示:指    令约定代码操      作    说      明温度转换44H启动DS18B20进行温度转换读暂存器BEH读暂存器9个字节内容写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器48H把暂存器的TH、TL字节写到E2RAM中重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPUCPU对DS18B20的访问流程是:先

9、对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。 读DS18B20温度的流程图DS18B20是否存在?(读DS18B20测量温度子程序)GET-TEMPATURE开始数据端置位读温度值返回复位DS18B20(调用RESETDS18B20)写温度转换命令44H(调用WRITE18B20)写

10、跳过ROM匹配命令0CCH(调用WRITE18B20)延时750s?(读温度前)复位DS18B20(调用RESETDS18B20)写跳过POM匹配命令0CCH(调用WRITE18B20)写读温度字节命令0BEH(调用WRITE18B20)读温度(调用READ18B20)开始发一个DS18B20序列号执行期间匹配命令延时1s启动在线DS18B20温度AD转换发跳过ROM命令、发转换命令初始化DS18B20读在线DS18B20序号发出搜索ROM命令DS18B20复位所有在线DS18B20访问完?存在一个DS18B20?初始化DS18B20发读暂存RAM指令读匹配的DS18B20温度多点温度检测软件

11、流程图Initialization procedure “reset and presence pulses”确保DS18B20在输出低电平表示存在时数据线不被拉高(DS18B20复位子程序)RESETDS18B20开始设置标志位表示存在延时(480s , 960s)数据端(先置位后)清零数据端为低电平?DS18B20复位流程图数据端置位(拉高数据线)延时300s?清除标志位表示不存在延时(180s)数据端置位(拉高数据线)DS18B20复位结束RESETDS18B20: SETB P2.2 NOP CLR P2.2 ;主机发出延时537微秒的复位低脉冲MOV R1, #3 TSR1: MOV

12、 R0, #107 DJNZ R0, $ DJNZ R1, TSR1 SETB P2.2 ;然后拉高数据线 NOP NOP NOP MOV R0, #25H TSR2: JNB P2.2, TSR3 ;等待DS18B20回应 DJNZ R0, TSR2 LJMP TSR4 ; 延时 TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在 CLR P1.7 ; 检查到DS18B20就点亮P1.7LED LJMP TSR5 TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在 CLR P1.1 LJMP TSR7 TSR5: MOV R0, #117 TSR6: DJ

13、NZ R0, TSR6 ; 时序要求延时一段时间 TSR7: SETB P2.2 RET循环右移一次写DS18B20(子程序)开始进位标志位清零延时30s数据端清零指令字节写完?进位标志位值送数据端延时(15s)数据端置位(拉高数据线)DS18B20写返回写DS18B20指令字节的流程图存低位字节数据一个字节是否读完?布尔累加器C清零读DS18B20两个温度字节的流程图是低位字节数据?(读DS18B20的温度字节子程序)READ18B20开始读数据端(数据)数据端清零延时(10s)数据端置位DS18B20读返回延时(2s)数据端置位延时(3s)延时(25s)保存所读一位数据存高位字节数据C51

14、程序#include <AT89X52.H> #include <INTRINS.h> unsigned char code displaybit=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code displaycode=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00,0x40; unsigned char code dotcode32=0,3,6,9,12,16,19,2

15、2, 25,28,31,34,38,41,44,48, 50,53,56,59,63,66,69,72, 75,78,81,84,88,91,94,97; unsigned char displaycount; unsigned char displaybuf8=16,16,16,16,16,16,16,16; unsigned char timecount; unsigned char readdata8; sbit DQ=P37; bit sflag; bit resetpulse( void) unsigned char i ; DQ=0; for(i=255;i>0;i-) ;

16、DQ=1; for(i=60;i>0;i-); return(DQ); for(i=200;i>0;i-); Void write command to ds18b20 (unsigned char command) unsigned char i; unsigned char j; for(i=0;i<8;i+) if(command & 0x01)=0) DQ=0; for(j=35;j>0;j-); DQ=1; Else DQ=0; for(j=2;j>0;j-); DQ=1; for(j=33;j>0;j-); command=_cror_(

17、command,1); unsigned char readdatafromds18b20(void) unsigned char i; unsigned char j; unsigned char temp; temp=0; for(i=0;i<8;i+) temp=_cror_(temp,1); DQ=0; _nop_(); _nop_(); DQ=1; for(j=10;j>0;j-); if(DQ=1) temp=temp | 0x80; else temp=temp | 0x00; for(j=200;j>0;j-); return(temp); void main

18、(void) TMOD=0x01; TH0=(65536-4000)/256; TL0=(65536-4000)%256; ET0=1; EA=1; while(resetpulse(); writecommandtods18b20(0xcc); writecommandtods18b20(0x44); TR0=1; while(1) ; void t0(void) interrupt 1 using 0 unsigned char x; unsigned int result; TH0=(65536-4000)/256; TL0=(65536-4000)%256; if(displaycou

19、nt=2) P0=displaycodedisplaybufdisplaycount | 0x80; else P0=displaycodedisplaybufdisplaycount; P2=displaybitdisplaycount; displaycount+; if(displaycount=8) displaycount=0; timecount+; if(timecount=150) timecount=0; while(resetpulse(); writecommandtods18b20(0xcc); writecommandtods18b20(0xbe); readdata

20、0=readdatafromds18b20(); readdata1=readdatafromds18b20(); for(x=0;x<8;x+) displaybufx=16; sflag=0; if(readdata1 & 0xf8)!=0x00) sflag=1; readdata1=readdata1; readdata0=readdata0; result=readdata0+1; readdata0=result; if(result>255) readdata1+; readdata1=readdata1<<4; readdata1=readdat

21、a1 & 0x70; x=readdata0; x=x>>4; x=x & 0x0f; readdata1=readdata1 | x; x=2; result=readdata1; while(result/10) displaybufx=result%10; result=result/10; x+; displaybufx=result; if(sflag=1) displaybufx+1=17; x=readdata0 & 0x0f; x=x<<1; displaybuf0=(dotcodex)%10; displaybuf1=(dotc

22、odex)/10; while(resetpulse(); writecommandtods18b20(0xcc); writecommandtods18b20(0x44); ;这是关于DS18B20的读写程序,数据脚P2.2,晶振11.0592MHz ;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒 ;可以将检测到的温度直接显示到AT89C51的两个数码管上 ;显示温度00到99度,很准确无需校正! ORG 0000H ;单片机内存分配申明! TEMPER_L EQU 29H ;用于保存读出温度的低8位 TEMPER_H EQU 28H ;用于保存读出温度的高

23、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

24、系数 MOV A,29H MOV C,40H ;将28H中的最低位移入C RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A MOV 29H,A LCALL DISPLAY ;调用数码管显示子程序 CPL P1.0 AJMP MAIN ; 这是DS18B20复位初始化子程序 INIT_1820: SETB P2.2 ; 数据脚NOP CLR P2.2 ;主机发出延时537微秒的复位低脉冲MOV R1, #3 TSR1: MOV R0, #107 DJNZ R0, $ DJNZ R1, TSR1 SETB P2.2 ;然后拉高数据线 NOP

25、 NOP NOP MOV R0, #25H TSR2: JNB P2.2, TSR3 ;等待DS18B20回应 DJNZ R0, TSR2 LJMP TSR4 ; 延时 TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在 CLR P1.7 ; 检查到DS18B20就点亮P1.7LED LJMP TSR5 TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在 CLR P1.1 LJMP TSR7 TSR5: MOV R0, #117 TSR6: DJNZ R0, TSR6 ; 时序要求延时一段时间 TSR7: SETB P2.2 RET ; 读出转换后的温度值

26、GET_TEMPER: SETB P2.2 LCALL INIT_1820 ;先复位DS18B20 JB FLAG1, TSS2 CLR P1.2 RET ; 判断DS1820是否存在?若DS18B20不存在则返回 TSS2: CLR P1.3 ;DS18B20已经被检测到! MOV A, #0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A, #44H ; 发出温度转换命令 LCALL WRITE_1820 ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒 LCALL DISPLAY LCALL INIT_1820 ;准备读温度前先复位

27、 MOV A, #0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A, #0BEH ; 发出读温度命令 LCALL WRITE_1820 LCALL READ_18200; 将读出的温度数据保存到35H/36H CLR P1.4 RET ;写DS18B20的子程序(有具体的时序要求) WRITE_1820: MOV R2, #8 ;一共8位数据 CLR C WR1: CLR P2.2 MOV R3, #5 DJNZ R3, $ RRC A MOV P2.2, C MOV R3, #21 DJNZ R3, $ SETB P2.2 NOP DJNZ R2, WR1 SETB

28、 P2.2 RET ; 读DS18B20的程序, 从DS18B20中读出两个字节的温度数据READ_18200: MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H) RE00: MOV R2,#8 ; 数据一共有8位 RE01: CLR C SETB P2.2 NOP NOP CLR P2.2 NOPNOP NOP SETB P2.2 MOV R3,#8 RE10: DJNZ R3,RE10 MOV C,P2.2 MOV R3,#21 RE20: DJNZ R3,RE20 RRC A

29、 DJNZ R2,RE01 MOV R1,A DEC R1 DJNZ R4,RE00 RET ;显示子程序 display: MOV A,29H ;将29H中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制 DIV A B MOV b_bit ,A ;十位在a MOV a_bit ,B ;个位在b MOV DPTR, #numtab ;指定查表启始地址 MOV R0,#4 dpl1: MOV R1,#250 ;显示1000次 dplop:MOV A, a_bit ;取个位数 MOVC A,A+DPTR ;查个位数的7段代码 MOV P0,A ;送出个位的7段代码 CL

30、R P2.7 ;开个位显示 ACALL d1ms ;显示1ms SETB P2.7 MOV A, b_bit ;取十位数 MOVC A,A+DPTR ;查十位数的7段代码 MOV P0,A ;送出十位的7段代码 CLR P2.6 ;开十位显示 ACALL d1ms ;显示1ms SETB P2.6 DJNZ R1,dplop ;100次没完循环 DJNZ R0,dpl1 ; 4个100次没完循环 RET ;1MS延时 d1ms: MOV R7,#80 DJNZ R7,$ RET ;实验板上的7段数码管09数字的共阴显示代码 numtab: DB 0CFH,03H,5DH,5BH,93H,0DA

31、H,0DEH,43H,0DFH,0DBH END#include "reg51.h"#include "INTRINS.H"#include "LCD.h"#define CLR_RI (RI=0)#define CLR_TI (TI=0) unsigned char code ID28= 0x28,0x1D,0x25,0x1D,0x00,0x00,0x00,0x80, 0x28,0x0e,0x9e,0x1c,0x00,0x00,0x00,0x32;unsigned char currSensorNo=0;sbit TMDAT = P

32、17;sbit RUN_LED = P16;/*-*/void serial_initial() TMOD=0X20; SCON=0X50; PCON=0X00; TL1=TH1=0XE8; TR1=1;/*-*/void send(unsigned char count,unsigned char SEND_Buf) unsigned char i; for(i=0;i<count;i+) SBUF=SEND_Bufi;while(!TI);CLR_TI; /*- delay N ms-*/void Delay_ms (unsigned int Nms ) unsigned char

33、i;while(Nms-)for(i=0; i<125; i+) ;/*- delay N count-*/void Delay_Count (unsigned char Count ) while(Count>0) Count-; /*- start Reset Pulse-*/void tmreset(void) TMDAT=0; Delay_Count(103); TMDAT=1; Delay_Count(4);/*- ACK-*/void tmpre(void) while(TMDAT); while(TMDAT); Delay_Count(4);/*-Read a bit

34、 from 1820-*/bit tmrbit(void) int i=0; bit dat; TMDAT=0;i+; TMDAT=1;i+;i+; dat = TMDAT; Delay_Count(8); return dat;/*- Read a byte from 1820-*/unsigned char tmrbyte(void) unsigned char i,j,dat=0; for(i=1;i<=8;i+) j=tmrbit(); dat=(j<<7)|(dat>>1); return dat;/*- Read a byte from 1820-*/

35、void tmwbyte(unsigned char dat) signed char i=0; unsigned char j; bit testb; for(j=1;j<=8;j+) testb=dat & 0x01; dat = dat>>1; if(testb) TMDAT=0; i+;i+; TMDAT=1; Delay_Count(8); else TMDAT=0; Delay_Count(8); TMDAT=1; i+;i+; /*- send convert command to 1820-*/void tmstart(void) unsigned char i;tmreset(); tmpre(); Delay_ms(1);/* tmwbyte(0xcc);*/ tmwbyte(0x55); for(i=0;i<8;i+) tmwbyte(IDcurrSensorNoi); tmwbyte(0x44);/*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论