Temperature.h文件
#ifndef _TEMPERATURE_H_
#define _TEMPERATURE_H_
#include "lpc11xx.h"
#define DQ_H (LPC_GPIO0->DATA |= (1<<2))
#define DQ_L (LPC_GPIO0->DATA &=~(1<<2))
#define DQ_IN (LPC_GPIO0->DIR&=~(1<<2))
#define DQ_OUT (LPC_GPIO0->DIR|=(1<<2))
#define DQ_DATE ((LPC_GPIO0->DATA&0x4)>>2^1)
//DS18B20 ROM 命令宏定义
#define ReadRom 0x33
#define MatchRom 0x55
#define Skip_ROM 0xcc //跳过ROM
#define SearchRom 0xf0
#define AlertSearch 0xec
#define CopyScratchpad 0x48
#define SkipRom 0xcc
#define ReadPower 0xb4
//DS18B20 功能命令宏定义
#define ConvertTemperature 0x44
#define ReadScratchpad 0xbe
#define WriteScratchpad 0x4e
#define RecallE 0xb8
extern unsigned char DS18B20_Init(void);
#endif
Temperature.c文件#include "temperature.h"#include "lpc11xx.h"
#include "timer.h"
extern uint16_t T;
extern unsigned char tempH,tempL,wenduqk;
/****************************************************************************
* 名称: unsigned char DS18B20_Init(void)
* 功能:对DS18B20 进行初始化
* 入口参数:
* 出口参数:
* 说明:
****************************************************************************/
unsigned char DS18B20_Init(void)
{
unsigned char result;
DQ_OUT;
DQ_L;
Delay_Us(600); // 总线拉低480us~960us ,即主机发送复位脉冲
DQ_H;
DQ_IN; // 总线设为输入状态,等待18b20 应答
Delay_Us(60);
result=DQ_DATE; // 读取18b20 应答信号
// Send_TO_DWIN(0x00,result,2);
Delay_Us(500); // 等待480us 以上,保证总线释放
return(result); // 返回0 则初始化成功
}
/****************************************************************************
* 名称: unsigned char DS18B20_ReadBit(void)
* 功能:从DS18B20 单总线上读1Bit 数
* 入口参数:
* 出口参数:
* 说明:
****************************************************************************/
unsigned char DS18B20_ReadBit(void)
{
unsigned char result;
DQ_OUT; // 设置总线为输出状态
DQ_L; // 总线拉低,产生读起始信号
Delay_Us(2); // 保证低电平在1us 以上
//要在15us 内读取总线上数据
DQ_IN;
Delay_Us(3); // 这个延时很重要,没有这个延时,读不出18B20的数据
result=DQ_DATE; // 接收数据
Delay_Us(60); // 延时60us,保证总线释放
return(result); // 返回数据
}
/****************************************************************************
* 名称: void DS18B20_WriteBit(unsigned char Data)
* 功能:给DS18B20 单总线上写1Bit 数
* 入口参数:
* 出口参数:
* 说明:
****************************************************************************/void
DS18B20_WriteBit(unsigned char Data)
{
DQ_OUT; // 设置总线为输出
DQ_L; // 产生写起始信号
Delay_Us(10); //15us 后写入数据
if(Data) DQ_H;
else DQ_L;
Delay_Us(80); // 延时60us~120us ,保证总线释放
DQ_IN; // 空闲状态总线保持输入状态
}
/****************************************************************************
* 名称: unsigned char DS18B20_ReadByte(void)
* 功能:从DS18B20 单总线上读1Byte 数
* 入口参数:
* 出口参数:
* 说明:
****************************************************************************/
unsigned char DS18B20_ReadByte(void)
{
unsigned char i,result=0;
for(i=0;i<8;i++)
{
result>>=1;
// if(DS18B20_ReadBit()) result|=0x80; // 设为上拉电阻,当读取值为0时,实际上总线为高电平,所以要反过来
// else result&=0x7f;
if(DS18B20_ReadBit()) result&=0x7f;
else result|=0x80;
}
return(result);
}
/****************************************************************************
* 名称: void DS18B20_WriteByte(unsigned char Data)
* 功能:给DS18B20 单总线上写1Byte 数
* 入口参数:
* 出口参数:
* 说明:
****************************************************************************/
void DS18B20_WriteByte(unsigned char Data)
{
unsigned char i;
for(i=0;i<8;i++)
{
DS18B20_WriteBit(Data&0x01);
Data>>=1;
}
}
/****************************************************************************
* 名称: void DS18B20_ReadTemp(void)
* 功能:从DS18B20 上读取温度值
* 入口参数:
* 出口参数:
* 说明:
****************************************************************************/
void DS18B20_ReadTemp(void)
{
unsigned char i,j;
uint16_t Temperature[10],T1;
DS18B20_Init();
for(i=0;i<10;i++)
{
DS18B20_WriteByte(SkipRom);
DS18B20_WriteByte(ConvertTemperature);
// Delay_Ms(600); // 按照要求延时1s 左右,但是不延时也可以,还未找到原因
DS18B20_Init();
DS18B20_WriteByte(SkipRom);
DS18B20_WriteByte(ReadScratchpad);
tempL=DS18B20_ReadByte(); // 读温度低字节
tempH=DS18B20_ReadByte(); // 读温度高字节
// 未考虑温度为负情况
// Temperature=tempH;
// Temperature<<=8;
// Temperature+=tempL;
// Temperature=0.625*Temperature;
// 考虑温度为负情况
if(tempH>7)//(TH>xxxxx111)温度为负
{
tempH=~tempH;tempL=~tempL;
wenduqk=0;
}
else wenduqk=1;//温度为正
Temperature=tempH;
Temperature<<=8;
Temperature+=tempL;
if(wenduqk) Temperature= Temperature; //返回温度值
else Temperature= -Temperature;
}
//冒泡法排序
for (i=0; i<9;i++)
{
for(j=i+1;j<=9;j++)
{
if(Temperature>Temperature[j])
{
T1=Temperature;
Temperature=Temperature[j];
Temperature=T1;
}
}
}
T=0;
for(i=0;i<6;i++)
{
T=T+Temperature[2+i];
}
T=T*(0.625)/6;
}
谢谢分享!可以做一些小东西出来
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
挺不错,支持。也可以选用DS18B20成品检测模块LCT2662M或者仪表LCT2201C
北京长信物联科技有限公司
专业的USB温湿度传感器、485温湿度传感器、气体传感器、64路DS18B20温度采集模块厂商。
www.lct2000.cn
QQ:1930227091