读取温度传感器DS18B20的实例

发布者:快乐心跳最新更新时间:2018-06-20 来源: eefocus关键字:温度传感器  DS18B20 手机看文章 扫描二维码
随时随地手机看文章

配置IO引脚


#define DS18B20         BIT4                      //配置IO引脚

#define DS18B20_HIGH    P2OUT |= BIT4

#define DS18B20_LOW     P2OUT &= ~BIT4


精确延时宏代码


#define CPU_CLOCK       8000000UL               //MCLK设为8MHz                

#define delay_us(us)    __delay_cycles(CPU_CLOCK/1000000*(us))

#define delay_ms(ms)    __delay_cycles(CPU_CLOCK/1000*(ms))


求二进制小数部分的查表


const int N16Tab[16]={      //用于求二进制小数部分查表

    0,

    625,

    1250,

    1875,

    2500,

    3125,

    3750,

    4375,

    5000,

    5625,

    6250,

    6875,

    7500,

    8125,

    8750,

    9375

};


复位


/*

**********************************************************************

* 名  称:DS18B20_init()

* 功  能:复位DS18B20

* 入口参数:无

* 出口参数:1--存在,0--不存在

* 说  明:需要配置IO,软件延时要准确

* 范  例:无

**********************************************************************

*/

char DS18B20_Reset(void)

