收藏 分销(赏)

DS18B20与LCD1602结合显示温度汇总.pdf

上传人:a199****6536 文档编号:2646703 上传时间:2024-06-03 格式:PDF 页数:13 大小:284.44KB
下载 相关 举报
DS18B20与LCD1602结合显示温度汇总.pdf_第1页
第1页 / 共13页
DS18B20与LCD1602结合显示温度汇总.pdf_第2页
第2页 / 共13页
DS18B20与LCD1602结合显示温度汇总.pdf_第3页
第3页 / 共13页
DS18B20与LCD1602结合显示温度汇总.pdf_第4页
第4页 / 共13页
DS18B20与LCD1602结合显示温度汇总.pdf_第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、375ms

2、、750ms。出厂默认配置为 12 位数据,刻度值为 0.0625,最长转换时间为 750ms。从以上数据可以看出,DS18B20 数据位越低、转换时间越短、反应越快、精度越低。单总线没有时钟线,只有一根通信线,其读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格。图 1(a)为 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 字节的暂存器单元表 12DS18B20 的暂存器单元如表 1 所示,各部分介绍如下。1)、温度传感器图 2暂存器的第 0(LSB)字节,第 1(MSB)字节为 DS18B20 的温度传感器,它们负责保存对温度的测量结果,用 16 位二进制提供,格式如图 2 所示。DS18B20 读取温度时共读取 16位,前 5 个位(MSB 的高 5 位)为符号位,当前 5 位为 1 时,读取的温度为负数;当前 5 位为 0 时,读取的温度为正。温度为正时读取方法为:将 16 进制数转换成 10 进制即可。温度为负时读取方法为(实际就是取补码):将 16 进制取反后加 1,再转换成 10 进制

5、。例: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 字节作为 DS18B2064 位 ROM 的一部分存储在存储器

6、中。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 的值必须被循环移入。此时,如果计算得到的 CRC 是正确的,移位

8、寄存器将复 0。其他字节保留用,不需要看。三、关于单总线系统 单总线系统包括一个总线控制器和一个或多个从机。DS18B20 总是充当从机。当只有一只从机挂在总线上时,系统被称为“单点”系统;如果由多只从机挂在总线上,系统被称为“多点”。所有的数据和指令的传递都是从最低有效位开始通过单总线。单总线需要一个约 5K 的外部上拉电阻;单总线的空闲状态是高电平。无论任何理由需要暂停某一执行过程时,如果还想恢复执行的话,总线必须停留在空闲状态。在恢复期间,如果单总线处于非活动(高电平)状态,位与位间的恢复时间可以无限长。如果总线停留在低电平超过 480us,总线上的所有器件都将被复位。四、操作流程1.D

9、S18B20 复位。2.执行 ROM 指令。就是访问,搜索,匹配每个 DS18B20 独有的 64 位序列号。实验板上只连有一个 DS18B20,故不需识别,也就是不需读出此序列号,写代码时直接写命令 0 xcc跳过。3.执行 DS18B20 功能指令(RAM 指令,就是读写暂存器指令)。DS18B20 的功能指令很多,比较常用的有两个:0 x44:开始转换温度。转换好的温度会储存到暂存器字节 0 和 1。0 xBE:读暂存指令。读暂存指令,会从暂存器 0 到 9,一个一个字节读取,如果要停止的话,必须写下 DS18B20 复位。4ROM 指令和 RAM 指令的具体情况见表 3。表 3五、读写

10、 DS18B20 的时序1、DS18B20 的复位时序:1).单片机拉低总线 480us960us,然后释放总线(拉高电平)。2).这时 DS18B20 会拉低信号,大约 60240us 表示应答。3).DS18B20 拉低电平的60240us 之间,单片机读取总线的电平,如果是低电平,那么表示复位成功。4).DS18B20 拉低电平 60240us 之后,会释放总线。/*复位:主机 t0 时刻发送一复位脉冲(最短为 480us 的低电平信号),接着在 t1 时刻释放总线(拉高总线电平)进入接收状态。DS18B20 在检测到总线的上升沿之后等待 1560us。接着DS18B20 在 t2 时刻

11、发出存在脉冲(持续 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).读取电平过后,延迟大约4045us。/*读字节:主机总线 t0 时刻从高拉至低电平时,总线只须保持低

12、电平 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,一般读数在后半段读if(DQ)temp=temp|0 x80;delay2us(2);

13、/这里延时 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。注意:无论读写都是从最低位开始。*/void DS18B20_Write_Byte(uchar da

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

15、t();DS18B20_Write_Byte(0 xcc);DS18B20_Write_Byte(0 xbe);temp_low=DS18B20_Read_Byte();temp_high=DS18B20_Read_Byte();7DS18B20_Reset();tvalue=temp_high;tvalue=(tvalue8)|temp_low;if(tvalue0 x0fff)tflag=0;else tvalue=tvalue+1;/因为最高位的前五位是 1,所以寄存器存的是温度的补码(补码要取反加一得到二进制数)tflag=1;tvalue=tvalue*(0.625);/温度值扩大

16、10 倍,精确到 1 位小数return(tvalue);例子:DS18B20+1602#include#include#include#define uchar unsigned char#define uint unsigned intsbit DQ=P23;/ds18b20 与单片机连接口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;/温度正负标志

17、/*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_4_nop();/*延时*/#define delay_4_nop()_nop_();_nop_();_nop_();_nop_();void delay(uchar t)uchar i,j;for(i=0;it;i+)8for(j=0;j50;j+);void Lcd_Init()uchar i;Lcd_W_Cmd(0

18、x3c);Lcd_W_Cmd(0 x0e);Lcd_W_Cmd(0 x01);Lcd_W_Cmd(0 x06);Lcd_W_Cmd(0 x80);for(i=0;istrlen(str1);i+)Lcd_W_Dat(str1i);Lcd_W_Cmd(0 xC0);for(i=0;istrlen(str2);i+)Lcd_W_Dat(str2i);uchar Lcd_R_Busy()uchar s;RW=1;delay_4_nop();RS=0;delay_4_nop();E=1;delay_4_nop();s=P0;delay_4_nop();E=0;return(s);void Lcd_W_

