/**********************************************************************************
名称:DS18B20驱动程序
作者:bill
修改记录:
版本:keil v8.08
日期:2008.1.20
/***********************器件控制介绍***********************************************
*1.每一个操作都实现 1. 初始化:复位,存在脉冲
2. 5个ROM命令中的一个
3. 数据传送
.命令: 1.ROM: 1.读rom: 33h //一个器件时可用,读器件的64位 rom东东
2.匹配rom: 55h //一个器件时可用,用于操作一个与主机 发出的rom相同的器件,写后跟一个 rom 序列
3.跳过rom: cch //一个器件时可用,命令全部器件
4.检查多少个器件和存在器件的rom: foh //用于多个器件
5.查是否超过设定温度范围: ech
2.数据:温度转换指令 44 //传完后读忙, //把转换后的数据存放在 RAM的B0、B1的两个字节里
读取温度指令 BE //器件收到这个指令后把B0、B1两个字 节的数据传送给主机,然后发出复位脉 冲,不然 // b20将送完9字节为止
设定温度上下限 4E //写RAM的B2、B3、B4的数据,主机发出 这个指令后跟着再分别发送相应的数据
上下限到eeprom 48 //器件收到这个指令后就将B2、B3、B4的数 据写到EEPROM ,b20拷贝忙时将DQ为0不 然为1
上下限到ram B8 //器件收到这个指令后就把EEPROM的高H、低 L温度报警值写到进B2、B3,b20拷贝忙时将 // DQ为0不然为1
使用的电源命令 B4 //器件收到这个指令后就返回0或者1给主 机,0为寄生电源,1为外部电源
.时序: 1.复位脉冲:480us低电平,复位脉冲发出后经60us检测存在脉冲,DQ=0器 件存在,DQ=1不存在
实现: 1.DQ=0
2.延时500us(480us--960us)
3.DQ=1
4.延时70us(60--240)
5.读存在脉冲,DQ=0器件存在,DQ=1不存在
6.延时400us
7.释放总线
3.读写时间间隙:
18b20读写是通过时间间隙和命令来控制的
1.写时间间隙:写1或0都要维持60us左右,因为b20在检测到DQ 变为0后将在15us---60us内检测数据,
那么就要在拉低后的15us前拉高总线,
数据间传送至少延时1us来让b20处理准备
实现:1.拉低总线
2.延时5us
3.写1或0
4.延时60us
5. 释放总线
2.读时间间隙:开始: 当主机把DQ从1变0后,读时序开始,
2us 时写1.延时15us时
读数据:在变0后的2--15us后有效,0时为0,
1时为1
15us后读数据(数据维持60us,数据 间隔 1us)
实现:1.拉低总线
2.延时2us
3.拉高为1
4.延时5us
5.读总线
6.延时55us
7.释放总线
.DS18B20引脚:1.GND 2.DQ 3.VDD
..DS18B20的存储器资源如下表 (为了便于理解,存储器A、B、C是我自己定义的名字):
ROM(8个字节) A0 A1 A2 A3 A4 A5 A6 A7 --
RAM(9个字节) B0 B1 B2 B3 B4 B5 B6 B7 B8
EEPROM(3个字节) C0 C1 C2 -- -- -- -- -- --
A0既是64位ID码的一部分,也是64位ID码的的CRC校验值,A1~A6是ID码其中的48位,A7是器件码(28H)。
B0温度低8位值、B1是温度高8位值,B2、B3是温度报警值,B4是温度转换精度值,B5、B6、B7是系统保留用,
就相当于运算内存,B8是B0~B7的校验码
**** 注意用完总线后,释放总线!***************************
************************************************************************************************************************************
/fose=12M
/硬件要求: DS18B20:1.GND 2.DQ 3.VDD
/使用:先调用 void Start_18b20(void)
等过800ms(cpu做其他事)
调用 uint Read_18B20(void)
返回uint (uint 的高8位为整数,低8位为小数部分)
*****************************************/
#include
#include
#include"ds18B20.h"
#ifndef uchar
#define uchar unsigned char
#endif
/********************************************************************
**************复位函数*****************
功能:完成单总线的复位操作
返回值:0-器件存在,1-器件不存在
**************************************/
static bit ow_reset(void)
{ uchar t;
bit presence=0;
DQ=0;
for(t=500;t>0;t--); //延时480us
DQ=1;
for(t=70;t>0;t--); //延时70us
presence=DQ; //DQ=0器件存在,DQ=1不存在
for(t=400;t>0;t--); //延时200us //等待复位的结束,才能读数据
DQ=1; //释放总线,拉高DQ
return presence;
}
/**************位写入函数**************
功能:向单总线写入1位值
*************************************/
static void write_bit(bit bitval)
{uchar t;
DQ=0;
for(t=5;t>0;t--);
DQ=bitval;
for(t=55;t>0;t--); //延时60us
DQ=1; //释放总线,准备下一个传输
_nop_();
}
/**************字节写入函数***********
功能:向单总线写入一个字节值.先写低位
************************************/
void write_byte(uchar val)
{
uchar i;
bit ea=EA;
EA=0;
for(i=8;i>0;i--)
{
write_bit(val&0x01);
val>>=1;
}
DQ=1; //释放总线
EA=ea;
}
/***********位读取函数**************
功能:从单总线上读取一位信号
**********************************/
static bit read_bit(void)
{
uchar t;
bit temp;
DQ=0;
for(t=2;t>0;t--);
DQ=1;
for(t=5;t>0;t--); //延时5us----和写时b20读相同---都是降低后的16us后读数据
temp=DQ; //从DQ变0后开始到现在已经有16us了,读数据
for(t=50;t>0;t--); //剩下的50us
_nop_();
DQ=1; //释放总线
return temp;
}
/***********字节读取函数***********
功能:从单总线上读取一字节.先读低位
*********************************/
uchar read_byte(void)
{
uchar i,value=0;
for(i=8;i>0;i--)
{
value=value>>1;
if(read_bit()) value|=0x80;
}
return value;
}
//**********启动温度转换函数***********/
void Start_18b20(void)
{
//if(ow_reset()) return ;
write_byte(0xcc); //跳过ROM
write_byte(0x44); //启动温度转换,默认的12位转化,最大转化时间750ms
ow_reset();
}
//**********读温度函数*************/
uint Read_18b20(void) //uint
{
union{
uchar c[2];
uint x;
}tt;
write_byte(0xcc); //跳过ROM
write_byte(0xbe);
tt.c[1]=read_byte();
tt.c[0]=read_byte();
ow_reset();
return tt.x;}
//*****************************************************************************
/***************************************
// DS18B20头文件
****************************************/
#ifndef _DS18B20_H_
#define _DS18B20_H_
#ifndef uchar
#define uchar unsigned char
#define uint unsigned int
#endif
//***********************************
sbit DQ =P3^7 ;
//**********************************
bit ow_reset(void); //复位
void write_bit(bit bitval); //位写入函数
void write_byte(uchar val); //字节写入函数
bit read_bit(void); //位读取函数
uchar read_byte(void); //字节读取函数
void Start_18b20(void); //启动温度转换函数
uint Read_18b20(void) ; //读温度函数
#endif
//****************************************************
用户90422 2008-4-6 23:21