分类: 嵌入式
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); //设置分频 1:2:4
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)
//实现功能: 读取18B20的ID号
//入口参数: 无
//出口返回值: 无
//========================================
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