首先我们看一下ds18b20的结构图:
通过结构图,我们大致能了解一些DS18B20的内部结构,重点是我们要知道,他是如何测温度的,以及温度是怎么计算为我们想要的值的。
ds18b20采用的是单总线结构,我们来了解它是如何初始化的:
通过它初始化的时序图,我们可以写出程序:
void ds_reset()//初始化
{
ds = 1;
ds = 0;
delay_us(200);
delay_us(200);
ds = 1;
delay_us(20);
if(0 == ds)
{
ack = 1;
}
else
{
ack = 0;
}
delay_us(200);
delay_us(100);
}
然后我们再看看如何写入一个位:
程序:
void ds_send_byte(unsigned char byte)//写入一个字节
{
unsigned char i;
for(i = 0; i < 8; i++)
{
ds = 0;
_nop_();
_nop_();
ds = byte & 0x01;
byte >>= 1;
delay_us(30);
ds = 1;
}
delay_us(30);
}
我们看看如何读取一个位;
程序:
bit ds_read_bit()//读一位
{
bit tmp;
ds = 1;
ds = 0;
_nop_();
_nop_();
ds = 1;
tmp = ds;
delay_us(30);
return tmp;
}
unsigned char ds_read_byte()//读一个字节
{
unsigned char i,j,k;
for(i = 0; i < 8; i++)
{
j = ds_read_bit();
k = (j << 7) | (k >> 1);
}
return k;
}
然后下面开始启动温度传感器:
1.复位DS18B20.
2.发出跳过ROM命令(ccH)。
3.发出启动温度转换命令(44H)。
启动温度传感器后,我们要读暂存器中的值:
通过使用手册,我们了解到读暂存器的编码是BEH.
ds_reset();
ds_send_byte(0xcc);
ds_send_byte(0xbe);
综上所述:
void main()
{
unsigned char a;
unsigned int temp,b;
float wendu;
unsigned char disbuf[20];
lcd_init();
while(1)
{
ds_reset();
ds_send_byte(0xcc);
ds_send_byte(0x44);
ds_reset();
ds_send_byte(0xcc);
ds_send_byte(0xbe);
a = ds_read_byte();
b = ds_read_byte();
temp = (b << 8) | a;
wendu = (float)temp * 0.0625;
sprintf(disbuf,"temp is %7.3f",wendu);
lcd_str(0,0,disbuf);
}
}
到这里,相信大家都能对ds18b20有所了解,若还有疑问,很高兴和大家探讨。