ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:220.19KB ,
资源ID:17860080      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17860080.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DS18B20数字温度传感器.docx)为本站会员(b****0)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

DS18B20数字温度传感器.docx

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

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

3、采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位),测温范围为-55-+125,测量分辨率为0.0625,内含64位经过激光修正的只读存储器ROM,适配各种单片机或系统机,用户可分别设定各路温度的上、下限,内含寄生电源。 2、DS18B20内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。DS18B20的管脚排列如图1所示。64位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号,不同的器件地址序列号不同。 8位

4、产品系列号48位产品序号8位CRC编码 DS18B20高速暂存器共9个存储单元,如表所示: 序号寄存器名称作 用序号寄存器名称作 用0温度低字节以16位补码形式存放4、5保留字节1、21温度高字节6计数器余值2TH/用户字节1存放温度上限7计数器/3HL/用户字节2存放温度下限8CRCCRC校验 以12位转化为例说明温度高低字节存放形式及计算:12位转化后得到的12位数据,存储在18B20的两个高低两个8位的RAM中,二进制中的前面5位是符号位。如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度(等价说明:高8位字节的低3位和低8位字节的高4位组成温度整数值的二

5、进制数;或者说:12位测量时,所测数值乘以0.0625(=1/16),即右移4位后去掉了二进制数的小数部分);如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625才能得到实际温度(等价说明:当温度小于0时,整数部分就是各位取反,小数部分则是各位取反后加1)。 高8位SSSSS262524低8位232221202-12-22-32-4说明:温度测量分辨率有四种,即9位测量分辨率0.5;10位测量分辨率0.25;11位测量分辨率0.125;12位测量分辨率0.0625;912位的测量,无论采用哪种分辨率,温度整数的有效位均是表中2620;以12位为例:温度值二进制数十六进制数+12

6、50000 0111 1101 000007D0H+25.06250000 0001 1001 00010191H+10.1250000 0000 1010 001000A2H+0.50000 0000 0000 10000008H00000 0000 0000 00000000H-0.51111 1111 1111 1000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 0110 1111FF6FH-1251111 1100 1001 0000FC90H1、DS18B20控制方法 在硬件上,DS18B20与单片机的连接有两种方法,一

7、种是Vcc接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接5k左右的上拉电阻。DS18B20有六条控制命令,如下表所示:指 令约定代码操 作 说 明温度转换44H启动DS18B20进行温度转换读暂存器BEH读暂存器9个字节内容写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器48H把暂存器的TH、TL字节写到E2RAM中重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPUCP

8、U对DS18B20的访问流程是:先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。 Initialization procedure “reset and presence pulses”C51程序#include #include unsigned char code displayb

9、it=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,22, 25,28,31,34,38,41,44,48, 50,53,56,59,63,66,69,72, 75,78,81,84,88,91,94,97; unsig

10、ned 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;i0;i-) ; DQ=1; for(i=60;i0;i-); return(DQ); for(i=200;i0;i-); Void write command to ds18b20 (uns

11、igned char command) unsigned char i; unsigned char j; for(i=0;i0;j-); DQ=1; Else DQ=0; for(j=2;j0;j-); DQ=1; for(j=33;j0;j-); command=_cror_(command,1); unsigned char readdatafromds18b20(void) unsigned char i; unsigned char j; unsigned char temp; temp=0; for(i=0;i0;j-); if(DQ=1) temp=temp | 0x80; el

12、se temp=temp | 0x00; for(j=200;j0;j-); return(temp); void main(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 res

13、ult; TH0=(65536-4000)/256; TL0=(65536-4000)%256; if(displaycount=2) P0=displaycodedisplaybufdisplaycount | 0x80; else P0=displaycodedisplaybufdisplaycount; P2=displaybitdisplaycount; displaycount+; if(displaycount=8) displaycount=0; timecount+; if(timecount=150) timecount=0; while(resetpulse(); writ

14、ecommandtods18b20(0xcc); writecommandtods18b20(0xbe); readdata0=readdatafromds18b20(); readdata1=readdatafromds18b20(); for(x=0;x255) readdata1+; readdata1=readdata14; x=x & 0x0f; readdata1=readdata1 | x; x=2; result=readdata1; while(result/10) displaybufx=result%10; result=result/10; x+; displaybuf

15、x=result; if(sflag=1) displaybufx+1=17; x=readdata0 & 0x0f; x=x1; displaybuf0=(dotcodex)%10; displaybuf1=(dotcodex)/10; while(resetpulse(); writecommandtods18b20(0xcc); writecommandtods18b20(0x44); ;这是关于DS18B20的读写程序,数据脚P2.2,晶振11.0592MHz ;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒 ;可以将检测到的温度直接显示到AT89C51

16、的两个数码管上 ;显示温度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位转化时每一位的精度为

17、0.0625度,我们不要求显示小数所以可以抛弃29H的低4位 ;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度 ;这个转化温度的方法可是我想出来的哦非常简洁无需乘于0.0625系数 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 ; 数

18、据脚NOP CLR P2.2 ;主机发出延时537微秒的复位低脉冲MOV R1, #3 TSR1: MOV 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 ; 清标志位,表示DS1

19、820不存在 CLR P1.1 LJMP TSR7 TSR5: MOV R0, #117 TSR6: DJNZ R0, TSR6 ; 时序要求延时一段时间 TSR7: SETB P2.2 RET ; 读出转换后的温度值 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

20、 ; 发出温度转换命令 LCALL WRITE_1820 ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒 LCALL DISPLAY LCALL INIT_1820 ;准备读温度前先复位 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

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

22、 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 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 ;指定查表启始地址

23、 MOV R0,#4 dpl1: MOV R1,#250 ;显示1000次 dplop:MOV A, a_bit ;取个位数 MOVC A,A+DPTR ;查个位数的7段代码 MOV P0,A ;送出个位的7段代码 CLR 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

24、个100次没完循环 RET ;1MS延时 d1ms: MOV R7,#80 DJNZ R7,$ RET ;实验板上的7段数码管09数字的共阴显示代码 numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,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

25、,0x9e,0x1c,0x00,0x00,0x00,0x32;unsigned char currSensorNo=0;sbit TMDAT = P17;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;icount;i+) SBUF=SEND_Bufi; while(!TI); CLR_TI; /*- delay N ms-*/void Delay_ms (unsigned int Nms ) unsigned char i; while(Nms-) for(i=0; i0) Count-; /*- start Reset Pulse-*/void tmreset(void) TMDAT=0; Delay_Count(103); TMDAT=1; Delay_Count(4);/*- ACK-

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2