/*********************************************************
函数:DS18B20_ReSet(void)
输入:无;
输出:无;
说明:复位DS18B20(初始化)
*********************************************************/
void DS18B20_ReSet(void)
{
uchar i;
DQ=0; // 总线 拉低; (单片机 主动 给出的信号 ;)
i=240; // 保持 480us;
while(--i);
DQ=1; // 总线 释放,拉高,上升沿;
i=30;
while(--i); // 保持 60us;
while(~DQ); // 等待 传感器 释放总线,把IO 拉高;( 温感 给出的信号 ;)
i=4;
while(--i); // 保持 8-10us;
}
/*********************************************************
函数:DS18B20_WriteByte(uchar dat)
输入:有;
输出:无;
说明:向DS18B20写入一个字节
*********************************************************/
void DS18B20_WriteByte(uchar dat)
{
uchar j;
uchar btmp;
for(j=0;j<8;j++)
{
btmp=0x01; // 0000 0001 ;
btmp=btmp<<j;
btmp=btmp&dat; // 用 1 & 0/1 相与;
if(btmp>0) // 写1
{
DQ=0;
Delay15us();
DQ=1;
Delay15us();
Delay15us();
Delay15us();
Delay15us();
}
else // 写0
{
DQ=0;
Delay15us();
Delay15us();
Delay15us();
Delay15us();
DQ=1;
Delay15us();
}
}
}
/*********************************************************
函数:DS18B20_ReadTemp(void)
输入:无;
输出:有;
说明:读取温度值
*********************************************************/
int DS18B20_ReadTemp(void)
{
uchar j;
int b,temp=0;
DS18B20_ReSet(); // 产生复位脉
DS18B20_WriteByte(0xcc); // 忽略ROM指令(只接 1 个传感器,无需序列号)
DS18B20_WriteByte(0x44); // 启动温度转换指令
DS18B20_ReSet(); // 产生 复位脉
DS18B20_WriteByte(0xcc); // 忽略 ROM 指令
DS18B20_WriteByte(0xbe); // 读取 温度指令(读 暂存器 指令)
for(j=0;j<16;j++) // 读取 温度数量 (16次循环)
{
DQ=0; // 拉低 总线;
_nop_(); // 保持最少 1us;
_nop_();
DQ=1; // 释放 总线;
Delay15us(); // 等待 15us;
b=DQ; // 采集 总线 电压 保存 到 变量 b;
Delay15us();
Delay15us(); // 等待 45 us;
Delay15us();
b=b<<j; // 注意:b 是一个 单 1 bit 的 值(0,或1)
temp=temp|b;
}
temp=temp*0.0625*10; // 合成温度值并放大10倍 0.0625 是精度;
return (temp); // 返回检测到的温度值
}
联系人:客服在线
手机:全工:13903011251
电话:李R:13530006400
邮箱:729986191@qq.com
地址: GUANGDONG PROVINCE