**该驱动程序使用12M晶振
延时函数都是用ISP下载器生成的
用普通的例程修改的,鼓励大家自己动手修改
**
ds18b20.h文件
#define __DS18B20_H_
#include <STC15F2K60S2.h>
#include "intrins.h"
sbit DQ=P0^0;
void Delay1us();
void Delay6us();
void Delay48us();
void Delay60us();
void Delay68us();
void Delay100us();
void Delay640us();
void Delay1ms();
uchar Ds18b20Init(void);
void DS18b20WriteByte(uchar dat);
uchar DS18b20ReadByte(void);
void DS18b20ChangTemp(void);
void DS18b20ReadTempCom(void);
int DS18b20ReadTemp(void);
#endif
ds18b20.c文件
#include "ds18b20.h"
void Delay1us() //@12.000MHz
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void Delay6us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 15;
while (--i);
}
void Delay48us() //@12.000MHz
{
unsigned char i, j;
i = 1;
j = 140;
do
{
while (--j);
} while (--i);
}
void Delay60us() //@12.000MHz
{
unsigned char i, j;
i = 1;
j = 176;
do
{
while (--j);
} while (--i);
}
void Delay68us() //@12.000MHz
{
unsigned char i, j;
i = 1;
j = 200;
do
{
while (--j);
} while (--i);
}
void Delay100us() //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 39;
do
{
while (--j);
} while (--i);
}
void Delay640us() //@12.000MHz
{
unsigned char i, j;
i = 8;
j = 117;
do
{
while (--j);
} while (--i);
}
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
uchar DS18b20Init()
{
DQ = 0; //将总线拉低480us~960us
Delay640us();
DQ = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
while(DQ) //等待DS18B20拉低总线
{
Delay60us();
return 0;//初始化失败
}
return 1;//初始化成功
}
void DS18b20WriteByte(uchar dat)
{
uint i;
for(i=0; i<8; i++)
{
DQ = 0; //每写入一位数据之前先把总线拉低1us
Delay1us();
DQ = dat & 0x01; //然后写入一个数据,从最低位开始
Delay68us();
DQ = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
dat >>= 1;
}
}
uchar DS18b20ReadByte()
{
uchar byte, bi;
uint i;
for(i=8; i>0; i--)
{
DQ = 0;//先将总线拉低1us
Delay1us();
DQ = 1;//然后释放总线
Delay6us();
bi = DQ; //读取数据,从最低位开始读取
/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
byte = (byte >> 1) | (bi << 7);
Delay48us(); //读取完之后等待48us再接着读取下一个数
}
return byte;
}
void DS18b20ChangTemp()
{
Ds18b20Init();
Delay100us();
DS18b20WriteByte(0xcc); //跳过ROM操作命令
DS18b20WriteByte(0x44); //温度转换命令
}
void DS18b20ReadTempCom()
{
DS18b20Init();
Delay100us();
DS18b20WriteByte(0xcc); //跳过ROM操作命令
DS18b20WriteByte(0xbe); //发送读取温度命令
}
int DS18b20ReadTemp()
{
int temp = 0;
uchar tmh, tml;
DS18b20ChangTemp(); //先写入转换命令
DS18b20ReadTempCom(); //然后等待转换完后发送读取温度命令
tml = DS18b20ReadByte(); //读取温度值共16位,先读低字节
tmh = DS18b20ReadByte(); //再读高字节
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}