Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7688364
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2011-07-15 11:14:15

//======================================================================

//  工程名称:  DS18B20.mcp

//  IDE环境:   TX2440A  ADS v1.2

//  功能描述:  驱动DS18B20,在终端上显示温度值

//  组成文件:  main.c

//  硬件连接:  DQ ---- GPB5

//  维护记录:  2009-10-15 V1.0 

//======================================================================

 

//=============================================================

// 文件名称:  main.c

// 功能描述:  定义了主函数

// 维护记录:  2009-10-15 V1.0

//=============================================================

//====================================================

// 包含头文件区

//====================================================

#include "2440addr.h"

#include "2440lib.h"

#include "option.h"

#include "def.h"

#include "uart.h"

#include "DS18B20.h"

 

void Main(void)

{

    SetSysFclk(FCLK_220M);  //设置系统时钟 220M    

    ChangeClockDivider(1, 1);      //设置分频 124

    CalcBusClk();           //计算总线频

   

    Uart_Select(0);

    Uart_Init(0, 115200);

   

    Test_DS18B20();

    while(1);

}

 

 

//=============================================================

// 文件名称:  DS18B20.c

// 功能描述:  DS18B20驱动

// 维护记录:  2009-10-15 V1.0   

//=============================================================

#include "2440addr.h"

#include "2440lib.h"

#include "def.h"

#include "uart.h"

#include "DS18B20.h"

 

#define DELAY 66

 

U16 temp;

U8 DS18B20_ID[8] = {0};

extern unsigned int PCLK;

 

void usDelay(int time) 

{

    U32 i,j;

    for (i = time; i > 0; i--)

        for (j =DELAY; j > 0; j--);

}

 

//========================================

//函数名称:  void DS18B20_Init(void)

//实现功能:  初始化18B20

//入口参数:  

//出口返回值:

//========================================

void DS18B20_Init(void)

{  

    DQ_OUT;

    DQ_L;

    usDelay(700);

    DQ_H;

    usDelay(60);

    DQ_IN;

   

    if(DQ_STAT!=0)    //测试复位是否成功

        Uart_Printf("There is no 18B20 at GPB5! 0x%x\n");

 

}

//========================================

//函数名称:  U8 DS18B20_ReadBit(void)

//实现功能:  读取18b20的一位数据

//入口参数:  

//出口返回值: 读取的一位数据

//========================================

U8 DS18B20_ReadBit(void)   

{

    U8 dat;

    DQ_OUT;

    DQ_L;

    usDelay(2);

    DQ_IN;

    usDelay(10);

    if(DQ_STAT!=0)

        dat=1;

    else

        dat=0;

    usDelay(50);

    return (dat);

}

//========================================

//函数名称:  U8 DS18B20_ReadByte(void)

//实现功能:  读取一个字节的数据

//入口参数:  

//出口返回值: 读取的一个字节数据

//========================================

U8 DS18B20_ReadByte(void)  

{

    U8 i,j,dat;

    dat=0;

    for(i=1;i<=8;i++)

    {

        j=DS18B20_ReadBit();

        dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT

    }

    return(dat);

}

 

//========================================

//函数名称:  void DS18B20_WriteByte(U8 dat)

//实现功能:  18B20写一个字节数据

//入口参数:   要写入的数据

//出口返回值:

//========================================

void DS18B20_WriteByte(U8 dat)

{

    U8 j;

    U8 testb;

    DQ_OUT;

    for(j=1;j<=8;j++)

    {

        testb=dat&0x01;

        dat=dat>>1;

        if(testb)    

        {

            DQ_L;

            usDelay(1);

            DQ_H;

            usDelay(50);

        }

        else

        {

            DQ_L;

            usDelay(50);

            DQ_H;

        }

    }

}

 

//========================================

//函数名称:  void DS18B20_ReadID(void)

//实现功能:  读取18B20ID

//入口参数:  

//出口返回值:

//========================================

void DS18B20_ReadID(void)

{

    usDelay(1);

    DS18B20_Init();

    DS18B20_WriteByte(DS18B20_ReadROM);

    DS18B20_ID[0] = DS18B20_ReadByte();

    DS18B20_ID[1] = DS18B20_ReadByte();

    DS18B20_ID[2] = DS18B20_ReadByte();

    DS18B20_ID[3] = DS18B20_ReadByte();

    DS18B20_ID[4] = DS18B20_ReadByte();

    DS18B20_ID[5] = DS18B20_ReadByte();

    DS18B20_ID[6] = DS18B20_ReadByte();

    DS18B20_ID[7] = DS18B20_ReadByte();

}

 

