找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3946|回复: 2
收起左侧

实现在同一个STM32 IO口上接多个DS18B20,进行多点温度测量教程

[复制链接]
ID:457339 发表于 2020-3-4 13:18 | 显示全部楼层 |阅读模式
如何在32单片机上挂多个DS18B20,见链接附件
首先包保证对 DS18B20 读写操作的函数没有问题基本的
//从 DS18B20 读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)              // read one bit
{
u8 data;
DS18B20_IO_OUT();//SET PA0 OUTPUT DS18B20_DQ_OUT=0;
delay_us(2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PA0 INPUT delay_us(12); if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
}

//从 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
//dat:要写入的字节

void DS18B20_Write_Byte(u8 dat)

{
u8 j;
u8 testb;
DS18B20_IO_OUT();//SET PA0 OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)

{
}
else
{


}
}
}



DS18B20_DQ_OUT=0;// Write 1 delay_us(2); DS18B20_DQ_OUT=1; delay_us(60);
DS18B20_DQ_OUT=0;// Write 0 delay_us(60); DS18B20_DQ_OUT=1; delay_us(2);

因为单片机只对一个 DS18B20 进行操作,就不需要读取 ROM 编码以及匹配 ROM 编码了, 只要用跳过 ROM(0XCC)命令。
再进行温度的读取和转换就可以得到温度值了

多点温度读取

但是有时我们做一个项目可能要测量多个位置的温度,这个时候我们任然可以选用 DS18B20 来完成这项工作。每一个 DS18B20 都有自己的 48 位序列号,我们可以通过这个序 列号在同一个 IO 口上寻找不同的 DS18B20。然后接下来的操作就和读取一个 DS18B20 温度 的是一样的。

得到一个 DS18B20 的光刻 ROM 是实现多点温度采集的前提,首先初始化 DS18B20 的状 态,在向 DS18B20 写读 ROM(0X33)的指令,再接收数据即可。如下图。
读取出的光刻 ROM 可以通过下面的函数进行检验是否正确

得到的光刻 ROM 可以通过串口,打印到上位机上
然后在上位机中可以看到这样的数据(看不清可以放大 WORD 来看)
要知道 64 位的光刻 ROM 中有 8 位是产品类型标号,每个 DS18B20 都是一样的,0X28。 要注意的问题是在上位机超过 9 的数字,并不是以a,b,c,d……..的形式显示,而是以 10,
11,12…….的形式显示。

然后在通过自己的转换就可得到光刻 ROM 了。

得到了光刻 ROM 再借助这两个函数就可以进行温度读取了

回复

使用道具 举报

ID:416950 发表于 2020-3-31 14:32 | 显示全部楼层
你好,请教你一个问题,这个匹配ROM函数从哪里看出如何匹配3个,显示如何显示三个的温度。指点一下
回复

使用道具 举报

ID:737981 发表于 2020-5-25 16:38 | 显示全部楼层
你好,没有看到附件啊

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表