STC51单片机学习9--DS18B20温度传感器

这篇具有很好参考价值的文章主要介绍了STC51单片机学习9--DS18B20温度传感器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、DS18B20

DS18B20是Dallas半导体公司的一款数字温度传感器芯片;

DS18B20是一款支持 1-wire总线接口的温度传感器;

DS18B20能测量的温度范围-55℃--125℃,精度是±0.5℃;

DS18B20可以将分辨率设定为9到12位;

DS18B20的工作电压范围3--5.5V

二、DS18B20与STC89C51的连接

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

单片机的P4.1引脚用来接DS18B20的数据引脚


sbit DS = P4^1;

三、DS18B20的内部构成

以下是友台半导体的DS18B0结构图,内部有9个模块

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

1、电源与寄生电源

2、ROM:存DS18B20 的系列号,也就是那个64位的编码,

3、存储器控制逻辑

4、Scratchpad(高速暂存器)

高速暂存器就是用来存各种数据的,一共可以存9个字节的数据,存的就是下面5、6、7、8、9这几个模块的数据。

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

5、温度传感器

Byte0和Byte1存的是温度,就是传感器已经换算好的数字温度,Byte0是温度的低8位,Byte1是温度的高8位,上电默认的温度是0550 = 0000 0101 0101 0000 =1360, 因为默认的分辨率是12位(0.0625℃),所以开机默认的温度是1360*0.0625 ==85℃。

DS18B20采用16位补码的形式来存储温度数据,单位是摄氏度。两个字节一共是8*2=16位,温度的换算表格如下所示:

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

高字节的5个S是符号位,S=1表示温度为负,S=0表示温度为正;

12位分辨率,最后一位是1/16==0.0625,所以最小的温度分辨率是0.0625℃;

11位分辨率,最后一位是1/8==0.125,所以最小的温度分辨率是0.125℃;

10位分辨率,最后一位是1/4==0.25,所以最小分辨率是0.25℃;

9位分辨率,最后一位是1/2==0.5,所以最小分辨率是0.5℃;

正温度的读取

因为存的温度是补码,正数的原码和补码是一样的,直接读数

比如+85摄氏度:0000 0101 0101 0000 = 1360; 1360*0.0625 =85

比如+25.0625摄氏度:0000 0001 1001 0001 = 401;401*0.0625=25.0625

负温度的读取

因为存的温度是补码,负数的补码转化为原码步骤:先取反,再+1

比如-55摄氏度的补码是:1111 1100 1001 0000(高5位是符号位);

所以真实的补码为100 1001 0000;

补码取反之后,再+1;011 0110 1111+1=011 0111 0000 = 880;

880*0.0625 == 55

几个温度所对应的补码

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

6、报警触发寄存器

Byte2对应的是TH,也就是高温报警值,用户自己设置

Byte3对应的是TL,也就是低温报警值,用户自己设置

7、配置寄存器

Byte4对应的计时配置寄存器的值;

配置寄存器是用来配置温度的分辨率,可以把温度的分辨率配置为9bit、10bit、11bit、12bit,分别对应的实际温度分辨率为0.5℃、0.25℃、0.125℃、0.0625摄氏度。默认是12位分辨率(0.0625摄氏度)

配置寄存器的内容是这样的

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

温度的精度和配置

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

8、用户Byte

有两个Byte,也是留给用户自己用的,不同厂家的设计可能不一样

9、CRC

CRC发生器产生校验码,存在Byte8,是64位ROM中的前56位编码的校验码,由CRC

四、DS18B20的处理序列,也就是工作步骤

1、初始化DS18B20

初始化就是先把总线拉高;

然后检查总线上是否存在DS18B20 ,如果有的话,总线会返回一个低电平脉冲,如果没有DS18B20,那总线一直就是高电平,似乎有点像IIC通讯的应答信号。

2、执行ROM指令:

