DS18B20温度传感器
-
复位
时序图如下所示:低电平持续时间为480-960us,高电平持续时间为15-60us,然后低电平持续60-240us。
代码如下:
void ds18b20_rst(void)
{
IO_OUT; //输出模式
DQ_OUT=0; //拉低DQ引脚
delay_us(600); //延时480-960us
DQ_OUT=1; //拉高DQ引脚
while(DQ_OUT); //等待器件应答(器件拉低),约15-60us后
while(!DQ_OUT); //应答脉冲出现后,等待器件拉高,约60-240us后
}
-
写0操作
时序图如下所示:
代码如下:
void ds18b20_write_zero(void)
{
IO_OUT; //输出模式
DQ_OUT=0 //拉低引脚
delay_us(80); //延时60-120us
DQ_OUT=1; //拉高引脚
delay_us(2);
}
- 写1操作
代码如下:
void ds18b20_write_one(void)
{
IO_OUT; //输出模式
DQ_OUT=0
delay_us(2);
DQ_OUT=1;
delay_us(80);
}
- 读0、1操作
代码如下:
unsigned char ds18b20_read_bit(void)
{
unsigned char data;
IO_OUT;
DQ_OUT=0;
delay_us(2);
DQ_OUT=1;
DQ_IN;
delay_us(2);
if(DQ_IN)
data=1;
else
data=0;
delay_us(500);
return data;
}
- 写1字节
代码如下:
void ds18b20_write_byte(unsigned char data)
{
unsigned char i,testb;
IO_OUT;
for(i=0;i<8;i++)
{
testb=data&0x01; //从低位开始写
data>>=1;
if(testb)
ds18b20_write_one();
else
ds18b20_write_zero();
}
}
- 读一字节
代码如下:
unsigned char ds18b20_read_byte(void)
{
unsigned char i,j,data=0;
for(i=0;i<8;i++)
{
j=ds18b20_read_bit();
data=(j<<7)|(data>>1); //从低位开始读
}
return data;
}
- 开始读取数据
代码如下:
void ds18b20_start(void)
{
ds18b20_rst();
ds18b20_write_byte(0xcc); // 跳过ROM
ds18b20_write_byte(0x44); //温度转换
}
- 初始化
代码如下:
unsigned char ds18b20_init(void)
{
gpio_init(); //此引脚需根据相应的单片机进行配置
ds18b20_rst();
}
- .读取温度
代码如下:
short get_tempetature(void)
{
unsigned char TL,TH;
short tem;
ds18b20_start(); //开始转换
delay_ms(700); //等待转换完成
ds18b20_init();
ds18b20_write_byte(0xcc); //跳过ROM
ds18b20_write_byte(0xbe); //读取暂存寄存器
TL=ds18b20_read_byte(); //低八位
TH=ds18b20_read_Byte(); //高八位,注意前五位为符号位只有全为0的时候温度是正的
tem=TH; //获得高八位
tem<<=8;
tem+=TL; //获得底八位
return tem;
}