/*****************************************************************************
FileName : DS18B20.c
Function : DS18B20温度传感器驱动程序
Author : mike
Email : [email protected]
Version : V1.0
Date : 2019-07-12
Note :
主控:STC12C5A60S2
*****************************************************************************/
#include "include.h"
#include "DS18B20.h"
sbit DQ = P3^6;
void delayus(int m)//1T--->STC12C5A60S2
{
for(;m>0;m--)
{
_nop_();
_nop_();
}
}
u8 ds18b20_init(void)//初始化ds18B20
{
u8 retry = 0;
DQ = 1; //DQ复位
delayus(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delayus(250); //精确延时 大于 480us
DQ = 1; //拉高总线
delayus(15);
while((!DQ) && (retry++ < 250))
{
delayus(2);
}
delayus(20);
if(retry >= 250)
return 1; //1初始化失败
return 0; //0初始化成功
}
//******************************************************************************
u8 readonechar(void)//读一字节
{
u8 i=0;
u8 dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat >>= 1;
DQ = 1; // 给脉冲信号
if(DQ)
dat |= 0x80;
delayus(15);
}
return dat;
}
//******************************************************************************
void writeonechar(u8 dat)//写一字节
{
u8 i = 0;
for (i = 8;i > 0;i--)
{
DQ = 0;
DQ = dat&0x01;
delayus(5); //不能延时过久
DQ = 1;
dat >>= 1;
}
}
//******************************************************************************
u16 read_temperature(void)//读取温度
{
u8 TPL = 0;
u8 TPH = 0;
u16 temp = 0;
u8 retry = 0;
ds18b20_init();
writeonechar(0xCC); // 跳过读序号列号的操作
writeonechar(0x44); // 启动温度转换
//while(!DQ); //等待转换完成
while((!DQ) && (retry++ < 250))
{
delayus(2);
}
ds18b20_init();
writeonechar(0xCC); //跳过读序号列号的操作
writeonechar(0xBE); //读取温度寄存器
TPL = readonechar();//读低8位
TPH = readonechar();//读高8位
temp = ((u16)TPH << 8) | (u16)TPL; //高8位和低8位转化为u16
//温度在寄存器中为12位,分辨率为0.0625,放大10倍输出并四舍五入
temp = (u16)((float)temp*0.0625*10+0.5);
return temp;
}
u16 temp_disp(void)//显示温度---消抖计算,使温度更准确
{
u16 read_dat = 0;
read_dat = read_temperature();
//printf("DS18B20读出dat = %d",read_dat);
//printf("℃\n");
return read_dat;
}