⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 户外显示屏源程序
💻 C
字号:
/*********************************Copyright (c)*********************************
**                                
** 文   件   名: defineLCD1602.h
** 最后修改日期: 2005年06月8日
** 描        述: 18B20温度检测IC驱动函数文件
** 版	     本: V1.0
** 主  控  芯 片:M16  晶振频率:8 MHZ
*******************************************************************************/

#include <iom16v.h>
#include <macros.h>
#include "function.h"
#include "define.h"
#include "defineDS18B20.h"


/**********************************************************************
functionName: BYTE resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
unsigned char resetDS18B20(void)
{
	unsigned char errTime=0;
	RLS_DS18B20;		//释放总线
	_NOP();
	HLD_DS18B20;		//Maga16控制总线
	CLR_DS18B20;		//强制拉低
	delayUs(255);		//209.42us
	delayUs(255);		//209.42us
	delayUs(255);		//83.28us
	//以上的三个延时大于480us
	RLS_DS18B20;		//释放总线,总线自动上拉
	_NOP();			
	while(STU_DS18B20)	
	{
		delayUs(4);	 	//5.15us
		errTime++;
		if(errTime>20)
		return(0x00);		//如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
	}
	errTime=0;
	while(!(STU_DS18B20))	
	{
		delayUs(4);	 	//5.15us
		errTime++;
		if(errTime>50)
		return(0x00);		//如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
	}
	return(0xff);
}


/**********************************************************************
functionName: BYTE readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
unsigned char readByteDS18B20(void)
{
	unsigned char i;
	unsigned char retVal=0;
	RLS_DS18B20;		//释放总线
	for(i=8;i>0;i--)
	{
	 	retVal>>=1;
	        HLD_DS18B20;	//Maga16控制总线
		CLR_DS18B20;	//强制拉低
		NOP();
	   	NOP();
	   	NOP();
	   	NOP();
	   	NOP();
		NOP();
		NOP();	
		NOP();			//延时大于1us	
		RLS_DS18B20;		//释放总线,DS18B20会将总线强制拉低
		NOP();
		NOP();
		NOP();
		if(STU_DS18B20)
		retVal|=0x80;
		delayUs(16);	 	//14.92us
		delayUs(16);	 	//14.92us
		RLS_DS18B20;		//释放总线
		delayUs(35);	 	//30.38us
	}
	delayUs(1);	 		//2.71us(大于1us就行了)
	return(retVal);
}


/**********************************************************************
functionName: BYTE readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void writeByteDS18B20(BYTE wb)
{
	unsigned char i;
	unsigned char temp;
	RLS_DS18B20;		//释放总线
	for(i=0;i<8;i++)
	{
		HLD_DS18B20;		//Maga16控制总线
		CLR_DS18B20;		//强制拉低
		delayUs(16);	 	//14.92us
		temp=wb>>i;
		temp&=0x01;
		if(temp)
		RLS_DS18B20;		//释放总线
		else
		CLR_DS18B20;		//强制拉低
		delayUs(16);	 	//14.92us
		delayUs(35);	 	//30.38us
		RLS_DS18B20;		//释放总线
		delayUs(1);	 		//2.71us(大于1us就行了)
	}
}






/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度
**********************************************************************/
unsigned int readTempDS18B20(void)
{
	unsigned char tempL,tempH;
	unsigned int x;
	resetDS18B20();
	writeByteDS18B20(0xcc); 	//跳过ROM
	writeByteDS18B20(0x44);		//启动温度转换
	delayUs(2);
	resetDS18B20();
	writeByteDS18B20(0xcc);		//跳过ROM
	writeByteDS18B20(0xbe);		//读数据
	tempL=readByteDS18B20();
	tempH=readByteDS18B20();
	x=(tempH<<8)|tempL;
	return(x);
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -