140 lines
2.9 KiB
C
140 lines
2.9 KiB
C
#include "ds18b20.h"
|
||
|
||
//复位DS18B20
|
||
void ds18b20_rst(void)
|
||
{
|
||
DS18B20_IO_OUT(); //SET PG11 OUTPUT
|
||
DS18B20_DQ_OUT(0); //拉低DQ
|
||
delay_us(750); //拉低750us
|
||
DS18B20_DQ_OUT(1); //DQ=1
|
||
delay_us(15); //15US
|
||
}
|
||
//等待DS18B20的回应
|
||
//返回1:未检测到DS18B20的存在
|
||
//返回0:存在
|
||
uint8_t ds18b20_check(void)
|
||
{
|
||
uint8_t retry=0;
|
||
DS18B20_IO_IN(); //SET PC1 INPUT
|
||
while (DS18B20_DQ_IN&&retry<200)
|
||
{
|
||
retry++;
|
||
delay_us(1);
|
||
};
|
||
if(retry>=200)return 1;
|
||
else retry=0;
|
||
while (!DS18B20_DQ_IN&&retry<240)
|
||
{
|
||
retry++;
|
||
delay_us(1);
|
||
};
|
||
if(retry>=240)return 1;
|
||
return 0;
|
||
}
|
||
//从DS18B20读取一个位
|
||
//返回值:1/0
|
||
uint8_t ds18b20_read_bit(void)
|
||
{
|
||
uint8_t data;
|
||
DS18B20_IO_OUT(); //SET PC1 OUTPUT
|
||
DS18B20_DQ_OUT(0);
|
||
delay_us(2);
|
||
DS18B20_DQ_OUT(1);
|
||
DS18B20_IO_IN(); //SET PC1 INPUT
|
||
delay_us(12);
|
||
if(DS18B20_DQ_IN)data=1;
|
||
else data=0;
|
||
delay_us(50);
|
||
return data;
|
||
}
|
||
//从DS18B20读取一个字节
|
||
//返回值:读到的数据
|
||
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;
|
||
}
|
||
//写一个字节到DS18B20
|
||
//dat:要写入的字节
|
||
void ds18b20_write_byte(uint8_t dat)
|
||
{
|
||
uint8_t j;
|
||
uint8_t testb;
|
||
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
|
||
for (j=1;j<=8;j++)
|
||
{
|
||
testb=dat&0x01;
|
||
dat=dat>>1;
|
||
if (testb)
|
||
{
|
||
DS18B20_DQ_OUT(0); // Write 1
|
||
delay_us(2);
|
||
DS18B20_DQ_OUT(1);
|
||
delay_us(60);
|
||
}
|
||
else
|
||
{
|
||
DS18B20_DQ_OUT(0); // Write 0
|
||
delay_us(60);
|
||
DS18B20_DQ_OUT(1);
|
||
delay_us(2);
|
||
}
|
||
}
|
||
}
|
||
//开始温度转换
|
||
void ds18b20_start(void)
|
||
{
|
||
ds18b20_rst();
|
||
ds18b20_check();
|
||
ds18b20_write_byte(0xcc); // skip rom
|
||
ds18b20_write_byte(0x44); // convert
|
||
}
|
||
|
||
//初始化DS18B20的IO口 DQ 同时检测DS的存在
|
||
//返回1:不存在
|
||
//返回0:存在
|
||
uint8_t ds18b20_init(void)
|
||
{
|
||
DS18B20_DQ_OUT(1);
|
||
|
||
ds18b20_rst();
|
||
|
||
return ds18b20_check();
|
||
}
|
||
//从ds18b20得到温度值
|
||
//精度:0.1C
|
||
//返回值:温度值 (-550~1250)
|
||
short ds18b20_get_temp(void)
|
||
{
|
||
uint8_t temp;
|
||
uint8_t TL,TH;
|
||
short tem;
|
||
ds18b20_start(); // ds1820 start convert
|
||
ds18b20_rst();
|
||
ds18b20_check();
|
||
ds18b20_write_byte(0xcc); // skip rom
|
||
ds18b20_write_byte(0xbe); // convert
|
||
TL=ds18b20_read_byte(); // LSB
|
||
TH=ds18b20_read_byte(); // MSB
|
||
|
||
if(TH>7)
|
||
{
|
||
TH=~TH;
|
||
TL=~TL;
|
||
temp=0; //温度为负
|
||
}else temp=1; //温度为正
|
||
tem=TH; //获得高八位
|
||
tem<<=8;
|
||
tem+=TL; //获得低八位
|
||
tem=(float)tem*0.625f; //转换
|
||
if(temp)return tem; //返回温度值
|
||
else return -tem;
|
||
}
|
||
|