2022年DS18B20与LCD1602结合显示温度汇总_第1页
2022年DS18B20与LCD1602结合显示温度汇总_第2页
2022年DS18B20与LCD1602结合显示温度汇总_第3页
2022年DS18B20与LCD1602结合显示温度汇总_第4页
2022年DS18B20与LCD1602结合显示温度汇总_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、DS18B20 一、 DS18B20 的形状及其与单片机的连接图a b 图 1 DS18B20 是 Dallas 公司生产的 1-Wire 接口数字温度传感器,其形状如图 1a所示,有三个引脚,分别为:电源地 1GND; 数字信号输入 /输出端 2DQ ;外接供电电源输入端 3(VDD ,在寄生电源接线方式时接地);它是一种单总线数字温度传感器,全部的数据交换和掌握都通过这根数据线来完成;测试温度范畴-55-125,温度数据位可配置为9、10、11、 12 位,对应的刻度值分别为0.5、 0.25、 0.125、 0.0625,对应的最长转换时间分别为 93.75ms、187.5ms、375m

2、s、750ms;出厂默认配置为 12 位数据, 刻度值为 0.0625,最长转换时间为 750ms;从以上数据可以看出,DS18B20 数据位越低、转换时间越短、反应越快、精度越低;单总线没有时钟线,只有一根通信线,其读写数据是靠掌握起始时间和采样时间来完成,所以时序要求很严格;图1a为 DS18B20 与单片机的连接电路图,它的数据线通常要求外接一个4.7K-10K的上拉电阻 该电阻画原理图时靠近单片机画故没有显示出来 ,故其闲置时状态位高电平;提示: DS18B20 形状酷似三极管,辨论引脚时,面对着扁平的那一面,左负右正,一 旦接反就会马上发热,甚至有可能烧毁;二、 DS18B20 储备

3、器结构DS18B20 的内部有 64 位的 ROM 单元,和 9 字节的暂存器单元;1、64 位(激)光刻只读储备器每只 DS18B20 都有一个唯独储备在ROM 中的 64 位编码 跟人的身份证号类似,一人一个身份证号 ,这是出厂时被光刻好的;最前面 8 位是单线系列编码:28h;接着的 48 位是一个唯独的序列号;最终 8 位是以上 56 位的 CRC 编码; 64-位的光刻 ROM 又包括 5 个ROM 的功能命令:读 ROM ,匹配 ROM ,跳动 ROM ,查找 ROM 和报警查找; ROM 的作用是使每个 DS18B20 各不相同, 这样就可以实现一根总线上挂接多个 DS18B20

4、 以实现多点监测;2、9 字节的暂存器单元表 1 1 DS18B20 的暂存器单元如表 1)、温度传感器1 所示,各部分介绍如下;图 2 暂存器的第 0LSB 字节,第 1MSB 字节为 DS18B20 的温度传感器,它们负责储存对温度的测量结果,用 16 位二进制供应,格式如图 2 所示; DS18B20 读取温度时共读取 16位,前 5 个位 MSB 的高 5 位为符号位, 当前 5 位为 1 时,读取的温度为负数;当前 5 位为0 时,读取的温度为正;温度为正时读取方法为:将 16 进制数转换成 10 进制即可;温度为负时读取方法为 实际就是取补码 :将 16 进制取反后加 1,再转换成

5、 10 进制;例: 0550H = +85 度, FC90H = -55 度, 0191H 为 25.0625 度; LSB 的低四位用于表示测量值中小数点后的数值;2)、非挥发的温度报警触发器 TH 和 TL 位于第 2 和第 3 字节,用于写入温度报警值,实际上就是设定温度的最高和最低界限;3)、配置寄存器配置寄存器位于储备器的第 4 字节,其组织如图 3 所示;配置寄存器的 04 位和 7 位被器件保留,禁止写入;在读回数据时全部为规律 1;R1 和 R0 用于设置 DS18B20 的精度,详细如表 2 所示;图 3 表 2 2 4)、 CRC 发生器CRC 字节作为 DS18B2064

