📄 ds18b20_driver.c
字号:
#include "AT89S52.H"
#include "CONFIG.H"
#include <intrins.h>
#define SKIP_ROM 0xCC
#define CONVERT_T 0x44
#define READ_SCRATCHPAD 0xBE
sbit DQ=P2^6;
uchar data WLSB;
uchar data WMSB;
uchar data TH;
uchar data TL;
uchar data CONFIG;
uchar data COUNT_REMAIN;
uchar data COUNT_PER_C;
uchar data CRC;
uchar bdata T_BUF;
sbit T_BUF_0=T_BUF^0;
uchar data TEMPERATURE_INT,SIGN;
uint data TEMPERATURE_FLOAT;
/*****************************
存在脉冲检测 *
*****************************/
bit T_Check(void)
{
uchar data i;
for(i=0;i<20;i++);//62US
if(DQ) return 0;
for(i=0;i<160;i++);//482US
return 1;
}
/*****************************
复位脉冲 *
*****************************/
void Rst(void)
{
uchar data i;
DQ=1;
DQ=0;
for(i=0;i<166;i++);//500US
DQ=1;
}
/****************************
读1位 *
****************************/
void Read(void)
{
uchar data i;
DQ=1;
DQ=0;
_nop_();
_nop_();
DQ=1;
for(i=0;i<3;i++);//11US
T_BUF_0=DQ;
for(i=0;i<17;i++);//53US
}
/****************************
读1字节 *
****************************/
uchar Read_Byte(void)
{
uchar data i;
T_BUF=0;
for(i=0;i<8;i++)
{
Read();
T_BUF=_cror_(T_BUF,1);
}
return T_BUF;
}
/****************************
写0 *
****************************/
void Write_0(void)
{
uchar data i;
DQ=1;
DQ=0;
for(i=0;i<21;i++);//65US
DQ=1;
}
/****************************
写1 *
****************************/
void Write_1(void)
{
uchar data i;
DQ=1;
DQ=0;
for(i=0;i<1;i++);//5US
DQ=1;
for(i=0;i<20;i++);//62US
}
/****************************
发送一字节 *
****************************/
void Send_Byte(uchar dat)
{
uchar data i;
T_BUF=dat;
for(i=0;i<8;i++)
{
if(T_BUF_0) Write_1();
else Write_0();
T_BUF=_cror_(T_BUF,1);
}
}
/****************************************
温度值翻译程序 *
****************************************/
void Trans(void)
{
SIGN=WMSB>>4;
if(SIGN>0)
{
WMSB=~WMSB;
WLSB=~WLSB;
WLSB++;
}
TEMPERATURE_INT=((WLSB>>4)+(WMSB<<4));
TEMPERATURE_FLOAT=(WLSB&0x0f)*625;
}
/****************************************
温度转换程序 *
****************************************/
void Convert(void)
{
do{
Rst();
}
while(!T_Check());
Send_Byte(SKIP_ROM);
Send_Byte(CONVERT_T);
while(Read_Byte()!=0xff);
do{
Rst();
}
while(!T_Check());
Send_Byte(SKIP_ROM);
Send_Byte(READ_SCRATCHPAD);
WLSB=Read_Byte();
WMSB=Read_Byte();
/*
TH=Read_Byte();
TL=Read_Byte();
CONFIG=Read_Byte();
Read_Byte();
COUNT_REMAIN=Read_Byte();
COUNT_PER_C=Read_Byte();
CRC=Read_Byte();
*/
Rst();
Trans();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -