收藏 分享(赏)

DS18B20与LCD1602结合显示温度.doc

上传人:精品资料 文档编号:10679940 上传时间:2019-12-20 格式:DOC 页数:13 大小:248.04KB
下载 相关 举报
DS18B20与LCD1602结合显示温度.doc_第1页
第1页 / 共13页
DS18B20与LCD1602结合显示温度.doc_第2页
第2页 / 共13页
DS18B20与LCD1602结合显示温度.doc_第3页
第3页 / 共13页
DS18B20与LCD1602结合显示温度.doc_第4页
第4页 / 共13页
DS18B20与LCD1602结合显示温度.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

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

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

3、B20 存储器结构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 各不相同,这样就可以实现一根总线上挂接多个 DS1

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

5、1,再转换成 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表 234) 、CRC 发生器 CRC 字节作为 DS18B206

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

7、是否进行下一步操作完全由总线控制器决定。当在 DS18B20 中存储的或由其计算到 CRC值和总线控制器计算的值不相符时,DS18B20 内部并没有一个能阻止命令序列进行的电路。CRC 的计算等式如下: 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,故不需识别,也就是不需读出此序列号,写代码时直接写命令 0xcc跳过。3.执行 DS18B20 功能指令(RAM 指令,就是读写暂存器指令) 。DS18B20 的功能指令很多,比较常用的有两个:0x44:开始转换温度。转换好的温度会储存到暂存器字节 0 和 1。0xBE:读暂存指令。读暂存指令,会从暂存器 0 到 9,一个一个字节读取,如果要停止的话,必须写下 DS18B20 复位。4RO

10、M 指令和 RAM 指令的具体情况见表 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_();5DQ=0; /拉低总线delay2us(280); /持续 280*2+5=565sDQ=1; /释放总线while(DQ); /等待应答(电平拉低)while(!DQ); /应答电平大约持续 60240us 后重新拉高总线2、读时序:1).在读取的时候单片机拉低电平大约 1us;2).单片机释放总线,然后读取总线电平。3).这时候 DS18B20 会拉低电平(0)或拉高电平(1)。4).读取电平过后,延迟大约4

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

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

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

15、te_Byte(0x44);while(!DQ); /等待转换完成DS18B20_Reset();DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0xbe);temp_low=DS18B20_Read_Byte();temp_high=DS18B20_Read_Byte();7DS18B20_Reset();tvalue=temp_high;tvalue=(tvalue#include #include #define uchar unsigned char#define uint unsigned intsbit DQ=P23;/ds18b20 与单片

16、机连接口sbit RS=P26;sbit RW=P27;sbit E=P25;unsigned char code str1=“temperature: “;unsigned char code str2=“ “;uchar data disdata5;uint tvalue;/温度值uchar tflag;/温度正负标志/*lcd1602 程序*/声明调用函数void Lcd_W_Cmd(uchar com);void Lcd_W_Dat(uchar dat);uchar Lcd_R_Busy();void Lcd_Init();void delay(uchar t);void delay_

17、4_nop();/*延时*/#define delay_4_nop() _nop_();_nop_();_nop_();_nop_();void delay(uchar t)uchar i, j;for(i=0; i1;DQ=0; /主机将总线拉至低电平,只需保持 1.7us_nop_(); /保持一个时钟周期,也即 1usDQ=1;delay2us(1);/延时 7us,一般读数在后半段读if(DQ)temp=temp|0x80; delay2us(2); /这里延时 45us+前面 7us+1us=53us,接近 60us11return temp;/*写字节:当主机总线 t0 时刻从高拉

18、至低电平时就产生写时间隙。从 to 时刻开始15us 之内应将所需写的位送到总线上,在随后 15-60us 间 DS18B20 对总线采样若低电平写入的位是 0;若高电平写入的位是 1,连续写 2 位间的间隙应大于 1us。注意:无论读写都是从最低位开始。*/void DS18B20_Write_Byte(uchar dat)uchar i;for(i=0;i1;/*读温度:流程:复位-写命令(跳过读序列号,单个 DS18B20 时用)-启动温度转换-等待转换完成(完成总线会跳回高电平 )-复位- 写命令(跳过 ROM 编码命令)-读取暂存寄存器字节命令-读低字节 -读高字节- 复位-合并高低

19、字节-判断正负*/DS18B20_Read_Temperature()uchar temp_low,temp_high;DS18B20_Reset();DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0x44);while(!DQ); /等待转换完成DS18B20_Reset();DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0xbe);temp_low=DS18B20_Read_Byte();temp_high=DS18B20_Read_Byte();DS18B20_Reset();tvalue=temp_hi

20、gh;tvalue=(tvalue8)|temp_low;12if(tvalue0x0fff)tflag=0;elsetvalue=tvalue+1;tflag=1;tvalue=tvalue*(0.625);/温度值扩大 10 倍,精确到 1 位小数return(tvalue);/*/void Show_Temperature()/温度值显示 uchar flagdat;disdata0=tvalue/1000+0x30;/百位数disdata1=tvalue%1000/100+0x30;/十位数disdata2=tvalue%100/10+0x30;/个位数disdata3=tvalue%

21、10+0x30;/小数位if(tflag=0)flagdat=0x20;/正温度不显示符号elseflagdat=0x2d;/负温度显示负号:-if(disdata0=0x30)disdata0=0x20;/如果百位为 0,不显示if(disdata1=0x30)disdata1=0x20;/如果百位为 0,十位为 0 也不显示Lcd_W_Cmd(0xc0);Lcd_W_Dat(flagdat);/显示符号位Lcd_W_Cmd(0xc1);Lcd_W_Dat(disdata0);/显示百位Lcd_W_Cmd(0xc2);Lcd_W_Dat(disdata1);/显示十位 Lcd_W_Cmd(0xc3);Lcd_W_Dat(disdata2);/显示个位 Lcd_W_Cmd(0xc4);Lcd_W_Dat(0x2e);/显示小数点 Lcd_W_Cmd(0xc5);Lcd_W_Dat(disdata3);/显示小数位13/*主程序 */void main() Lcd_Init();/初始化显示while(1)DS18B20_Read_Temperature();/读取温度Show_Temperature();/显示

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报