6、 位 ROM 的一部分储备在储备器中;CRC 码由 ROM 的前 56位运算得到, 被包含在 ROM 的重要字节当中;CRC 由储备在储备器中的数据运算得到,因此当储备器中的数据发生转变时,CRC 的值也随之转变;CRC 能够在总线掌握器读取DS18B20 时进行数据校验;为校验数据是否被正确读取,总线掌握器必需用接受到的数据运算出一个CRC 值,和储备在DS18B20 的 64 位 ROM 中的值(读 ROM 时)或 DS18B20 内部运算出的8 位 CRC 值(读储备器时)进行比较;假如运算得到的 CRC 值和读取出来的 CRC 值相吻合,数据被无错传输;CRC 值的比较以及是否进行下一

7、步操作完全由总线掌握器打算;当在 DS18B20 中储备的或由其运算到 CRC 值和总线掌握器运算的值不相符时,CRC 的运算等式如下:DS18B20 内部并没有一个能阻挡命令序列进行的电路;CRC = X8 + X5 + X4 + 1 单总线 CRC 可以由一个由移位寄存器和XOR 门构成的多项式发生器来产生;这个回路包括一个移位寄存器和几个 XOR 门,移位寄存器的各位都被初始化为 0;从 ROM 中的最低有效位或暂存器中的位 0 开头,一次一位移入寄存器;在传输了 56 位 ROM 中的数据或移入了暂存器的位 7 后,移位寄存器中就储备了 CRC 值;下一步, CRC 的值必需被循环移入

8、;此时,假如运算得到的 CRC 是正确的,移位寄存器将复 0;其他字节保留用,不需要看;三、关于单总线系统单总线系统包括一个总线掌握器和一个或多个从机;DS18B20 总是充当从机;当只有一只从机挂在总线上时,系统被称为“ 单点” 系统;假如由多只从机挂在总线上,系统被称为“ 多点” ; 全部的数据和指令的传递都是从最低有效位开头通过单总线;单总线需要一个约 5K 的外部上拉电阻;单总线的闲暇状态是高电平;无论任何理由需要暂停某一执行过程时, 假如仍想复原执行的话,总线必需停留在闲暇状态;在复原期间,假如单总线处于非活动(高电平) 状态, 位与位间的复原时间可以无限长;假如总线停留在低电平超过

9、 480us,总线上的全部器件都将被复位;四、操作流程1.DS18B20 复位;2.执行 ROM 指令;就是拜访,搜寻,匹配每个DS18B20 独有的 64 位序列号;试验板上只连有一个 DS18B20 ,故不需识别,也就是不需读出此序列号,写代码时直接写命令 0 xcc 跳过;3.执行 DS18B20 功能指令( RAM 指令,就是读写暂存器指令);DS18B20 的功能指令许多,比较常用的有两个:0 x44:开头转换温度;转换好的温度会储存到暂存器字节 0 和 1;0 xBE:读暂存指令;读暂存指令,会从暂存器 的话,必需写下 DS18B20 复位;0 到 9,一个一个字节读取,假如要停止

10、ROM 指令和 RAM 指令的详细情形见表 3;表 3 3 五、读写 DS18B20 的时序1、DS18B20 的复位时序: 1.单片机拉低总线 480us960us,然后释放总线(拉高电平);2).这时 DS18B20 会拉低信号,大约 60240us 表示应答; 3).DS18B20 拉低电平的 60240us之间,单片机读取总线的电平,假如是低电平,那么表示复位胜利;4).DS18B20 拉低电平60240us 之后,会释放总线;/* 复位:主机 t0 时刻发送一复位脉冲 最短为 480us 的低电平信号 ,接着在 t1 时刻释放总线 拉高总线电平 进入接收状态;DS18B20 在检测到

11、总线的上升沿之后等待 1560us;接着DS18B20 在 t2 时刻发出存在脉冲连续 60240us 的低电平 * */ void DS18B20_Reset DQ=1; _nop_; DQ=0; /拉低总线 delay2us280; / 连续 280*2+5=565s 4 DQ=1; /释放总线whileDQ; /等待应答 电平拉低 while.DQ; /应答电平大约连续 60240us 后重新拉高总线 2、读时序: 1.在读取的时候单片机拉低电平大约1us;2.单片机释放总线,然后读取总线电平;3.这时候 DS18B20 会拉低电平 0或拉高电平 1;4).读取电平过后, 推迟大约 40

