頭文件部分:
#ifndef __DS18B20_H__
#define __DS18B20_H__
#define uint8 unsigned char
#define uint16 unsigned int
sbit DQ=P3^7;
uint16 get_temp();
#endif
程序部分:
#include
#include "DS18B20.h"
#include
/*********************************************************************
* 函數(shù)名稱:write_byte(uint8 num)
* 功 能:向18B20寫數(shù)據(jù)
* 入口參數(shù):要寫的一個字節(jié)的數(shù)據(jù)
* 出口參數(shù):無
* 返 回 值:無
********************************************************************/
void write_byte(uint8 num)
{
uint8 i;
uint16 tt;
bit m;
for(i=0;i<8;i++)
{
m=num&0x01;
num>>=1;
DQ=1;
DQ=0;
tt++;
DQ=m;
for(tt=0;tt<7;tt++);
DQ=1;
tt++;
}
}
/*********************************************************************
* 函數(shù)名稱:read_byte()
* 功 能:向18B20讀數(shù)據(jù)
* 入口參數(shù):無
* 出口參數(shù):無
* 返 回 值:讀出的一個字節(jié)數(shù)據(jù)
********************************************************************/
uint8 read_byte()
{
uint8 i,num;
uint16 tt;
bit m;
for(i=0;i<8;i++)
{
DQ=1;
DQ=0;
tt++;
DQ=1;
tt++;
m=DQ;
for(tt=0;tt<7;tt++);
DQ=1;
num>>=1;
if(m)
{
num|=0x80;
}
}
return(num);
}
/*********************************************************************
* 函數(shù)名稱:DS18b20_reset()
* 功 能:18B20復位
* 入口參數(shù):無
* 出口參數(shù):無
* 返 回 值:無
********************************************************************/
void DS18b20_reset()
{
bit m=1;
uint16 tt;
while(m)
{
while(m)
{
DQ=1;
DQ=0;
for(tt=0;tt<80;tt++);
DQ=1;
for(tt=0;tt<5;tt++);
m=DQ;
}
for(tt=0;tt<50;tt++);
m=~DQ;
}
DQ=1;
}
/*********************************************************************
* 函數(shù)名稱:start_temp()
* 功 能:啟動溫度轉換
* 入口參數(shù):無
* 出口參數(shù):無
* 返 回 值:無
********************************************************************/
void start_temp()
{
DS18b20_reset();
write_byte(0xCC); // 發(fā)Skip ROM命令
write_byte(0x44); // 發(fā)轉換命令
}
/*********************************************************************
* 函數(shù)名稱:get_temp()
* 功 能:獲取溫度值
* 入口參數(shù):無
* 出口參數(shù):無
* 返 回 值:18B20的雙字節(jié)溫度
********************************************************************/
uint16 get_temp()
{
uint8 a,b;
uint16 temp;
DS18b20_reset();
write_byte(0xCC); //發(fā)Skip ROM命令
write_byte(0xBE); //發(fā)read命令
a=read_byte(); //低8位
b=read_byte(); //高8位
temp=b<<8;
temp|=a;
start_temp();
return(temp);
}