stm32-DS18B20原理及代码解读

目录

一、基础知识

1.功能:高精度温度检测

2.应用范围

3.硬件电路连接

二、底层代码原理分析

步骤1

步骤2

步骤3


一、基础知识

1.功能:高精度温度检测

        测量范围:为-55°C 到+125°C。在-10°C 到+85°C 范围内 最大误差为±0.4 °C

        内置功能:可以设定数字转换精度测温速度,可自行设置报警值,可编程的 ID 序列号。

2.应用范围

        便携应用,手机与穿戴设备 ,温度监控 , 粮情监测 , 智能家电系统 , 水温测量 ,建筑、设备或机房内部温度监测系统 , 过程监测和控制系统

3.硬件电路连接

        

 

二、底层代码原理分析

       访问 DS18B20 的传输序列如下:

         步骤 1 初始化

        步骤  2 ROM 指令(跟随任意必需的数据 交换)

        步骤 3 DS18B20 功能指令(跟随任意必 需的数据交换)

步骤1

        初始化 通过单线总线的所有执行(处理)都从一个初 始化序列开始。初始化序列包括一个由总线控制器 发出的复位脉冲和跟随其后由从机发出的存在脉 冲。 存在脉冲让总线主机知道从设备(如 DS18B20)在总线上且已准备好运行。

        当 DS18B20 发送存在脉冲以响应复位脉冲,其向 主机表明它挂在总线上,并且已经准备好运行。在 初始化序列过程中,主机通过将单总线拉低至少 480 µs 来发出复位脉冲。总线主机随后释放总线进入接收模式。当总线被释放后,5kΩ 上拉电阻会把 总线拉高。当 DS18B20 检测到这个上升沿,它等待 15µs 到 60µs 然后通过把单总线拉低 60µs 到 240µs 来发出存在脉冲。

 由此我们得到初始化代码:

主机发送

void DS18B20_Rst(void)	   
{                 DS18B20_IO_OUT(); 	//SET PG11 OUTPUTDS18B20_DQ_OUT=0; 	//拉低DQdelay_us(750);    	//拉低750usDS18B20_DQ_OUT=1; 	//DQ=1 delay_us(38);     	//38US
}

 从机响应 

u8 DS18B20_Check(void) 	   
{   u8 retry=0;DS18B20_IO_IN();	while (DS18B20_DQ_IN);while (!DS18B20_DQ_IN&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;	    return 0;
}

步骤2

        ROM 指令(跟随任意必需的数据交换)

        当总线主机检测到存在脉冲,就可以发布 ROM 指令。这些指令运作于每个从设备唯一的 64 位 ROM 编码而且如果有多个从设备挂在单总线 上,主机可以单独寻址特定的从设备。这些指令也 使得主机可以决定总线上有多少什么类型的设备, 以及是否有任何设备满足了报警条件。共有 5 个 ROM 指令,每个 8 位长。主设备必须在发布 DS18B20 的功能指令之前发布一个合适的 ROM 指令

        想了解如何发一个ROM指令,我们先要了解如何发一个位

        “写 1”时隙和“写 0”时隙。 总线主机通过写1 时隙把一个逻辑1写入DS18B20, 通过写 0 时隙把一个逻辑 0 写入 DS18B20。所有 写时隙必须持续最少 60µs,并且两个写时隙之间至 少有 1µs 的恢复时间。

        要产生写 1 时隙,把单总线拉低之后,总线主机 必须在 15µs 内释放单总线。总线被释放后,5kΩ 上 拉电阻会把总线拉高。要产生一个写 0 时隙,把单 总线拉低之后,总线主机必须在整个时隙期间持续 保持总线低(至少 60µs)

        

         由此得到代码:

void DS18B20_Write_Bite(u8 dat)     {             DS18B20_IO_OUT();switch()case dat:{DS18B20_DQ_OUT=0;	// Write 1delay_us(7);                            DS18B20_DQ_OUT=1;delay_us(60);break;}            case dat:{DS18B20_DQ_OUT=0;	// Write 0delay_us(90);                            DS18B20_DQ_OUT=1;delay_us(7);break;}                        
}

        我们简单升级优化一下代码(写入一个字节):

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 1delay_us(7);                            DS18B20_DQ_OUT=1;delay_us(60);             }else {DS18B20_DQ_OUT=0;	// Write 0delay_us(90);             DS18B20_DQ_OUT=1;delay_us(7);                          }}
}

        那如何读呢?

        读时隙的产生是通过主机拉低单总线至少 1µs 然后释放总线来实现 ,主机发起读时隙之后,DS18B20 会开 始在总线上传输 1 或 0。DS18B20 通过保持总线高 发送 1 并通过拉低总线发送 0。当传输 0 的时候, DS18B20 会在时隙结束时释放总线,之后总线会被 上拉电阻拉回高空闲状态。DS18B20 的输出数据在 启动时隙的下降沿后 15µs 之内有效。所以,主机必 须在时隙启动之后 15µs 之内释放总线并采样总线 状态。

         所以我们得到代码:

u8 DS18B20_Read_Bit(void) 	 
{u8 data;DS18B20_IO_OUT();	DS18B20_DQ_OUT=0; delay_us(2);DS18B20_DQ_OUT=1; delay_us(5);DS18B20_IO_IN();	
//	delay_us(1);if(DS18B20_DQ_IN)data=1;else data=0;	 delay_us(50);           return data;
}

        根据手册我们可以得知不同ROM 操作指令的作用按需求发送。

步骤3

        DS18B20 功能指令

         当总线主机使用一个 ROM 指令寻址一个它希 望与之通讯的 DS18B20 之后,主机可以发布 DS18B20 的功能指令之一。这些指令允许主机从 DS18B20 的暂存器写或读数据,发动温度转换以及 了解供电模式

        根据手册我们可以得知不同DS18B20 功能指令的作用按需求发送。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部