找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5464|回复: 2
打印 上一主题 下一主题
收起左侧

单片机读取ds18b20温度值并定时通过串口和数码管显示

  [复制链接]
跳转到指定楼层
楼主
   本次实验我们在了解温度传感器的工作原理里同时可以初步了解如何下那个上位机发送数据并显示出来。   DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点


   传感器参数:   
     测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4°。返回16位二进制温度数值。
     主机和从机通信使用单总线,即使用单线进行数据的发送和接收
     在使用中不需要任何外围元件,独立芯片即可完成工作。
     掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
     每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值
     宽电压供电,电压2.5V~5.5V
      DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。

传感器引脚及原理图
  DS18B20传感器的引脚及封装图如下:


DS18B20一共有三个引脚,分别是:
       GND:电源地线    DQ:数字信号输入/输出端。   VDD:外接供电电源输入端。

       单个DS18B20接线方式: VDD接到电源,DQ接单片机引脚,同时外加上拉电阻,GND接地
       注意这个上拉电阻是必须的,就是DQ引脚必须要一个上拉电阻

总结:
       开漏输出只能输出低电平,不能输出高电平。漏极开路输出高电平时必须在输出端与正电源(VCC)间外接一个上拉电阻。否则只能输出高阻态。
DS18B20 是单线通信,即接收和发送都是这个通信脚进行的。 其接收数据时为高电阻输入,其发送数据时是开漏输出,本身不具有输出高电平的能力,即输出0时通过MOS下拉为低电平,而输出1时,则为高阻,需要外接上拉电阻将其拉为高电平。 因此,需要外接上拉电阻,否则无法输出1。
外接上拉电阻阻值:
      DS18B20的工作电流约为1mA,VCC一般为5V,则电阻R=5V/1mA=5KΩ,
      所以正常选择4.7K电阻,或者相近的电阻值。
DS18B20寄生电源

        DSl8B20的另一个特点是不需要再外部供电下即可工作。当总线高电平时能量由单线上拉电阻经过DQ引脚获得。高电平同时充电一个内部电容,当总线低电平时由此电容供应能量。这种供电方法被称为“寄生电源”。另外一种选择是DSl8B20由接在VDD的外部电源供电
DS18B20内部构成
        主要由以下3部分组成: 64 位ROM,高速暂存器,存储器
64 位ROM存储独有的序列号
        ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。这样就可以实现一根总线上挂接多个DS18B20的目的。
高速暂存器包含:
     温度传感器
     一个字节的温度上限和温度下限报警触发器(TH和TL)
     配置寄存器允许用户设定9位,10位,11位和12位的温度分辨率,分别对应着温度的分辨率为:0.5°C,0.25°C,0.125°C,0.0625°C,默认为12位分辨率,
存储器:由一个高速的RAM和一个可擦除的EEPROM组成,EEPROM存储高温和低温触发器(TH和TL)以及配置寄存器的值,(就是存储低温和高温报警值以及温度分辨率)


DS18B20高速缓存器
高速暂存器由9个字节组成
       字节0~1 是温度存储器,用来存储转换好的温度。第0个字节存储温度低8位,第一个字节存储温度高8位
       字节2~3 是用户用来设置最高报警和最低报警值(TH和TL)。
       字节4 是配置寄存器,用来配置转换精度,可以设置为9~12 位。
       字节5~7 保留位。芯片内部使用
       字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。
DS18B20温度读取与计算
       DS18B20采用16位补码的形式来存储温度数据,温度是摄氏度。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
      高字节的五个S为符号位,温度为正值时S=1,温度为负值时S=0
      剩下的11位为温度数据位,对于12位分辨率,所有位全部有效,对于11位分辨率,位0(bit0)无定义,对于10位分辨率,位0和位1无定义,对于9位分辨率,位0,位1,和位2无定义
对应的温度计算:
      当五个符号位S=0时,温度为正值,直接将后面的11位二进制转换为十进制,再乘以0.0625(12位分辨率),就可以得到温度值;
      当五个符号位S=1时,温度为负值,先将后面的11位二进制补码变为原码(符号位不变,数值位取反后加1),再计算十进制值。再乘以0.0625(12位分辨率),就可以得到温度值;
      例如:
            +125℃的数字输出07D0(00000111 11010000)
          转换成10进制是2000,对应摄氏度:0.0625x2000=125°C
            -55℃的数字输出为 FC90。
        首先取反,然后+1,转换成原码为:11111011 01101111
            数值位转换成10进制是870,对应摄氏度:-0.0625x870=-55°C


代码:

