📄 ds18b20.c
字号:
#include "ds18b20.h"
sbit DataPortDS1820=P1^3;
void Delay3us()
{
_nop_();
_nop_();
_nop_();
}
void DelayNus(uchar us)
{
while(us)
{
Delay3us();
us--;
}
}
void Delay45us()
{
DelayNus(15);
}
void Delay30us()
{
DelayNus(10);
}
bit RstDS1820(void)
{
uchar i;
bit RstFlag;
ENTER_CRITICAL
RstFlag=1;
DataPortDS1820=0;
for (i=0;i<40;i++) //480us
Delay45us();
DataPortDS1820=1;
Delay45us();
if (DataPortDS1820==0) RstFlag=0;
for (i=0;i<16;i++) //240us
{
Delay45us();
}
OUT_CRITICAL
return RstFlag;
}
void WriteDS1820(uchar ch)
{
uchar i;
ENTER_CRITICAL
DataPortDS1820=1;
Delay3us();
for (i=0;i<8;i++)
{
DataPortDS1820=0;
Delay3us();
DataPortDS1820=ch&0x01;
Delay45us();Delay45us();
DataPortDS1820=1;
ch=ch>>1;
Delay3us();
}
OUT_CRITICAL
}
uchar ReadDS1820(void)
{
uchar i,ch;
ch=0;
ENTER_CRITICAL
DataPortDS1820=1;
Delay3us();
for (i=0;i<8;i++)
{
DataPortDS1820=0;
Delay3us();
DataPortDS1820=1;
DelayNus(2);
ch=ch>>1;
if (DataPortDS1820==1)
{
ch=ch+0x80;
}
Delay45us();
}
OUT_CRITICAL
return ch;
}
void SkipROMCode(void)
{
RstDS1820();
WriteDS1820(0xcc);
}
void StartADC(void)
{
RstDS1820(); //复位
WriteDS1820(0xcc); //广播
WriteDS1820(0x44); //启动AD转换 12bit700ms
}
uint GetTempValue(void)
{
uint t;
uchar a,b;
// uchar i,j;
StartADC();
/*for(i=0;i<3;i++)
for(j=0;j<250;j++)
Delay3us();*/
SkipROMCode();
WriteDS1820(0xBE);
a=ReadDS1820();
b=ReadDS1820();
t=b;
t=(t<<8)|a;
return t;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -