文档库 最新最全的文档下载
当前位置:文档库 › DS18b20头文件

DS18b20头文件

//将下面的所有内容保存为 DS18B20.c
///////////////////////////////////////////////////////////////////////////

/*------------------------------------------------*/
/* ----------------七星电脑-----------------------*/
/* -------------TEL:158********-------------------*/
/* --- -------https://www.wendangku.net/doc/ba2817503.html, ----------------*/
/* --------------适用于:DS18B20 ------------------*/
/*------------------------------------------------*/



#ifndef __DS18b20_H__
#define __DS18b20_H__

#define uchar unsigned char
#define uint unsigned int

uint d,wd; //数值d 为18B20没进行10进制转换时的 16位2进制数值, wd为 进行10进制转换后的实际温度。

typedef uchar BYTE;

sbit DQ = P1^4; //DS18B20的数据口位P3.3
BYTE TPH; //存放温度值的高字节
BYTE TPL; //存放温度值的低字节

void DelayXus(BYTE n);
void DS18B20_Reset();
void DS18B20_WriteByte(BYTE dat);
BYTE DS18B20_ReadByte();

/**************************************
延时X微秒
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void DelayXus(BYTE n)
{
while (n--)
{
_nop_();
_nop_();
}
}

/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
CY = 1;
while (CY)
{
DQ = 0; //送出低电平复位信号
DelayXus(240); //延时至少480us
DelayXus(240);
DQ = 1; //释放数据线
DelayXus(60); //等待60us
CY = DQ; //检测存在脉冲
DelayXus(240); //等待设备释放数据线
DelayXus(180);
}
}

/**************************************
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte()
{
BYTE i;
BYTE dat = 0;

for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
DelayXus(1); //延时等待
DQ = 1; //准备接收
DelayXus(1); //接收延时
if (DQ) dat |= 0x80; //读取数据
DelayXus(60); //等待时间片结束
}

return dat;
}

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
char i;

for (i=0; i<8; i++) //8位计数器
{
DQ = 0; //开始时间片
DelayXus(1); //延时等待
dat >>= 1; //送出数据
DQ = CY;
DelayXus(60);

//等待时间片结束
DQ = 1; //恢复数据线
DelayXus(1); //恢复延时
}
}


void rdds18b20()
{
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!DQ); //等待转换完成

DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TPL = DS18B20_ReadByte(); //读温度低字节
TPH = DS18B20_ReadByte(); //读温度高字节
}

void wendu()
{
uint b;
b++;
if (b>300){rdds18b20();b=0;}
if(TPH<8){ d=TPH*256+TPL;} // DS18B20 高字节前5位 表示0上或是0下。高字节后三位和低8位共同表示温度。 0上时 这11位2进制直接乘以0.0625就是实际温度。
if(TPH>7){ d=~(TPH*256+TPL)+1;} //0下时 需要把这11位取反之后加1 然后乘以0.0625 就是实际温度。
wd=d*6.25; //实际温度值为D*0.0625 为了显示小数点后二位 将温度值放大100倍。
}


#endif
/*
if (TPH<8){if (wd<10000){if (wd>999){smgxs(2,10);}if (wd<1000){smgxs(1,10);wd=d*62.5;}} if (wd>9999){wd=wd/10;smgxs(3,10);}smgxs(1,wd/1000);smgxs(2,wd/100%10);smgxs(3,wd/10%10);smgxs(4,wd%10);}
if (TPH>7){if (wd<10000){if (wd>999){smgxs(3,10);}if (wd<1000){smgxs(2,10);wd=d*62.5;}} smgxs(1,11);smgxs(2,wd/1000);smgxs(3,wd/100%10);smgxs(4,wd/10%10);}
*/
// 自动调整小数点位置显示的演示。

相关文档