19、Cmd(uchar com)uchar i;doi=Lcd_R_Busy();9i=i&0 x80;delay(2);while(i!=0);RW=0;delay_4_nop();RS=0;delay_4_nop();E=1;delay_4_nop();P0=com;delay_4_nop();E=0;void Lcd_W_Dat(uchar dat)uchar i;doi=Lcd_R_Busy();i=i&0 x80;delay(2);while(i!=0);RW=0;delay_4_nop();RS=1;delay_4_nop();E=1;delay_4_nop();P0=dat;dela

20、y_4_nop();E=0;/*ds1820 程序*/void delay2us(unsigned int i)/延时 1 微秒while(-i);/*牛人实测,本人没有做过试验。针对的是 12Mhz 的晶振delay(0):延时 518us 误差:518-2*256=6delay(1):延时 7us (原帖写5us是错的)10delay(10):延时 25us 误差:25-20=5delay(20):延时 45us 误差:45-40=5delay(100):延时 205us 误差:205-200=5delay(200):延时 405us 误差:405-400=5*/*复位:主机 t0 时刻发

21、送一复位脉冲(最短为 480us 的低电平信号),接着在 t1 时刻释放总线(拉高总线电平)进入接收状态。DS18B20 在检测到总线的上升沿之后等待 1560us。接着DS18B20在 t2 时刻发出存在脉冲(持续 60240us 的低电平)*/void DS18B20_Reset()DQ=1;_nop_();DQ=0;/拉低总线delay2us(280);/持续 280*2+5=565sDQ=1;/释放总线while(DQ);/等待应答(电平拉低)while(!DQ);/应答电平大约持续 60240us 后重新拉高总线/*读字节:主机总线 t0 时刻从高拉至低电平时,总线只须保持低电平 l

22、.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,一般读数在后半段读if(DQ)temp=temp|0 x80;delay2us(2);/这里延

23、时 45us+前面 7us+1us=53us,接近 60us11return temp;/*写字节:当主机总线 t0 时刻从高拉至低电平时就产生写时间隙。从 to 时刻开始15us 之内应将所需写的位送到总线上,在随后 15-60us 间 DS18B20 对总线采样若低电平写入的位是 0;若高电平写入的位是 1,连续写 2 位间的间隙应大于 1us。注意:无论读写都是从最低位开始。*/void DS18B20_Write_Byte(uchar dat)uchar i;for(i=0;i1;/*读温度:流程:复位-写命令(跳过读序列号,单个 DS18B20 时用)-启动温度转换-等待转换完成(完

24、成总线会跳回高电平)-复位-写命令(跳过 ROM 编码命令)-读取暂存寄存器字节命令-读低字节-读高字节-复位-合并高低字节-判断正负*/DS18B20_Read_Temperature()uchar temp_low,temp_high;DS18B20_Reset();DS18B20_Write_Byte(0 xcc);DS18B20_Write_Byte(0 x44);while(!DQ);/等待转换完成DS18B20_Reset();DS18B20_Write_Byte(0 xcc);DS18B20_Write_Byte(0 xbe);temp_low=DS18B20_Read_Byte

25、();temp_high=DS18B20_Read_Byte();DS18B20_Reset();tvalue=temp_high;tvalue=(tvalue8)|temp_low;12 if(tvalue0 x0fff)tflag=0;else tvalue=tvalue+1;tflag=1;tvalue=tvalue*(0.625);/温度值扩大 10 倍,精确到 1 位小数return(tvalue);/*/void Show_Temperature()/温度值显示 uchar flagdat;disdata0=tvalue/1000+0 x30;/百位数 disdata1=tvalu

26、e%1000/100+0 x30;/十位数 disdata2=tvalue%100/10+0 x30;/个位数 disdata3=tvalue%10+0 x30;/小数位 if(tflag=0)flagdat=0 x20;/正温度不显示符号 elseflagdat=0 x2d;/负温度显示负号:-if(disdata0=0 x30)disdata0=0 x20;/如果百位为 0,不显示 if(disdata1=0 x30)disdata1=0 x20;/如果百位为 0,十位为 0 也不显示 Lcd_W_Cmd(0 xc0);Lcd_W_Dat(flagdat);/显示符号位 Lcd_W_Cmd

27、(0 xc1);Lcd_W_Dat(disdata0);/显示百位 Lcd_W_Cmd(0 xc2);Lcd_W_Dat(disdata1);/显示十位 Lcd_W_Cmd(0 xc3);Lcd_W_Dat(disdata2);/显示个位 Lcd_W_Cmd(0 xc4);Lcd_W_Dat(0 x2e);/显示小数点 Lcd_W_Cmd(0 xc5);Lcd_W_Dat(disdata3);/显示小数位13 /*主程序*/void main()Lcd_Init();/初始化显示 while(1)DS18B20_Read_Temperature();/读取温度 Show_Temperature();/显示

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
百度文库年卡

猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服