历史上的今天
返回首页

历史上的今天

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

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

2021-09-17 来源:eefocus

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


引脚排列如下

image.png?imageView2/2/w/550

GND为电源地;


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


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


内部结构如下:

image.png?imageView2/2/w/550

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


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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

初始化时序

image.png?imageView2/2/w/550

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


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


读写时序

image.png?imageView2/2/w/550

所有的写时隙必须有最少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?imageView2/2/w/550

(3)发送存储器指令

10.jpg?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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


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

推荐阅读

史海拾趣

HANA Micron公司的发展小趣事

随着线上及线下业务的快速增长,Hama面临着交货时效性的巨大挑战。为了应对这一挑战,公司决定在蒙海姆总部建造一座集仓储、拣选与发货一体的物流中心。该物流中心采用了先进的自动化和人工子系统相结合的设计方案,大大提高了物流运作的效率。新系统的启用使得Hama每天能够处理数以万计的订单,确保了产品的及时交付,进一步提升了客户满意度和品牌影响力。

ALLTHREAD公司的发展小趣事

ALLTHREAD公司最初由一群对螺纹轧制技术充满热情的工程师创立。他们看到了电子行业对高精度螺栓的迫切需求,于是决定专注于这一领域。经过不断的研发和创新,ALLTHREAD成功推出了首款高精度、高可靠性的螺纹轧制螺栓,迅速在市场上获得了认可。

Good-Ark公司的发展小趣事
确保电源稳定可靠,避免电压波动对电路造成影响。
Churod Electronics Co Ltd公司的发展小趣事

为了保证产品质量和客户满意度,中汇瑞德一直将质量管理体系的建设放在重要位置。公司引入了国际先进的质量管理理念和方法,建立了完善的质量管理体系,并通过了多项国际认证。同时,公司还加强了对供应商的管理和评估,确保原材料的质量符合公司要求。这些措施有效地提高了产品的质量稳定性和可靠性,赢得了客户的信任和认可。

宜源科技(ETERNAL)公司的发展小趣事

面对日益严峻的环境问题,宜源科技公司积极响应国家环保政策,致力于绿色环保和可持续发展。公司采用先进的生产工艺和设备,减少生产过程中的污染排放。同时,宜源科技还积极推动绿色产品的研发和推广,为客户提供更加环保、节能的电子产品解决方案。这些努力不仅有助于保护环境,也为公司的可持续发展奠定了基础。

FCI connector [富加宜连接器]公司的发展小趣事

在大中华区市场,FCI展现出了强劲的增长势头。公司积极布局中国市场,特别是在3G产业领域,FCI投入大量人力资源研发相关产品,为通信设备厂商提供优异的连接器解决方案。随着中国3G牌照的发放,FCI的业绩得到了强劲增长。几乎所有的12.5GHz局端通信设备制造商都采用了FCI的连接器解决方案,这使得FCI在大中华区的市场份额不断攀升。

问答坊 | AI 解惑

射频关键性设计教程

射频关键性设计教程…

查看全部问答>

关于wince线程优先级设置问题

我在串口驱动中看到如下代码 void CPdd2440Uart::PostInit() {     DWORD dwCount=0;     m_HardwareLock.Lock();     m_pReg2440Uart->Write_UCON(0); // Set to Default;     DisableInterrupt(S2 ...…

查看全部问答>

91program ,yashi高手都来看看,EventModify函数的实现问题

控制面版里的显示里面有一个背景光的对话框,这里只是实现了注册表的更改,现在我想在这里实现对背光的控制。 我找到了实现代码的地方在D:\\WINCE500\\PUBLIC\\WCESHELLFE\\OAK\\CTLPNL\\CPLMAIN这里的screen.cpp里面 HANDLE hEvent = CreateEven ...…

查看全部问答>

wince调用webservice问题

用一块2410板子上的wince系统调用webservice必须要板子和电脑联网吗?利用usb连接是否可以?怎样才能配置板子上的wince的ip使得wince与pc可以相互ping通?求救!!!…

查看全部问答>

让GPRS模块智能化,嵌入应用更轻松

让GPRS模块智能化,嵌入应用更轻松     目前GPRS模块供应商,各自提供自己的标准品, 面对不同行业应用,用户必须自己编写软件来 使用通信功能。这要求用户必须熟悉GSM通信, 可能需要更改原有产品设计,用户需要反复调试, 延长产 ...…

查看全部问答>

充电器管理芯片MAX17005B Datasheet分析

这是MAX17005B Datasheet  ,如附件 MAX 17005B 低成本、高效、1.2MHZ 开关频率的 充电 芯片。   特点:1.2MHZ 开关频率;            电感电流可控体系结构;   &n ...…

查看全部问答>

lwIP的TCP client在资料接收问题?

使用8962範例专案enet_lwip中加入tcp client,使mcu能连接到PC端的tcp listener. 已测试可正常连线至pc,接通时发送6个byte至pc端去,如下程式码:static err_tTcpClient_Connected(void *arg, struct tcp_pcb *pcb, err_t err){unsigned char bb[ ...…

查看全部问答>

关于MDK支持unicode码的问题

应用MDK 执行代码char *test="汉字"后,test内的内容为“汉字”的AnsiCode内码:BABAD7D6 我希望test内的内容是“汉字”的UniCode内码:496C575B 请问应该如何设置?…

查看全部问答>

请问大家现在都用什么PCB制图软件?altium designer有msp430库么?

请问大家现在都用什么PCB制图软件?altium designer现在比例怎样?altium designer有msp430的sch和pcb的封装库么?谢谢…

查看全部问答>

C语言编程宝典

C语言编程宝典 下载链接:https://download.eeworld.com.cn/detail/lbk747/1464 希望对大家有用,觉得有用了就帮忙顶起!…

查看全部问答>