{

        int i;

        char e;

        //-------拉低-----------------------------------   

        P2DIR |= DS18B20;                       //配置为输出

        DS18B20_LOW;                            //拉低


        //-------等待480微秒以上----------------------------

        delay_us(540);          //只少等待480微秒以上


        //-------拉高-----------------------------------

        P2DIR &= ~DS18B20;                      //配置为输入

        P2REN |=DS18B20;                        //启用电阻

        DS18B20_HIGH;                           //上拉


        //-------等待15微秒---------------------------------

        delay_us(15);


        //-------检测存在-------------------------------------------

        i=0;

        e=0;

        while(1)

        {

            if((P2IN & DS18B20)==0)

            {   

                e=1;

                break; 

            }

            delay_us(1);

            i++;

            if(i>60)

            {

                break;   

            }

        }


        //------------延时480微秒以上---------------------------------

        delay_us(500);

        return e;


读字节


/*

**********************************************************************

* 名  称:DS18B20_ReadByte()

* 功  能:读位字

* 入口参数:无

* 出口参数:返回从DS18B20读回的一个字节

* 说  明:需要配置IO,软件延时要准确

* 范  例:无

**********************************************************************

*/

unsigned char DS18B20_ReadByte(void)

{

    unsigned char i,retd=0;

    for(i=0;i<8;i++)            //位计数值

    {

        retd>>=1;               //右移,准备接受新的数据位


        //-------拉低总线5微秒--------------------------

        P2DIR |=DS18B20;        //配置为输出

        DS18B20_LOW;            //拉低,启动读数据位

        delay_us(5);        //等待5微秒


        //-------释放总线-----------------------------------

        P2DIR &= ~DS18B20;      //配置为输入

        P2REN |=DS18B20;        //启用电阻

        DS18B20_HIGH;           //上拉


        //-------等待15微秒-----------------------------

        delay_us(15);       //等待15微秒


        //-------检查该位是否为高-----------------------

        if(P2IN&DS18B20)        //该位是否为高

        {

            retd|=0x80;     //是就将此位置高

        }


        //-------等待42微秒-----------------------------

        delay_us(42);       //等待42微秒

    }

    return retd;                //将读到的一个字节返回

}


写字节


/*

**********************************************************************

* 名  称:DS18B20_WriteByte()

* 功  能:写字节

* 入口参数:无

* 出口参数:无

* 说  明:需要配置IO,软件延时要准确

* 范  例:无

**********************************************************************

*/

void DS18B20_WriteByte(unsigned char wrd)

{

    unsigned char i;


    for(i=0;i<8;i++)            //位计数值

    {

        if(wrd&0x01)            //此位数据是否为高

        {

              //-------拉低总线5微秒--------------------------

              P2DIR |=DS18B20;        //配置为输出

              DS18B20_LOW;  

              delay_us(5);


              //-------拉高总线60微秒----------------------------------

              P2DIR &= ~DS18B20;//配置为输入

              P2REN |=DS18B20;  //启用电阻

              DS18B20_HIGH;     //上拉

              delay_us(60);

        }

        else

        {

              //-------拉低总线60微秒----------------------------------

              P2DIR |=DS18B20;  //配置为输出

              DS18B20_LOW;      //是低则将单总线拉低

              delay_us(60);


              //-------拉高总线5微秒-----------------------------------

              P2DIR &= ~DS18B20;//配置为输入

              P2REN |=DS18B20;  //启用电阻

              DS18B20_HIGH;     //上拉

              delay_us(5);

        }



        //-------等待1微秒以上-------------------------------

        delay_us(2);


        //-------右移1位-------------------------------------

        wrd>>=1;                //右移,为写入新的数据位做准备

    }


}


读温度


一次完整的读温度流程.


/*

**********************************************************************

* 名  称:DS18B20_ReadTemp()

* 功  能:读温度

* 入口参数:无

* 出口参数:返回温度值

* 说  明:需要配置IO,软件延时要准确

* 范  例:无

**********************************************************************

*/

char e;

int DS18B20_ReadTemp()

{

    unsigned char buff[9];

    unsigned char i;

    //unsigned char a,b,c;


    //------MCLK设置为8MHz------------

    DCOCTL=CALDCO_8MHZ;

    BCSCTL1=CALBC1_8MHZ;


    e=DS18B20_Reset();          //初始化,每次写命令都从初始化开始

    DS18B20_WriteByte(0xcc);        //跳过ROM

    DS18B20_WriteByte(0x44);        //启动温度转换

    delay_ms(750);                  //延时750us

    e=DS18B20_Reset();              //初始化,每次写命令都从初始化开始

    DS18B20_WriteByte(0xcc);        //跳过ROM


    DS18B20_WriteByte(0xbe);        //送读寄存器命令


    //-----连续读入9个-----------------

    for(i=0;i<9;i++)

    {

        buff[i]=DS18B20_ReadByte();   //读寄存器

    }


    /*

    //---------计算温度----------------------------------------------------

    a=buff[0]&0x0f;

    if((buff[1]&0x80) != 0)

    {

            a=~a;

            a=a&0x0f;

            a+=1;

    }

    *fDat=N16Tab[a];      //得到小数部分


    b=buff[0]>>4;

    c=buff[1]<<4;

    c|=b;

    *iDat=c;              //得到整数部分

    */


    //-----MCLK设置为1MHz-----------

    DCOCTL=CALDCO_1MHZ;

    BCSCTL1=CALBC1_1MHZ;


    return ((int*)buff)[0];

}


计算温度值


由二进制数据,得到整数部分iDat,小数部分fDat.


void Calc_Temp(int Hex,char *iDat,int *fDat)

{

    unsigned char a,b,c;

    char hi,lo;

    lo=Hex;

    hi=Hex>>8;

    //---------计算温度----------------------------------------------------

    a=lo&0x0f;

    if((hi&0x80) != 0)

    {

        a=~a;

        a=a&0x0f;

        a+=1;

    }

    *fDat=N16Tab[a];      //得到小数部分


    b=lo>>4;

    c=hi<<4;

    c|=b;

    *iDat=c;              //得到整数部分

}


关键字:温度传感器  DS18B20 引用地址:读取温度传感器DS18B20的实例

上一篇:关于DS18B20温度传感器的时序详解及代码分析
下一篇:DS18B20温度传感器完整C程序

推荐阅读最新更新时间:2024-03-16 16:06

基于STM8的DS18B20检测
最近要鼓捣出5V的ds18b20用stm8采集,网上一搜发现大部分都是把数据端直接接到3.3的引脚,我也这么做的。 用的DS18B20为淘宝外面有钢管的那种,系统板为STM8L051,第一次接触stm8先去找的库函数,以附件形式粘贴到下面。用IAR建工程一搜一大把。 单总线协议因为只有一条线,时序很重要,肯定要使用延时函数,用的原子哥的延时函数,,照搬原子哥的代码:http://www.openedv.com/posts/list/17347/htm 记得定义头文件时加上 #include stm8l15x_conf.h ,不然会报错 #include delay.h volatile u8 fac_us=0;
[单片机]
基于STM8的<font color='red'>DS18B20</font>检测
基于ATmega16单片机的实时温度采集与分析系统
随着 计算机 技术尤其是单片微型机技术的发展,温度对人们的生活与工作影响很大,所以要实时采集温度并且对其进行分析。为此,实现实时准确的测量监控。采用串口传送数据并且在PC机上进行分析。由于单片机的控制方便、简单和灵活等优点,采用了高性能avr单片机来控制GTJ4-10A固态继电器,最总实现温度的控制。从而最总在PC机上绘制温度曲线并保存数据和分析温度的数据。 1 系统组成及基本原理 本系统由温度采集模块,固态继电器控制模块,单片机模块,PC机软件处理模块。4个模块加起来实现温度的控制,以及温度采集和温度经过软件处理的分析。它们的逻辑关系如图1所示。 图1 逻辑关系图 本系统的任务是对某种特定环境的温度进行采集并进行保存
[单片机]
基于ATmega16与温度传感器相结合的实时温度采集与分析系统
随着计算机技术尤其是单片微型机技术的发展,温度对人们的生活与工作影响很大,所以要实时采集温度并且对其进行分析。为此,实现实时准确的测量监控。采用串口传送数据并且在PC机上进行分析。由于单片机的控制方便、简单和灵活等优点,采用了高性能avr单片机来控制GTJ4-10A固态继电器,最总实现温度的控制。从而最总在PC机上绘制温度曲线并保存数据和分析温度的数据。 1 系统组成及基本原理 本系统由温度采集模块,固态继电器控制模块,单片机模块,PC机软件处理模块。4个模块加起来实现温度的控制,以及温度采集和温度经过软件处理的分析。它们的逻辑关系如图1所示。 本系统的任务是对某种特定环境的温度进行采集并进行保存和再显示,通
[单片机]
基于ATmega16与<font color='red'>温度传感器</font>相结合的实时温度采集与分析系统
TMP411 - 具备 N 系数与串联电阻校正功能的 +/-1 °C 远程与本地温度传感器
TMP411 是一种具备内置本地温度传感器的远程温度传感监控器。通常来说,与远程温度传感器通过二极管连接的晶体管为低成本 NPN 型或 PNP 型晶体管或二极管,它们是微控制器、微处理器或 FPGA 不可或缺的一部分。 该产品无需校准即可为多个 IC 制造商实现 ±1°C 的远程精确度。双线串行接口能够接收SMBus 写入字节、读取字节、发送字节与接收字节命令,以便设定报警阈值并读取温度数据。 TMP411 有很多特性,其中包括:串联电阻抵消、可编程非理想性系数、可编程精度、可编程阈值限制、最低温度与最高温度监控器、宽泛的远程温度测量范围(高达 +150°C)、二极管故障检测以及温度报警功能。 TMP411 采用 MSOP-
[新品]
ams高精度的数字温度传感器,可实现皮肤温度的精准测量
高性能传感器解决方案供应商艾迈斯半导体宣布推出全球最高精度的数字温度传感器AS6221。 AS6221可在20°C至42°C的温度范围内实现±0.09°C的测量精度,适合测量人体及皮肤温度。而当今市场上,尚未有任何其他同类数字温度传感器能够实现优于±0.10°C测量精度。 AS6221采用WLCSP封装,尺寸仅为1.5 mm x 1 mm,输出数据速率为4Hz时功耗为6µA,待机模式下功耗仅为0.1µA。 这种紧凑型超低功耗高性能传感器非常适合采用电池供电的便携式可穿戴电子设备,例如健康状态或健身监测腕带,以及智能手表等。另外,在高端计算系统和服务器中,它还可用来精确调节处理器的运行状况,在避免过热的情况下最大程度
[传感器]
ams高精度的数字<font color='red'>温度传感器</font>,可实现皮肤温度的精准测量
制冷系统和制冷机一样吗 制冷系统和制冷机的工作原理
制冷系统和制冷机一样吗 制冷系统和制冷机并不完全相同,它们是相关但不同的概念。 制冷机是指用于提供冷却效果的设备,它可以从低温环境中吸热,并将热量传递到高温环境中,以实现冷却效果。常见的制冷机包括冰箱、空调和制冷设备等。 而制冷系统是指由多个组件和设备组成的整体系统,旨在实现冷却效果。制冷系统通常包括制冷机、冷却剂、压缩机、冷凝器、蒸发器和控制装置等多个组成部分。这些部件相互协作,通过循环过程来实现热量的转移和冷却效果的达成。 制冷机是制冷系统的核心部分,负责循环和转移热量。而制冷系统的其他组件,如冷凝器、蒸发器、控制装置等,则与制冷机配合运作,以实现整体的冷却效果。 因此,制冷机只是制冷系统的一个组件,而制冷系统是一个更综合的概
[嵌入式]
STM32系列第19篇--内部温度传感器
简介: STM32有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA)。 特点: 该温度传感器在内部和ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值 温度传感器模拟输入推荐采样时间是17.1μs STM32的内部温度传感器支持的温度范围为:-40~125度。精度比较差,为±1.5℃左右 内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量绝度温度,应该使用一个外部温度传感器,如DS18B20 使用注意事项: 第一个地方,我们要使用STM32的内部温度传感器,必须先激活ADC的内部通道,这里通过ADC_CR2的TSVREFE位(bit23)设置。设置该位为1则启用内部温度
[单片机]
AT89C52单片机与DS18B20的接口电路及源代码
本文将介绍51单片机AT89C52与温度传感器芯片DS18B20构成测温系统,并提供源程序供读者参考.其测量的温度精度达到0.1度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。 硬件电路原理图 图2 AT89S52与DS18B20组成的测温系统原理图 工作原理 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20产品的特点 (1)、只要求一个I/O口即可实现通信。 (2)、在DS18B20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任
[单片机]
AT89C52单片机与<font color='red'>DS18B20</font>的接口电路及源代码
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved