基于STC15F2K60S2的ds18b20驱动程序

**该驱动程序使用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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值