如何在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 再借助这两个函数就可以进行温度读取了
|