原创 DS18B20驱动程序

2008-1-12 22:59 5759 10 11 分类: MCU/ 嵌入式
/**********************************************************************************
    名称: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


//****************************************************




PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户90422 2008-4-6 23:21

/********* 读序列号 *****************/ void read_code(unsigned char *s) { i=0 ; while(ow_reset()); // send_mun(1); write_byte(0x33); //读序列号命令 for(;i<8;i++) //共64位序号 { s[i]=read_byte(); } } main() { uart_int(); read_code(nod); for(i=0;i<8;i++) { send_char(nod[i]); } while(1); }
相关推荐阅读
用户114442 2009-03-10 20:04
uCGUI中文手册
https://static.assets-stash.eet-china.com/album/old-resources/2009/3/10/e850cbd5-bc51-440c-9a08-6890...
用户114442 2009-03-05 00:40
IAR-AVR –C 编译器简要指南
网上下载的有关ewavr编译器的资料  , 共享下 我觉得想用IAR来写avr的初学者可以下载看看.....
用户114442 2009-03-05 00:34
EWAVR 5.11b full keygen
nbsp;如何将RGB色彩信息和YUV色彩信息之间转换1.RGB介绍:在记录计算机图像时,最常见的是采用RGB(红、绿,蓝)颜色分量来保存颜色信息,例如非压缩的24位的BMP图像就采用RGB空间来保存...
用户114442 2009-03-04 15:19
农历两百年算法(1901~2100)[转载]
//此文章来自http://blog.chinaunix.net/u/25381/showart_199998.html下面的三个表格是农历数据表 LunarCalendarTable 的结构。总共使...
用户114442 2008-11-18 00:35
AVR 初始代码生成器
https://static.assets-stash.eet-china.com/album/old-resources/2008/11/18/fa5a62ba-43ac-4109-8794-070...
用户114442 2008-11-17 22:14
51 AVR 串口通讯计算器
https://static.assets-stash.eet-china.com/album/old-resources/2008/11/17/437013c8-2c53-4203-b7eb-f72...
我要评论
1
10
关闭 站长推荐上一条 /3 下一条