历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2020年03月28日 | stm32---DS18b20

2020-03-28 来源:eefocus

一个一线接口的温度传感器

DS18B20 发送所有的命令和数据都是字节的低位在前

每个器件都有自己的地址序列号

可以设置测量精度有四种,9---12位(0.5℃,0.25℃,0.125℃和 0.0625℃。),出场默认12位最高精度


高5位是0-->温度大于0, 高5位是1-->温度小于0

12位精度时,测量温度大于0,温度 = 测量数值 x 0.0625;

测量温度小于0, 温度 = (测量数值取反+1) x 0.0625


初始化时序

复位 : 引脚配置为输出模式。主机输出低电平 时间 480us ~ 960us,以产生复位脉冲后输出高电平线延时 15~60 us。

检查 :引脚配置为接收模式。接着 DS18B20 拉低总线 60~240 us,以产生低电平应答脉冲,若为低 电平,还要做延时,其延时的时间从外部上拉电阻将单总线拉高算起最少要 480 us


写1 :主机输出低电平延时2us,然后输出高电平延时60us

写0 :主机输出高电平延时60us,然后输出低电平延时2us


读时序:主机输出低电平延时 2us,然后主机转入输入模式延 时 12us,然后读取单总线当前的电平,然后延时 50us。


DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令( 0XCC)→发开始 转换命令( 0X44)→延时→复位→发送 SKIP ROM 命令( 0XCC)→发读存储器 命令( 0XBE)→连续读出两个字节数据(即温度)→结束。


ds18b20.c


#include "ds18b20.h"

#include "SysTick.h"

 

/*******************************************************************************

* 函 数 名         : DS18B20_IO_IN

* 函数功能         : DS18B20_IO输入配置    

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void DS18B20_IO_IN(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure;

    

    GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入

    GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);

}

 

/*******************************************************************************

* 函 数 名         : DS18B20_IO_OUT

* 函数功能         : DS18B20_IO输出配置    

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void DS18B20_IO_OUT(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure;

    

    GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);

}

 

/*******************************************************************************

* 函 数 名         : DS18B20_Reset

* 函数功能         : 复位DS18B20  

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void DS18B20_Reset(void)       

{                 

    DS18B20_IO_OUT(); //SET PG11 OUTPUT

    DS18B20_DQ_OUT=0; //拉低DQ

    delay_us(750);    //拉低750us

    DS18B20_DQ_OUT=1; //DQ=1 

    delay_us(15);     //15US

}

 

/*******************************************************************************

* 函 数 名         : DS18B20_Check

* 函数功能         : 检测DS18B20是否存在

* 输    入         : 无

* 输    出         : 1:未检测到DS18B20的存在,0:存在

*******************************************************************************/

u8 DS18B20_Check(void)     

{   

    u8 retry=0;

    DS18B20_IO_IN();//SET PG11 INPUT     

    while (DS18B20_DQ_IN&&retry<200)

    {

        retry++;

        delay_us(1);

    };

    if(retry>=200)return 1;

    else retry=0;

    while (!DS18B20_DQ_IN&&retry<240)

    {

        retry++;

        delay_us(1);

    };

    if(retry>=240)return 1;     

    return 0;

}

 

/*******************************************************************************

* 函 数 名         : DS18B20_Read_Bit

* 函数功能         : 从DS18B20读取一个位

* 输    入         : 无

* 输    出         : 1/0

*******************************************************************************/

u8 DS18B20_Read_Bit(void)            // read one bit

{

    u8 data;

    DS18B20_IO_OUT();//SET PG11 OUTPUT

    DS18B20_DQ_OUT=0; 

    delay_us(2);

    DS18B20_DQ_OUT=1; 

    DS18B20_IO_IN();//SET PG11 INPUT

    delay_us(12);

    if(DS18B20_DQ_IN)data=1;

    else data=0;     

    delay_us(50);           

    return data;

}

 

/*******************************************************************************

* 函 数 名         : DS18B20_Read_Byte

* 函数功能         : 从DS18B20读取一个字节

* 输    入         : 无

* 输    出         : 一个字节数据

*******************************************************************************/

