📄 ds18b20.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 + -