DS18B20相关资料
DS1820数字温度计提供9位温度读数,指示器件的温度。
信息经过单线接口送入DS1820或从DS1820送出,因此从中央处理器到DS1820仅需连接一条线(和地)。读、写和完成温度变换所需的电源可以由数据线本身提供,而不需要外部电源。因为每一个DS1820有唯一的系列号(silicon serial number),因此多个DS1820可以存在于同一条单线总线上。这允许在许多不同的地方放置温度灵敏器件。此特性的应用范围包括HVAC环境控制,建筑物、设备或机械内的温度检测,以及过程监视和控制中的温度检测。
DS18B20复位
由图可以看出,在复位时,首先是将单片机其放置在"0"位(低位)480微秒——960微秒,随后将其置"1",再将DS1820放置在"0"位持续60微秒——240微秒,检测其信号,若检测到,继而再将DS1820放置在"1"位持续60微秒——240微秒,若还能检测到信号,说明可以正常使用,否则任何一个环节出现问题,均无法获得正确温度。
#define DS18B20CLR (P3 &= ~(1 << 7))
#define DS18B20SET (P3 |= (1 << 7))
#define DS18B20TST ((P3 & (1 << 7)) != 0)
int reset18b20(void) //复位
{
int t;
DS18B20CLR;
Delay10us(70);
DS18B20SET;
t = 0;
while(t <= 24 && DS18B20TST)
{
Delay10us(1);
t++;
}
if(t > 24)
{
return 0;
}
t = 0;
while(t <= 24 && !DS18B20TST)
{
Delay10us(1);
t++;
}
if(t > 24)
{
return 0;
}
return 1;
}
向DS18B20发送、接收数据
发送
由图可以看出,在发送数据时,“0"位需要先将温度传感器P37置0,然后等待50微秒,再置"1”;
“1"位也需要先将温度传感器P37置"0”,等待2微秒即可(只要大于1微秒),再"1",继续等待30微秒即可。
#define DS18B20CLR (P3 &= ~(1 << 7))
#define DS18B20SET (P3 |= (1 << 7))
#define DS18B20TST ((P3 & (1 << 7)) != 0)
void send_char(unsigned char n) //写
{
int i;
for(i = 0;i < 8;++i)
{
if((n & 0x01) != 0)
{
DS18B20CLR;
_nop_();
_nop_();
DS18B20SET;
Delay10us(3);
}
else
{
DS18B20CLR;
Delay10us(5);
DS18B20SET;
}
n >>= 1;
}
}
接收
接收数据时,我们只需要将先将P37置"0",等待2微秒,再置"1",继续等待4微秒,因为传感器发送只能发送0和1,并且是从LSB(低端)发送,我们将发送过来的每一位进行存储即可。
#define DS18B20CLR (P3 &= ~(1 << 7))
#define DS18B20SET (P3 |= (1 << 7))
#define DS18B20TST ((P3 & (1 << 7)) != 0)
unsigned char read_char(void) //读
{
unsigned char ret = 0;
int i;
for(i = 0;i < 8;++i)
{
DS18B20CLR;
_nop_();
_nop_();
DS18B20SET;
_nop_();
_nop_();
_nop_();
_nop_();
ret |= DS18B20TST << i;
Delay10us(5);
}
return ret;
}
获取温度
DS18B20采集流程是:
首先进行复位
发送0xCC
发送0x44
延时
复位
发送0xCC
发送0xBE
float get_temerature(void) //获取温度
{
unsigned char t1,t2;
int ret;
reset18b20();
send_char(0xCC);
send_char(0x44);
Delay10us(60000);
reset18b20();
send_char(0xCC);
send_char(0xBE);
t1 = read_char(); //接收首先接收到的是低位
t2 = read_char();
ret = t2 << 8 | t1; //整合
return ret * 0.0625;
}