u8 DS18B20_Read_Byte(void)    // read one byte

{        

    u8 i,j,dat;

    dat=0;

    for (i=1;i<=8;i++) 

    {

        j=DS18B20_Read_Bit();

        dat=(j<<7)|(dat>>1);

    }                           

    return dat;

}

 

/*******************************************************************************

* 函 数 名         : DS18B20_Write_Byte

* 函数功能         : 写一个字节到DS18B20

* 输    入         : dat:要写入的字节

* 输    出         : 无

*******************************************************************************/

void DS18B20_Write_Byte(u8 dat)     

{             

    u8 j;

    u8 testb;

    DS18B20_IO_OUT();//SET PG11 OUTPUT;

    for (j=1;j<=8;j++) 

    {

        testb=dat&0x01;

        dat=dat>>1;

        if (testb) 

        {

            DS18B20_DQ_OUT=0;// Write 1

            delay_us(2);                            

            DS18B20_DQ_OUT=1;

            delay_us(60);             

        }

        else 

        {

            DS18B20_DQ_OUT=0;// Write 0

            delay_us(60);             

            DS18B20_DQ_OUT=1;

            delay_us(2);                          

        }

    }

}

 

/*******************************************************************************

* 函 数 名         : DS18B20_Start

* 函数功能         : 开始温度转换

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void DS18B20_Start(void)// ds1820 start convert

{                                          

    DS18B20_Reset();       

    DS18B20_Check();     

    DS18B20_Write_Byte(0xcc);// skip rom

    DS18B20_Write_Byte(0x44);// convert

 

/*******************************************************************************

* 函 数 名         : DS18B20_Init

* 函数功能         : 初始化DS18B20的IO口 DQ 同时检测DS的存在

* 输    入         : 无

* 输    出         : 1:不存在,0:存在

*******************************************************************************/     

u8 DS18B20_Init(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure;

 

    RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);

 

    GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

    GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);

 

    DS18B20_Reset();

    return DS18B20_Check();

}  

 

/*******************************************************************************

* 函 数 名         : DS18B20_GetTemperture

* 函数功能         : 从ds18b20得到温度值

* 输    入         : 无

* 输    出         : 温度数据

*******************************************************************************/ 

float DS18B20_GetTemperture(void)