unsigned int Templ,Temp2,Temperature;  //Templ低八位,Temp2高八位
unsigned char Minus Flag=0;  //负温度标志位

if(Tenp2&0xFC)//判断符号位是否为1
{
        Minus Flag=l; //负温度标志位置1
        Temperature=((Temp2<<8)|Temp1); //高八位第八位进行整合
        Temperature=((Temperature)+1); //讲补码转换为原码,求反,补1
        Temperature*=0.0625;//求出十进制
}
else   //温度为正值
{
        Minus Flag=0;  //负温度标志位置0
        Temperature =((Temp2<<8) |Temp1)*0.0625;
}

配置寄存器
      在配置寄存器中,我们可以通过R0和R1设置DS18B20的转换分辨率,DS18B20在上电后默认R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留给设备内部使用。
单总线系统
      在每个DS18B20内部都有一个唯一的64位长的序列号,这个序列号值就存在DS18B20内部的ROM中。开始的8位是产品类型编码(DS18B20是10H),接着的48位是每个器件唯一的序号,最后的8位是CRC校验码。
      一线总线系统使用单总线主控来控制一个或多个从机设备。每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值。
DS18B20工作步骤
   DS18B20的工作步骤可以分为三步:
       1.初始化DS18B20
       2.执行ROM指令
       3.执行DS18B20功能指令
       其中第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。
      1.初始化DS18B20
      任何器件想要使用,首先就是需要初始化,对于DS18B20单总线设备,首先初始化单总线为高电平,然后总线开始也需要检测这条总线上是否存在DS18B20这个器件。如果这条总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平。
初始化具体时序步骤如下:
       1.单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)。
       2.这时DS8B20检测到请求之后,会拉低信号,大约60~240us表示应答。
       3.DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功
       4.DS18B20拉低电平60~240us之后,会释放总线。

代码如下:
/*****初始化DS18B20*****/
unsigned int Init_DS18B20(void)
{
  unsigned int x=0;
  DQ = 1;      //DQ复位
  delay(4);    //稍做延时
  DQ = 0;      //单片机将DQ拉低
  delay(60);   //精确延时,大于480us
  DQ = 1;      //拉高总线
  delay(8);
  x = DQ;      //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  delay(4);
  return x;
}
2.写时序
      总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。每次只传输1位数据
      单片机想要给DS18B20写入一个0时,需要将单片机引脚拉低,保持低电平时间要在60~120us之间,然后释放总线;单片机想要给DS18B20写入一个1时,需要将单片机引脚拉低,拉低时间需要大于1us,然后在15us内拉高总线。
      在写时序起始后15μs到60μs期间,DS18B20处于采样单总线电平状态。如果在此期间总线为高电平,则向DS18B20写入1;如果总线为低电平,则向DSl8B20写入0。
      注意:2次写周期之间至少间隔1us
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;  //与1按位与运算,dat最低位为1时DQ总线为1,dat最低位为0时DQ总线为0
        delay(4);
    DQ = 1;
    dat>>=1;
  }
  delay(4);
}
DS18B20写入的功能命令:
ROM指令:
       采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
       如果是单个DS18B20,直接写跳过ROM指令0xCC即可
       RAM指令,DS18B20的一些功能指令
       常用的是:
       温度转换 0x44
       开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中
       读取温度 0xBE
       读取高速暂存器存储的数据
读时序:读时隙由主机拉低总线电平至少1μs然后再释放总线,读取DS18B20发送过来的1或者0
       DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。
       注意:所有读时隙必须至少需要60us,且在两次独立的时隙之间至少需要1ps的恢复时间
       同时注意:主机只有在发送读暂存器命令(0xBE)或读电源类型命令(0xB4)后,立即生成读时隙指令,DS18B20才能向主机传送数据。 也就是先发读取指令,再发送读时隙
       最后一点: 写时序注意是先写命令的低字节,比如写入跳过ROM指令0xCC(11001100),写的顺序是“零、零、壹、壹、零、零、壹、壹”,
读时序时是先读低字节,在读高字节,也就是先读取高速暂存器的第0个字节(温度的低8位),在读取高速暂存器的第1个字节(温度的高8位) 我们正常使用DS18B20读取温度读取两个温度字节即



全部资料51hei下载地址:
读温度值串口ds18b20.7z (60 KB, 下载次数: 124)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:891154 发表于 2022-11-27 10:44 | 只看该作者
没有用.....
回复

使用道具 举报

板凳
ID:262 发表于 2022-11-27 14:34 | 只看该作者
楼上有用啊 我仿真结果如下

51hei.gif (57.24 KB, 下载次数: 56)

51hei.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表