12、45us;/* 读字节 :主机总线 t0 时刻从高拉至低电平常,总线只须保持低电平 l .7us;之后在 t1 时刻将总线拉高产生读时间隙,读时间隙在t1 时刻后 t2 时刻前有效;t2 距 t0 为 15us,也就是说t2 时刻前主机必需完成读位,并在t0 后的 60us-120us 内释放总线 .留意读的时候从最低位向最高位读;*/ uchar DS18B20_Read_Byte uchar i,temp=0; fori=0;i1; DQ=0; /主机将总线拉至低电平,只需保持 1.7us _nop_; / 保持一个时钟周期,也即 1us DQ=1; delay2us1;/延时 7us,一

13、般读数在后半段读 ifDQ temp=temp|0 x80; delay2us2; / 这里延时 45us+前面 7us+1us=53us,接近 60us return temp; 3、写时序: 1.单片机拉低电平大约1015us;2.单片机连续拉低电平0或拉高电平 1大约2045us 的时间; 3.释放总线;/* 写字节:当主机总线t0 时刻从高拉至低电平常就产生写时间隙;从to 时刻开头5 15us 之内应将所需写的位送到总线上,在随后15-60us 间 DS18B20 对总线采样如低电平写入的位是0;如高电平写入的位是1,连续写 2 位间的间隙应大于1us;留意:无论读写都是从最低位开头

14、;*/ void DS18B20_Write_Byteuchar dat uchar i; fori=0;i1; 4、读取温度流程 /* 读温度 :流程:复位 -写命令 跳过读序列号,单个DS18B20 时用 -启动温度转换-等待转换完成 完成总线会跳回高电平 -复位 -写命令 跳过 ROM 编码命令 - 读取暂存寄存器字节命令-读低字节 -读高字节 -复位 -合并高低字节 -判定正负*/ DS18B20_Read_Temperature uchar temp_low,temp_high; DS18B20_Reset; DS18B20_Write_Byte0 xcc; DS18B20_Writ

15、e_Byte0 x44; while.DQ; /等待转换完成 DS18B20_Reset; DS18B20_Write_Byte0 xcc; DS18B20_Write_Byte0 xbe; temp_low=DS18B20_Read_Byte; temp_high=DS18B20_Read_Byte; DS18B20_Reset; tvalue=temp_high; tvalue=tvalue8|temp_low; iftvalue0 x0fff tflag=0; else 6 tvalue=tvalue+1; /由于最高位的前五位是 码要取反加一得到二进制数)tflag=1; 1,所以寄存

