2012年刚学51单片机的时候,玩过DS18B20,忘的差不多了。最近再次用到,记一片流水账,加深理解,以防又忘掉。
1、整体把握
(1)读写数据都是低位先行;
(2)默认12bit,可以配置为9,10,11,12bit,精度0.5,0.25,0.125,0.0625;
(3)符号位S为0,表示正值,符号位s为1表示负值。
2、芯片检测
static uint8_t DS18B20_Check(void)
{
uint8_t retry=0;
while(DS18B20_DQ_READ()&&retry<200)
{
retry++;
_delay_us(1);
}
if(retry>=200)
{
return 0;//未检测到设备
}
else
{
retry=0;
}
while(!DS18B20_DQ_READ()&&retry<240)
{
retry++;
_delay_us(1);
}
if(retry>=240)
{
return 0;//未检测到设备
}
else
{
return 1; //检测到设备
}
}
3、写数据
(1)所有的写逻辑,都是有主机拉低总线再释放总线开始(总线电平:高->低);
(2)所有的写(写1位)最少持续60us,相邻两个写之间大于1us;
(3)DS18B20在第15us-60us之间采样。
static void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t j, testb;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
DS18B20_DQ_LOW(); // Write 1
_delay_us(2);
DS18B20_DQ_HIGH();
_delay_us(60);
}
else
{
DS18B20_DQ_LOW(); // Write 0
_delay_us(60);
DS18B20_DQ_HIGH();
_delay_us(2);
}
}
}
4、读数据
(1)所有的读逻辑,都是有主机拉低总线再释放总线开始(总线电平:高->低->高);
(2)在主机产生读信号之后(下降沿),15us之内读取DS18B20。
static uint8_t DS18B20_Read_Bit(void)
{
uint8_t dat;
DS18B20_DQ_LOW();
_delay_us(2);
DS18B20_DQ_HIGH();
_delay_us(10);
if(DS18B20_DQ_READ())
{
dat=1;
}
else
{
dat=0;
}
_delay_us(45);
return dat;
}
static uint8_t DS18B20_Read_Byte(void)
{
uint8_t i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}