DS18B20驱动程序
扫描二维码
随时随地手机看文章
头文件部分:
#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
/*********************************************************************
* 函数名称:write_byte(uint8 num)
* 功 能:向18B20写数据
* 入口参数:要写的一个字节的数据
* 出口参数:无
* 返 回 值:无
********************************************************************/
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++;
}
}
/*********************************************************************
* 函数名称:read_byte()
* 功 能:向18B20读数据
* 入口参数:无
* 出口参数:无
* 返 回 值:读出的一个字节数据
********************************************************************/
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);
}
/*********************************************************************
* 函数名称:DS18b20_reset()
* 功 能:18B20复位
* 入口参数:无
* 出口参数:无
* 返 回 值:无
********************************************************************/
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;
}
/*********************************************************************
* 函数名称:start_temp()
* 功 能:启动温度转换
* 入口参数:无
* 出口参数:无
* 返 回 值:无
********************************************************************/
void start_temp()
{
DS18b20_reset();
write_byte(0xCC); // 发Skip ROM命令
write_byte(0x44); // 发转换命令
}
/*********************************************************************
* 函数名称:get_temp()
* 功 能:获取温度值
* 入口参数:无
* 出口参数:无
* 返 回 值:18B20的双字节温度
********************************************************************/
uint16 get_temp()
{
uint8 a,b;
uint16 temp;
DS18b20_reset();
write_byte(0xCC); //发Skip ROM命令
write_byte(0xBE); //发read命令
a=read_byte(); //低8位
b=read_byte(); //高8位
temp=b<<8;
temp|=a;
start_temp();
return(temp);
}