{

    u16 temp;

    u8 a,b;

    float value;

    DS18B20_Start();                    // ds1820 start convert

    DS18B20_Reset();

    DS18B20_Check();     

    DS18B20_Write_Byte(0xcc);// skip rom

    DS18B20_Write_Byte(0xbe);// convert     

    a=DS18B20_Read_Byte(); // LSB   

    b=DS18B20_Read_Byte(); // MSB   

推荐阅读

史海拾趣

电连(ECT)公司的发展小趣事

ECT在射频连接器领域取得了显著的技术突破。从2006年到2008年,公司开始研发射频同轴连接器,并在2009年实现精密射频同轴连接器的量产,并成功获得专利。这一技术突破为ECT在射频连接器市场赢得了重要地位,也为公司后续的发展奠定了坚实的基础。

泽耀科技(Ashining)公司的发展小趣事

随着市场的不断变化和消费者需求的升级,泽耀科技(Ashining)意识到只有不断创新才能在竞争中立于不败之地。公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多次尝试和实验,泽耀科技成功突破了某项关键技术,并推出了升级版的产品。这些新产品不仅性能更加优越,而且具有更高的性价比,深受消费者的喜爱。

Advanced Power Solutions公司的发展小趣事

Advanced Power Solutions公司非常重视人才培养和企业文化建设。公司注重员工的职业发展和培训,为员工提供了广阔的职业发展空间和学习机会。同时,公司还倡导开放、创新的企业文化,鼓励员工提出新的想法和建议。这种积极向上的企业文化吸引了大量优秀人才的加入,也为公司的持续发展提供了强大的动力。

以上五个故事框架仅用于说明Advanced Power Solutions公司可能的发展路径和成就,并不代表公司的实际历史。在实际撰写时,需要根据公司的具体情况进行调整和补充。

Atmel (Microchip)公司的发展小趣事

为了进一步扩大市场份额和拓展应用领域,Atmel(Microchip)积极与其他企业开展合作。公司与多家知名企业建立了战略合作关系,共同推动微控制器及相关技术在各个领域的应用。通过与合作伙伴的紧密合作,Atmel的产品已经广泛应用于工业、消费、安全、通信、计算和汽车等多个领域,为这些领域的发展提供了强有力的支持。

这五个故事旨在展现Atmel(Microchip)在电子行业中的发展历程和成就,涵盖了从创业初期到被收购后的不同阶段。通过这些故事,我们可以看到Atmel(Microchip)如何凭借技术创新、市场拓展和合作发展,逐渐成为了微控制器领域的领军企业。

Helium公司的发展小趣事

为了进一步提升网络性能和用户体验,Helium团队自主编译并开源了LongFi协议。这一协议能够将物联网主流LoRaWAN无线协议应用到Helium区块链应用层,实现了物联网与区块链的深度融合。LongFi协议的推出不仅提高了数据传输的效率和稳定性,还降低了物联网设备的能耗和成本。这一技术创新为Helium赢得了更多用户和合作伙伴的信任和支持,推动了其业务的持续发展。

友盟(AP)公司的发展小趣事

友盟(AP)公司的发展,也离不开与众多合作伙伴的紧密合作。公司始终坚持开放、合作的理念,积极寻求与各行各业的合作机会。通过与手机厂商、应用开发者、广告商等建立合作关系,友盟成功将自身的技术优势和数据分析能力转化为商业价值。同时,友盟也通过合作伙伴的支持和反馈,不断优化产品和服务,实现了与合作伙伴的共赢发展。

问答坊 | AI 解惑

做单片机都需要什么设备?

麻烦请教论坛的各位:做单片机开发都需要什么设备? 先谢谢大家了…

查看全部问答>

【藏书阁】模拟电子技术基础实验与课程设计

目录: 第一编 模拟电子技术基础实验基本知识 第一章 概述 第二章 实验程序 第三章 模拟电子技术基础实验常用仪器使用练习 第四章 万用表对常用电子元器件的检测 第五章 集成运算放大器的主要参数测试 第六章 电路故障分析、排除及抗干扰 ...…

查看全部问答>

有没有用过几元的AD芯片?

现在发现很多AD芯片价格都降不下来, 有没有用过几元的,请推荐一下…

查看全部问答>

状态机改写

parameter idle=00,           jia=01,           cheng=11,           yuan=10;               & ...…

查看全部问答>

划滑驱动自行车

自行车是两个轮子的,可这辆车却又四个轮子,而它确实是不用其他动力驱动的自行车。仔细看它更觉得是船儿和自行车的结合,躺坐在车里划着浆,车就开始跑了。   发明目的;运动健身和交通工具的结合。…

查看全部问答>

请各位推荐有关交流采样的书?

我在研究交流采样程序,对这方面有些一头雾水,忘各位推荐一些初级的书/…

查看全部问答>

请问各位wince的资源管理器有没有右键菜单?

在win32下,资源管理器里右击一个文件会弹出一个菜单。那在wince下有这个功能吗? 我试了半天也没搞出来。强烈怀疑没这个功能。 …

查看全部问答>

信号切换问题

A,B两路信号选择一路通过,当然这是两路都有信号的情况,如果只有一路有就直接让它通过就是了.现在我用的是ls123触发器来判断哪路有信号但是试验板做出来老是有问题不知道还有没有别的什么思路不用ls123触发器.谢谢希望高手指点…

查看全部问答>

DS1302有关问题求指教

在定入单字节中为什么是for(i=0;i>1;         sck=1;         }这个时候的SDA是怎么样放的,为什么是与上0X01呢?而读出单字节的for(i=0;i>1;               &nbs ...…

查看全部问答>

一些下载的资料拿来分享

一些下载的资料拿来分享…

查看全部问答>