16、器存的是温度的补码(补tvalue=tvalue*0.625;/ 温度值扩大10 倍,精确到1 位小数returntvalue; 例子: DS18B20+1602 #include #include #include #define uchar unsigned char #define uint unsigned int sbit DQ=P23;/ds18b20 与单片机连接口 sbit RS=P26; sbit RW=P27; sbit E=P25; unsigned char code str1=temperature: ; unsigned char code str2= ; ucha

17、r data disdata5; uint tvalue;/ 温度值 uchar tflag;/ 温度正负标志/*lcd1602 /声明调用函数程序 */ void Lcd_W_Cmduchar com; void Lcd_W_Datuchar dat; uchar Lcd_R_Busy; void Lcd_Init; void delayuchar t; void delay_4_nop; /* 延时 */ #define delay_4_nop _nop_;_nop_;_nop_;_nop_; void delayuchar t uchar i, j; fori=0; it; i+ for

18、j=0; j50; j+; void Lcd_Init uchar i; Lcd_W_Cmd0 x3c; 7 Lcd_W_Cmd0 x0e; Lcd_W_Cmd0 x01; Lcd_W_Cmd0 x06; Lcd_W_Cmd0 x80; fori=0;istrlenstr1;i+ Lcd_W_Datstr1i; Lcd_W_Cmd0 xC0; fori=0;istrlenstr2;i+ Lcd_W_Datstr2i; uchar Lcd_R_Busy uchar s; RW=1; delay_4_nop; RS=0; delay_4_nop; E=1; delay_4_nop; s=P0; d

19、elay_4_nop; E=0; returns; void Lcd_W_Cmduchar com uchar i; do i=Lcd_R_Busy; i=i&0 x80; delay2; whilei.=0; RW=0; delay_4_nop; RS=0; delay_4_nop; 8 E=1; delay_4_nop; P0=com; delay_4_nop; E=0; void Lcd_W_Datuchar dat uchar i; do i=Lcd_R_Busy; i=i&0 x80; delay2; whilei.=0; RW=0; delay_4_nop; RS=1; delay

20、_4_nop; E=1; delay_4_nop; P0=dat; delay_4_nop; E=0; /*ds1820程序*/ void delay2usunsigned int i/ 延时 1 微秒 while-i; /* * 牛人实测,本人没有做过试验;针对的是 12Mhz 的晶振delay0:延时 518us 误差 :518-2*256=6 delay1:延时 7us (原帖写 5us是错的)delay10: 延时 25us 误差 :25-20=5 delay20: 延时 45us 误差 :45-40=5 delay100: 延时 205us 误差 :205-200=5 delay20

21、0: 延时 405us 误差 :405-400=5 * */ /*9 * 复位:主机 t0 时刻发送一复位脉冲 最短为 480us 的低电平信号 ,接着在 t1 时刻释放总线 拉高总线电平 进入接收状态;DS18B20 在检测到总线的上升沿之后等待 1560us;接着DS18B20 在 t2 时刻发出存在脉冲 连续 60240us 的低电平 */ void DS18B20_Reset DQ=1; _nop_; DQ=0; /拉低总线delay2us280; / 连续 280*2+5=565s DQ=1; /释放总线whileDQ; /等待应答 电平拉低 while.DQ; /应答电平大约连续

22、60240us 后重新拉高总线 /* 读字节 :主机总线 t0 时刻从高拉至低电平常,总线只须保持低电平 l .7us;之后在 t1 时刻将总线拉高产生读时间隙,读时间隙在t1 时刻后 t2 时刻前有效;t2 距 t0 为 15us,也就是说t2 时刻前主机必需完成读位,并在t0 后的 60us-120us 内释放总线 .留意读的时候从最低位向最高位读;*/ uchar DS18B20_Read_Byte uchar i,temp=0; fori=0;i1; DQ=0; /主机将总线拉至低电平,只需保持 1.7us _nop_; / 保持一个时钟周期,也即 1us DQ=1; delay2us

23、1;/延时 7us,一般读数在后半段读 ifDQ temp=temp|0 x80; delay2us2; / 这里延时 45us+前面 7us+1us=53us,接近 60us return temp; /* 写字节:当主机总线t0 时刻从高拉至低电平常就产生写时间隙;从to 时刻开头15us 之内应将所需写的位送到总线上,在随后15-60us 间 DS18B20 对总线采样如低电平写入的位是0;如高电平写入的位是1,连续写 2 位间的间隙应大于1us;10 留意:无论读写都是从最低位开头;*/ void DS18B20_Write_Byteuchar dat uchar i; fori=0;

24、i1; /* 读温度 :流程:复位 -写命令 跳过读序列号,单个DS18B20 时用 -启动温度转换-等待转换完成 完成总线会跳回高电平 -复位 -写命令 跳过 ROM 编码命令 - 读取暂存寄存器字节命令-读低字节 -读高字节 -复位 -合并高低字节 -判定 正负*/ DS18B20_Read_Temperature uchar temp_low,temp_high; DS18B20_Reset; DS18B20_Write_Byte0 xcc; DS18B20_Write_Byte0 x44; while.DQ; /等待转换完成 DS18B20_Reset; DS18B20_Write_Byte0 xcc; DS18B20_Write_Byte0 xbe; temp_low=DS18B20_Read_Byte; temp_high=DS18B20_Read_Byte; DS18B20_Reset; tvalu

温馨提示

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

评论

0/150

提交评论