历史上的今天

今天是:2024年09月17日(星期二)

2021年09月17日 | STM8单片机读取18B20温度传感器

发布者:创意旋律 来源: eefocus关键字:STM8  单片机  读取18B20  温度传感器 手机看文章 扫描二维码
随时随地手机看文章

ds18b20是最常用的数字温度传感器,只需要通过一根线就可取读取温度值,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。温度测量范围 -55°C 到 +125°C。


引脚排列如下

image.png

GND为电源地;


DQ为数字信号输入/输出端;


VDD为外接供电电源输入端(在寄生电源接线方式时接地)


内部结构如下:

image.png

通过DQ端口按照一定的格式就可以将温度值读取出来。


转换成功后的温度值在寄存器中存放

image.png

S为符号位,bit0—bit3为存放小数部分,bit4—bit10存放整数部分。

image.png

初始化时序

image.png

主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。


从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。


读写时序

image.png

所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。写时序分为写0和写1两种。


写”0”时,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs),然后释放总线直到写周期结束。


写1时,在拉低总线后主机必须在15μs内释放总线。在总线被释放后,由于上拉电阻将总线恢复为高电平。


所有的写操作必须至少有60us的持续时间,最长不超过120us。相邻两个写时隙必须要有最少1us的恢复时间。所有的写操作(写0和写1)都由拉低总线产生。


总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。

完成一个读时序过程,至少需要60us才能完成,两个读周期间至少1us的恢复时间。


读写时序是分时完成的,所以在对总线读写时,要阉割按照时序来进行。

对ds18b20进行温度转换必须经过以下 3个步骤 :


(1)每次读写前对ds18b20进行复位初始化。复位要求主 CPU 将数据线下拉 500us ,然后释放, DS18B20 收到信号后等待16us ~ 60us 左右,然后发出60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。


(2)发送一条 ROM 指令

9.jpg

(3)发送存储器指令

10.jpg

比如官方手册中给出了一个操作例子

image.png

这个例子是总线上有多个设备,每次操作前都要进行身份对比,如果只有一个设备,那么就可以跳过ROM地址的识别。

image.png

接下来就可以用代码操作传感器了:


#include "ds18b20.h"

#include "stm8s103f.h"

#include "delay.h"


#define DS18B20_DQ_OUT          PA_DDR |= 0x08   //输出

#define DS18B20_DQ_IN           PA_DDR &= 0xf7   //输入

#define DS18B20_DQ_HIGH         PA_ODR |= 0x08   //拉高

#define DS18B20_DQ_LOW          PA_ODR &= 0xf7   //拉低

#define DS18B20_DQ_PULL_UP      PA_CR1 |= 0x08   //上拉输入

#define DS18B20_DQ_FLOATING     PA_CR1 &= 0xf7    //浮空输入

#define DS18B20_DQ_PUSH_PULL    PA_CR1 |= 0x08   //推挽输出

#define DS18B20_DQ_OPEN_DRAIN   PA_CR1 &= 0xf7    //开漏输出

#define DS18B20_DQ_VALUE        PA_IDR &0x08       //DQ值


void DS18B20_Init( void )

{

DS18B20_DQ_OUT;

DS18B20_DQ_PUSH_PULL;

DS18B20_DQ_HIGH;

delay_us( 10 );

DS18B20_DQ_LOW;

delay_us( 600 ); /*复位脉冲 */


DS18B20_DQ_IN;

DS18B20_DQ_PULL_UP;

delay_us( 60 );

while ( DS18B20_DQ_VALUE == 1 )

;

delay_us( 400 );

}

void DS18B20_WriteByte(unsigned char _data)

{

unsigned char i = 0;

DS18B20_DQ_OUT;

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

{

DS18B20_DQ_LOW;

delay_us( 2 );

if ( _data & 0x01 )

{

DS18B20_DQ_HIGH;

}

_data >>= 1;

delay_us( 60 );

DS18B20_DQ_HIGH;

}

}

unsigned char DS18B20_ReadByte(void)

{

unsigned char i = 0, _data = 0;

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

{

DS18B20_DQ_OUT;

DS18B20_DQ_LOW;

delay_us( 5 );

_data >>= 1;

DS18B20_DQ_HIGH;

DS18B20_DQ_IN;

if ( DS18B20_DQ_VALUE )

{

_data |= 0x80;

}

DS18B20_DQ_OUT;

DS18B20_DQ_HIGH;

delay_us( 60 );

}


return(_data);

}


float DS18B20_ReadTemperature(void)

{

unsigned char  temp = 0;

float t= 0;

DS18B20_Init();

DS18B20_WriteByte( 0xcc );

DS18B20_WriteByte( 0x44 );


DS18B20_Init();

DS18B20_WriteByte( 0xcc );

DS18B20_WriteByte( 0xbe );


temp = DS18B20_ReadByte();

t = ( ( (temp & 0xf0) >> 4) + (temp & 0x07) * 0.125);

temp = DS18B20_ReadByte();

t += ( (temp & 0x0f) << 4);


return(t);

}


读取温度时,直接在主函数中调用