这个ROM指令就是查询DS18B20 的64位序列号,相当于设备地址,在多个DS18B20总线连接,需要区分每个DS18B20设备。如果是单个的18B20就不需要查询这个序列号了。你不查询也要发一条指令0xCC,表示跳过ROM指令。

ROM指令有哪些

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

3、执行DS18B20功能指令

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

4、DS18B20 初始化的C语言实现


void DS18b20_Init(void)
{
    bit flag=1;

    while (flag)
    {
        while (flag)
         {
             DQ = 1;
            delay(1);
             DQ = 0; //MCU拉低总线480us以上
             delay(50); // 大约550us
             DQ = 1;    // MCU释放总线,等待DS18B20的应答
             delay(6);  // 等待66us左右才开始读DS18B20的应答
             flag = DQ; // MCU读总线,只有读到低电平,才表示成功,跳出循环
           }
        delay(45);    //延时500us
        flag = ~DQ;//初始化成功了还是要释放总线,把总线拉高
    }
    DQ=1;
}

5、DS18B20数据读取

DS18B0的数据线只有1根,在这一根线上完成读和写,那就需要的时序更加严格,资源少,命就得硬。

DS18B20的读写时序

MCU 往DS18B20写一个BIT的“0”:

MCU把总线拉低,拉低时间要持续到60--120us之间,然后释放总线(释放总线,上拉电阻就把总线拉高了)。

MCU往DS18B20写一个BIT的“1”:

MCU把总线拉低,,拉低时间要大于1us,然后在15us内拉高总线。

MCU从DS18B20中读一个BIT的:

MCU先把总线拉低,DS18B20检测到总线被拉低1us后,边开始往外送数据,如果送出的是“0”,DS18B20就把总线拉低,一直到读周期结束;如果送出的是“1”,就释放总线,让上拉电阻 把总线拉高。

读一个BIT的周期至少是60us,文章来源地址https://www.toymoban.com/news/detail-520942.html

温度ds18b20,51单片机,单片机,嵌入式硬件,mcu,Powered by 金山文档

往DS18B20中写一个字节的数据


/**
 * 往DS18B20总写一个字节的数据
 * 因为DS18B20只能一个BIT一个BIT的写,所以要写一个字节就需要循环8次
*/
void write_byte(unsigned char Dat)
{
    unsigned char i;

    for (i=0; i<8; i++)
    {
        DQ = 1;//MCU把总线拉高
        _nop_(); //延时1us,STC89C52单片机,晶振12MHz,一个nop就是1us
        DQ = 0; //MCU把总线拉低
        nops(); //拉低持续4us
        DQ = Dat & 0x01;  //最低位移出
        delay(6);        //不管是0还是1,都持续66us左右
        Dat >>= 1;       //右移一位
    }
    DQ = 1;
    delay(1);  
}

从DS18B20 中读一个字节


/**
 * 从DS18B20中读一个字节的数据
 * 因为DS18B20只能一个BIT一个BIT的读,所以要读一个字节就需要循环8次
*/
unsigned char read_byte(void)
{
    unsigned char i, Dat=0;

    for (i=0; i<8; i++)
    {
        DQ=1; //MCU把总线拉高,还没开始读
        _nop_(); //
        Dat >>= 1;//每次循环数据右移1位
        DQ = 0; //MCU把总线拉低,
        nops();   //拉低尺寸4us左右
        DQ = 1; //MCU再把总线拉高,也相当于释放总线,总线的电平高低由DS18B20来控制了
        nops();   //再等待4us左右就开始读DS18B20吐出的数据
        if (DQ)
            Dat|=0x80; //一个BIT一个BIT的读
        delay(6);      //延时66us就差不多了
    }
    DQ=1; //读完成之后把总线拉高,因为空闲的时候总线hi高电平

    return(Dat);//返回一个字节的数据
}

读温度


