/*****************************************************************************
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;
}