//========================================

//函数名称:  void DS18B20_Match(void)

//实现功能:  匹配18B20

//入口参数:  

//出口返回值:

//========================================

void DS18B20_Match(void)

{

    DS18B20_WriteByte(DS18B20_MatchROM);

    DS18B20_WriteByte(DS18B20_ID[0]);

    DS18B20_WriteByte(DS18B20_ID[1]);

    DS18B20_WriteByte(DS18B20_ID[2]);

    DS18B20_WriteByte(DS18B20_ID[3]);

    DS18B20_WriteByte(DS18B20_ID[4]);

    DS18B20_WriteByte(DS18B20_ID[5]);

    DS18B20_WriteByte(DS18B20_ID[6]);

    DS18B20_WriteByte(DS18B20_ID[7]);

}

 

//========================================

//函数名称:  void DS18B20_TmpChange(void)

//实现功能:  18B20开始温度转换

//入口参数:  

//出口返回值:

//========================================

void DS18B20_TmpChange(void)

{

    DS18B20_Init();

    usDelay(120);/*delay(1);*/

    DS18B20_WriteByte(DS18B20_SkipROM);  // address all drivers on bus

    DS18B20_WriteByte(DS18B20_ConvertTemp);  //  initiates a single temperature conversion

}

 

//========================================

//函数名称:  U16 DS18B20_Temperature(void)

//实现功能:  得到18B20温度值

//入口参数:  

//出口返回值: 温度值

//========================================

U16 DS18B20_Temperature(void)

{

    float tt;

    U8 a,b;

    DS18B20_Init();

    usDelay(2000);/*delay(1);*/

    DS18B20_WriteByte(DS18B20_SkipROM);

    DS18B20_WriteByte(DS18B20_ReadSCR);

    a=DS18B20_ReadByte();

    b=DS18B20_ReadByte();

    temp=b;

    temp<<=8;             //two byte  compose a int variable

    temp=temp|a;

    tt=temp*0.0625;

    temp=tt*10+0.5;

    return temp;

}

 

//========================================

//函数名称:  void Test_DS18B20(void)

//实现功能:  18B20测试程序

//入口参数:  

//出口返回值:

//========================================

void Test_DS18B20(void)

{

    U16 tmp;

 

    Uart_Printf("DS18B20 TEST!\n");

    Uart_Printf("Now start temperature change!\n");

    while(1)

    {

        DS18B20_TmpChange();

        Delay(1000);

        tmp =  DS18B20_Temperature();

        Uart_Printf("Temperature is  [%d.%d `C]\n", tmp/10, tmp%10);  

        //usDelay(10000); Uart_Printf("DS18B20 TEST!\n");

    }

}

 

 

//=============================================================

// 文件名称:  DS18B20.h

// 功能描述:  DS18B20驱动头文件

// 维护记录:  2009-10-15 V1.0   

//=============================================================

 

#ifndef __DS18B20_H_

#define __DS18B20_H_

 

//====================================================

// 常量定义区

//====================================================

#define   DQ_IN     rGPBCON &= 0xFFFFF3FF

#define   DQ_OUT    rGPBCON = (rGPBCON | 0xC00) & 0xFFFFF7FF

#define   DQ_DOWN   rGPBUP |= (1 << 5)

#define   DQ_UP     rGPBUP &= ~(1 << 5)

#define   DQ_H      rGPBDAT |= (1 << 5)

#define   DQ_L      rGPBDAT &= ~(1 << 5)

#define   DQ_STAT   (rGPBDAT >> 5) & 0x1

 

//定义DS18B20ROM指令

#define    DS18B20_ReadROM        0x33    //ROM

#define    DS18B20_MatchROM       0x55    //匹配ROM

#define    DS18B20_SkipROM        0xCC    //跳过ROM

#define    DS18B20_SearchROM      0xF0    //搜索ROM

#define    DS18B20_AlarmROM       0xEC    //报警搜索

 

//定义DS18B20存储器操作命令

#define    DS18B20_WriteSCR       0x4E    //写暂存存储器

#define    DS18B20_ReadSCR        0xBE    //读暂存存储器

#define    DS18B20_CopySCR        0x48    //复制暂存存储器

#define    DS18B20_ConvertTemp    0x44    //温度变换

#define    DS18B20_RecallEP       0xB8    //重新调出

#define    DS18B20_ReadPower      0xB4    //读电源

 

void Test_DS18B20(void);

 

#endif

 

DS18B20驱动工程源代码 DS18B20.rar   

阅读(2575) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~