/**
 * 读出温度
*/
void read_temp(void)
{
    DS18b20_Init();  // 器件初始化
    write_byte(0xCC); // 发Skip ROM命令
    write_byte(0x44); // 启动温度转换
    

    DS18b20_reset();//器件再初始化
    write_byte(0xCC); // 发Skip ROM命令
    write_byte(0xBE); // 发读命令

    temp_data[0]=read_byte();  //读温度低8位
    temp_data[1]=read_byte();  //读温度高8位
}

到了这里,关于STC51单片机学习9--DS18B20温度传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机(十三)DS18B20温度传感器

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(34)
  • MCU-51:单片机DS18B20温度报警器

    DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点 测温范围:-55°C 到 +125°C 通信接口:1-Wire(单总线) 其它特征:可形成总线结构、内置温度报警功能、

    2024年02月02日
    浏览(46)
  • 53、基于STC15W单片机的温度计(DS18B20)(Proteus仿真+程序)

          本设计由STC15W4K32S4单片机+DS18B20温度传感器+1602液晶显示模块+串口模块组成。 1、主控制器是STC15W4K32S4单片机 2、DS18B20温度传感器采集温度,精度0.1摄氏度 3、1602液晶显示温度。 4、测温范围-55~110摄氏度,误差±0.1℃ 5、温度值发送至串口助手显示。 Proteus软件: Proteus

    2024年02月03日
    浏览(52)
  • 基于51单片机多路温度检测proteus仿真 ds18b20

    本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 功能说明: 通过对多路DS18B20温度传感器的数据采集,实现8路/4路温度采集并将数值显示在LCD显示屏上; 通过按键设置温度报警

    2024年02月12日
    浏览(40)
  • 【小实验】C51单片机 DS18B20温度显示实验

         利用单总线技术和数码管动态显示的原理,要求实现DS18B20温度采集并显示,能够设定温度值上限值27.5度,当超出上限值LED灯闪烁。    实验前可先用protues绘制出原理图:   代码仅供参考,希望大家能够在此基础上优化代码,而不是ctrl+c,ctrl+v。 谢谢!!!        

    2024年02月12日
    浏览(37)
  • 基于51单片机数字温度报警器_DS18B20可调上下限

    (仿真+程序+原理图) 原理图:Altium Designer 仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0009 1、实时温度测量及显示,超出温度范围声光报警,上下限温度可通过按键设定等功能; 2、温度测量范围0到99.9摄氏度,精度为0.1摄氏度; 3、可设置上下

    2024年02月06日
    浏览(36)
  • 基于51单片机的DS18B20温度控制加热降温系统设计

    仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0007 结合实际情况,基于51单片机设计一个排队叫号系统设计。该系统应满足的功能要求为: 系统由51单片机、DS18B20温度传感器、LCD1602液晶显示屏、继电器、风扇、加热膜、按键、蜂鸣器组成。 可实现以下基本功能

    2023年04月09日
    浏览(71)
  • 51单片机DS18B20温度报警器proteus仿真设计_可调上下限

    (仿真+源码+原理图+报告+讲解视频) 原理图:Altium Designer 仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0008 本设计系统是18b20温度报警系统数码管显示,可设置温度上限高温报警和下限低温报警,报警温度可精确到0.1度,并具有掉电保存功能,数

    2024年02月11日
    浏览(32)
  • 单片机学习笔记---DS18B20温度读取

    目录 OneWire.c 模拟初始化的时序 模拟发送一位的时序  模拟接收一位的时序 模拟发送一个字节的时序 模拟接收一个字节的时序 OneWire.h DS18B20.c DS18B20数据帧 模拟温度变换的数据帧 模拟温度读取的数据帧 DS18B20.h main.c 上一篇讲了DS18B20温度传感器的工作原理,这节开始代码演示

    2024年02月20日
    浏览(37)
  • 51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解

    温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码。请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅! 主函数操作顺序(执行序列) 功能指令 最后希望我的分享对你有所帮助!敬请关

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包