📄 ds18b20.c
字号:
#include <iom16v.h>
#include <macros.h>
#define BYTE unsigned char
#define WORD unsigned int
/********************************************************************************
位变量操作宏定义
********************************************************************************/
#define BIT_SET(a,b) a|=BIT(b)
#define BIT_CLR(a,b) a&=~BIT(b)
#define BIT_INV(a,b) a^=BIT(b)
#define BIT_STATUS(a,b) a&BIT(b)
/********************************************************************************
DS18B20操作定义
********************************************************************************/
#define CLR_DS18B20 BIT_CLR(PORTD,PD6) //数据线强制拉低
#define SET_DS18B20 BIT_SET(PORTD,PD6) //数据线强制拉高,上拉
#define HLD_DS18B20 BIT_SET(DDRD,PD6) //Mega16控制总线
#define RLS_DS18B20 BIT_CLR(DDRD,PD6) //释放总线
#define STU_DS18B20 BIT_STATUS(PIND,PD6) //数据线的状态
void delayUs(unsigned int temp)
{
while(temp--);
}
/**********************************************************************
functionName: BYTE resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
BYTE OWReset(void)
{
BYTE errTime=0;
RLS_DS18B20; //释放总线
_NOP();
HLD_DS18B20; //Maga16控制总线
CLR_DS18B20; //强制拉低
delayUs(150); //209.42us
delayUs(150); //209.42us 480us
RLS_DS18B20; //释放总线,总线自动上拉
_NOP();
while(STU_DS18B20)
{
delayUs(2); //5.15us
errTime++;
if(errTime>14)
return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
}
errTime=0;
while(!(STU_DS18B20))
{
delayUs(2); //5.15us
errTime++;
if(errTime>33)
return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
}
delayUs(120);
delayUs(125);
return(0xff);
}
////////////////////////////////////////////////
unsigned char OWReadBit(void)
{ unsigned char t;
HLD_DS18B20; //Maga16控制总线
CLR_DS18B20; //强制拉低
_NOP();
RLS_DS18B20; //释放总线,DS18B20会将总线强制拉低
delayUs(3);
if(STU_DS18B20)
t=1;
else
t=0;
delayUs(8); //14.92us
delayUs(8);
delayUs(8); //14.92us
RLS_DS18B20; //释放总线
delayUs(12);
return(t);
}
/**********************************************************************
functionName: BYTE readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
BYTE OWReadbyte(void)
{
BYTE i;
BYTE retVal=0;
RLS_DS18B20; //释放总线
for(i=8;i>0;i--)
{
retVal>>=1;
if(OWReadBit)
retVal|=0x80;
}
delayUs(1); //2.71us(大于1us就行了)
return(retVal);
}
/////////////////////////////////////////
void OWWriteBit(unsigned char temp)
{
HLD_DS18B20; //Maga16控制总线
CLR_DS18B20; //强制拉低
if(temp)
RLS_DS18B20; //释放总线
else
CLR_DS18B20; //强制拉低
delayUs(35); //60us
RLS_DS18B20; //释放总线
delayUs(50);
}
/**********************************************************************
functionName: BYTE readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void OWWriteByte(BYTE wb)
{
BYTE i;
BYTE temp;
RLS_DS18B20; //释放总线
for(i=0;i<8;i++)
{
temp=wb>>i;
temp&=0x01;
OWWriteBit(temp);
}
}
///////////////////////////////////////////////
void delayms(void)
{unsigned int i;
int j;
for(j=0;j<10;j++)
{for(i=0;i<40000;i++)
;}
}
/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度
**********************************************************************/
unsigned int readTempDS18B20(void)
{
BYTE tempL,tempH;
WORD x;
OWReset();
OWWriteByte(0xcc); //跳过ROM
OWWriteByte(0x44); //启动温度转换
delayms();
OWReset();
OWWriteByte(0xcc); //跳过ROM
OWWriteByte(0xbe); //读数据
tempL=OWReadbyte();
tempH=OWReadbyte();
x=(tempH<<8)|tempL;
return(x);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -