AVR 單個DS18B20溫度讀取程序(可測負(fù)溫度)
把兩個文件放入工程,需要溫度時(shí)調(diào)用DS18B20_ReadTemperature,返回值就是溫度.
DS18B20.h
/****** AVR 單個DS18B20溫度讀取程序 ******* 版本.........: 1.0
* 目標(biāo).........: AVR
* 文件名.......: DS18B20.h
* 編譯器.......: IAR for AVR V5.5
*****************************************/
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include
#include "delay.h"
#define DS18B20_DQ_DDR DDRG
#define DS18B20_DQ_PORT PORTG
#define DS18B20_DQ_PIN PING
#define DS18B20_DQ_BIT 4
#define DS18B20_DQ_IN DS18B20_DQ_DDR &= ~(1 << DS18B20_DQ_BIT)
#define DS18B20_DQ_OUT DS18B20_DQ_DDR |= (1 << DS18B20_DQ_BIT)
#define DS18B20_DQ_LOW DS18B20_DQ_PORT &= ~(1 << DS18B20_DQ_BIT)
#define DS18B20_DQ_HIGH DS18B20_DQ_PORT |= (1 << DS18B20_DQ_BIT)
#define DS18B20_DQ_VALUE (DS18B20_DQ_PIN & (1 << DS18B20_DQ_BIT))
externfloatDS18B20_ReadTemperature(void);
#endif/* __DS18B20_H__ */
#endif/* __DS18B20_H__ */
DS18B20.c
/****** AVR 單個DS18B20溫度讀取程序 ******
* 版本.........: 1.0
* 作者.........: 陳利棟
* 目標(biāo).........: AVR
* 文件名.......: DS18B20.c
* 編譯器.......: IAR for AVR V5.5
* 創(chuàng)建時(shí)間.....: 2010.10.09
* 最后修改.....: 2010.10.09
*****************************************/
#include "DS18B20.h"
staticvoidDS18B20_Init(void)
{
unsignedchartime_out=0;
DS18B20_DQ_OUT;
DS18B20_DQ_HIGH;
DS18B20_DQ_LOW;
_delay_us(600);
DS18B20_DQ_IN;
DS18B20_DQ_HIGH;
_delay_us(100);
while(DS18B20_DQ_VALUE&&((time_out++)<200));
_delay_us(400);
}
staticvoidDS18B20_WriteByte(unsignedchar_data)
{
unsignedchari=0;
DS18B20_DQ_OUT;
for(i=0;i<8;i++)
{
DS18B20_DQ_LOW;
_delay_us(2);
if(_data&0x01)
{
DS18B20_DQ_HIGH;
}
_data>>=1;
_delay_us(60);
DS18B20_DQ_HIGH;
}
}
staticunsignedcharDS18B20_ReadByte(void)
{
unsignedchari=0,_data=0;
for(i=0;i<8;i++)
{
DS18B20_DQ_OUT;
DS18B20_DQ_LOW;
_delay_us(5);
_data>>=1;
DS18B20_DQ_HIGH;
DS18B20_DQ_IN;
if(DS18B20_DQ_VALUE)
{
_data|=0x80;
}
DS18B20_DQ_OUT;
DS18B20_DQ_HIGH;
_delay_us(60);
}
return_data;
}
floatDS18B20_ReadTemperature(void)
{
unsignedchartl=0,th=0;
floatt=0;
DS18B20_Init();
DS18B20_WriteByte(0xcc);
DS18B20_WriteByte(0x44);
DS18B20_Init();
DS18B20_WriteByte(0xcc);
DS18B20_WriteByte(0xbe);
tl=DS18B20_ReadByte();
th=DS18B20_ReadByte();
if((th&0xf8)==0)// 正溫度
{
t=((th&0x07)<<4)+((tl&0xf0)>>4)+((tl&0x07)*0.125);
}
else// 負(fù)溫度
{
t=-55+(((th&0x07)<<4)+((tl&0xf0)>>4)-0x49)+((tl&0x07)*0.125);
}
returnt;
}
* 版本.........: 1.0
* 作者.........: 陳利棟
* 目標(biāo).........: AVR
* 文件名.......: DS18B20.c
* 編譯器.......: IAR for AVR V5.5
* 創(chuàng)建時(shí)間.....: 2010.10.09
* 最后修改.....: 2010.10.09
*****************************************/
#include "DS18B20.h"
staticvoidDS18B20_Init(void)
{
unsignedchartime_out=0;
DS18B20_DQ_OUT;
DS18B20_DQ_HIGH;
DS18B20_DQ_LOW;
_delay_us(600);
DS18B20_DQ_IN;
DS18B20_DQ_HIGH;
_delay_us(100);
while(DS18B20_DQ_VALUE&&((time_out++)<200));
_delay_us(400);
}
staticvoidDS18B20_WriteByte(unsignedchar_data)
{
unsignedchari=0;
DS18B20_DQ_OUT;
for(i=0;i<8;i++)
{
DS18B20_DQ_LOW;
_delay_us(2);
if(_data&0x01)
{
DS18B20_DQ_HIGH;
}
_data>>=1;
_delay_us(60);
DS18B20_DQ_HIGH;
}
}
staticunsignedcharDS18B20_ReadByte(void)
{
unsignedchari=0,_data=0;
for(i=0;i<8;i++)
{
DS18B20_DQ_OUT;
DS18B20_DQ_LOW;
_delay_us(5);
_data>>=1;
DS18B20_DQ_HIGH;
DS18B20_DQ_IN;
if(DS18B20_DQ_VALUE)
{
_data|=0x80;
}
DS18B20_DQ_OUT;
DS18B20_DQ_HIGH;
_delay_us(60);
}
return_data;
}
floatDS18B20_ReadTemperature(void)
{
unsignedchartl=0,th=0;
floatt=0;
DS18B20_Init();
DS18B20_WriteByte(0xcc);
DS18B20_WriteByte(0x44);
DS18B20_Init();
DS18B20_WriteByte(0xcc);
DS18B20_WriteByte(0xbe);
tl=DS18B20_ReadByte();
th=DS18B20_ReadByte();
if((th&0xf8)==0)// 正溫度
{
t=((th&0x07)<<4)+((tl&0xf0)>>4)+((tl&0x07)*0.125);
}
else// 負(fù)溫度
{
t=-55+(((th&0x07)<<4)+((tl&0xf0)>>4)-0x49)+((tl&0x07)*0.125);
}
returnt;
}
評論