#include "mini51series.h"
#define SDA P52 //DS18B20的数据口位P5.2
void DS18B20_Reset(void);
void DS18B20_WriteByte(uint8_t dat);
uint8_t DS18B20_ReadByte(void);
int16_t ReadTemp(void)
{
uint8_t TPH,TPL;
int16_t temp;
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!SDA); //等待转换完成
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TPL = DS18B20_ReadByte(); //读温度低字节
TPH = DS18B20_ReadByte(); //读温度高字节
temp=TPH;
temp<<=8;
temp|=TPL;
return (temp);
}
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset(void)
{
uint8_t i;
i = 1;
while (i)
{
SDA = 0; //送出低电平复位信号
CLK_SysTickDelay(480); //延时至少480us
SDA = 1; //释放数据线
CLK_SysTickDelay(60); //等待60us
i = SDA; //检测存在脉冲
CLK_SysTickDelay(420); //等待设备释放数据线
}
}
/**************************************
从DS18B20读1字节数据
**************************************/
uint8_t DS18B20_ReadByte(void)
{
uint8_t i;
uint8_t dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
SDA = 0; //开始时间片
CLK_SysTickDelay(1); //延时等待
SDA = 1; //准备接收
CLK_SysTickDelay(1); //接收延时
if (SDA) dat |= 0x80; //读取数据
CLK_SysTickDelay(60); //等待时间片结束
}
return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(uint8_t dat)
{
uint8_t i;
for (i=0; i<8; i++) //8位计数器
{
SDA = 0; //开始时间片
CLK_SysTickDelay(1); //延时等待
if (dat&0x01) SDA =1; //送出数据
CLK_SysTickDelay(60); //等待时间片结束
SDA = 1; //恢复数据线
CLK_SysTickDelay(1); //恢复延时
dat >>= 1;
}
}
|