#include "stm8s103f.h"

#include "ds18b20.h"

#include "delay.h"

/*系统时钟初始化*/

void SysClkInit(void)

{                           //默认值为16M 8分频

CLK_SWR=0xe1;      //HSI为主时钟源  16MHz CPU时钟频率

CLK_CKDIVR=0x00;   //CPU时钟0分频,系统时钟0分频 16M 

}

main()

{

    float tem;

    SysClkInit();

    delay_init(16);

    tem=DS18B20_ReadTemperature();

while (1);

}


在使用ds18b20的时候,关键是要保证时序的正确性,如果编写的代码不能正确读出温度值,就需要通过示波器来分析总线上的波形,看看总线上的时序是否和芯片手册中要求的一样。

关键字:STM8  单片机  读取18B20  温度传感器 引用地址:STM8单片机读取18B20温度传感器

上一篇:STM8单片机读取DHT11温湿度传感器
下一篇:STM8单片机 ADC模拟看门狗中文资料错误

推荐阅读

 “拼多多,拼多多,拼得多,省得多……”  相信大家都或多或少听过这么一首颇有“洗脑”潜力的广告歌曲,作为2018年最火的话题之一,拼多多经历了从美国高调上市,再到被曝光出山寨问题的一次如过山车般跌宕起伏的旅程。  虽然拼多多在经历了“假货风暴”后立马开展了“双打”行动,对涉嫌侵权和假冒的商品全部作下架处理,但在网购已经成为人们“日...
尽管氢燃料电池汽车优点多,却依然不能成为主流,这是为什么呢?近日氢燃料电池车发展再引争议 ,大规模应用或尚待时日。被喻为“新能源汽车终极解决方案”的氢燃料电池汽车近来争议颇多。 在日前召开的2019年泰达汽车论坛上,财政部经济建设司一级巡视员宋秋玲当众表示,“我国燃料电池汽车由于核心技术和零部件技术尚未突破,基础设施建设不足,标准法...
  体温检测是我们居家,出入社区或工作场所以及出行中的必要监测。红外体温检测仪通过非接触式测温有助于减少接触传染。在这里我们来和大家谈谈这个系统和主要的设计方案。  MSP430系列单片机是德州仪器(TI)公司1996年开始推向市场的一种16位超低功耗RISC混合信号处理器,基于该系列产品开发出来的应用不计其数,数不胜数,尤其是面向传感与检测类终...
据报道,随着苹果举办秋季新品发布会推出最新款手机,该公司也开始感受到安卓手机竞争对手过去几个月面临的一个巨大麻烦,那就是全球芯片供应短缺。不过,一份最新的行业调查显示,相比苹果,三星电子在内的高端手机制造商受到的芯片短缺冲击更加严重,而且这一问题的波及面正在不断扩大(至少在美国市场)。  据报道,美国零售市场研究机构“Wave7研究...

史海拾趣

问答坊 | AI 解惑

无线发射功率以及接收灵敏度

发射功率与增益 无线电发射机输出的射频信号,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去。电磁波到达接收地点后,由天线接收下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机。因此在无线网络的工程中,计算发 ...…

查看全部问答∨

双向出发二级管的问题

双向出发二级管如型号为:2CTS或PDA30~PDA60,可用现在的哪种双向出发二级管代替呀?…

查看全部问答∨

谁能给你能下载的51单片机的书

要汇编代码的,不要C的 另外不要在代码上有太多字的,有一点点8086汇编基础,最好在讲51结构和硬件方面多一点,比如引脚,外围电路什么的 我现在连51有几个寄存器有几个接脚都不知道啊,急需一本脱菜的书…

查看全部问答∨

又是可怕的DEMO: InterruptInitialize failed!!! 请各位前辈帮帮忙。

InterruptInitialize(SysInt,Interruptevent,NULL,0)      我的这个函数总是返回为FALSE,      SysInt在oalintr.h上已经定义,而且在cfw.s   和armint.c也加入相应的中断处理,使能,代码Interru ...…

查看全部问答∨

成立一个电子技术论坛,大家去看看!!www.520ic.cn

关于单片机、开关电源、信号源与频率计的专业论坛,大家有问题或者想下相关资料的去看看。另外本站首页提供200多万的ic芯片pdf资料搜索下载。www.520ic.cn…

查看全部问答∨

网络驱动无法调用我的中断服务程序?/(帮忙)

通过PCI 总线配置寄存器,并安装了中断服务程序,查看中断寄存器也显示发送 和接收包正常,但就是发完和接完就是没有调用中断程序…

查看全部问答∨

怎么才能看懂linux/drive/mtd/nand下的源码

最近要去研究linux 一直在看/nand目录下的源码,很多不理解,请哪问大虾能够指点下迷津…

查看全部问答∨

各位用过的兄弟:STM32生产时怎么设置保密性?

                                 如题,怎样设置以防止软件被读出??…

查看全部问答∨

请教关于STM8S105的问题

                                 请问什么原因会导致STM8S105的可用RAM空间小于128字节呢?文档上不是说有2K的RAM吗。程序出了一点小问题,感觉是ra ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved