標題:
LPC1114采集溫度傳感器DS18B20程序
[打印本頁]
作者:
笑侃中南
時間:
2018-11-20 16:44
標題:
LPC1114采集溫度傳感器DS18B20程序
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 進行初始化
* 入口參數(shù):
* 出口參數(shù):
* 說明:
****************************************************************************/
unsigned char DS18B20_Init(void)
{
unsigned char result;
DQ_OUT;
DQ_L;
Delay_Us(600); // 總線拉低480us~960us ,即主機發(fā)送復位脈沖
DQ_H;
DQ_IN; // 總線設(shè)為輸入狀態(tài),等待18b20 應(yīng)答
Delay_Us(60);
result=DQ_DATE; // 讀取18b20 應(yīng)答信號
// Send_TO_DWIN(0x00,result,2);
Delay_Us(500); // 等待480us 以上,保證總線釋放
return(result); // 返回0 則初始化成功
}
/****************************************************************************
* 名稱: unsigned char DS18B20_ReadBit(void)
* 功能:從DS18B20 單總線上讀1Bit 數(shù)
* 入口參數(shù):
* 出口參數(shù):
* 說明:
****************************************************************************/
unsigned char DS18B20_ReadBit(void)
{
unsigned char result;
DQ_OUT; // 設(shè)置總線為輸出狀態(tài)
DQ_L; // 總線拉低,產(chǎn)生讀起始信號
Delay_Us(2); // 保證低電平在1us 以上
//要在15us 內(nèi)讀取總線上數(shù)據(jù)
DQ_IN;
Delay_Us(3); // 這個延時很重要,沒有這個延時,讀不出18B20的數(shù)據(jù)
result=DQ_DATE; // 接收數(shù)據(jù)
Delay_Us(60); // 延時60us,保證總線釋放
return(result); // 返回數(shù)據(jù)
}
/****************************************************************************
* 名稱: void DS18B20_WriteBit(unsigned char Data)
* 功能:給DS18B20 單總線上寫1Bit 數(shù)
* 入口參數(shù):
* 出口參數(shù):
* 說明:
****************************************************************************/void
DS18B20_WriteBit(unsigned char Data)
{
DQ_OUT; // 設(shè)置總線為輸出
DQ_L; // 產(chǎn)生寫起始信號
Delay_Us(10); //15us 后寫入數(shù)據(jù)
if(Data) DQ_H;
else DQ_L;
Delay_Us(80); // 延時60us~120us ,保證總線釋放
DQ_IN; // 空閑狀態(tài)總線保持輸入狀態(tài)
}
/****************************************************************************
* 名稱: unsigned char DS18B20_ReadByte(void)
* 功能:從DS18B20 單總線上讀1Byte 數(shù)
* 入口參數(shù):
* 出口參數(shù):
* 說明:
****************************************************************************/
unsigned char DS18B20_ReadByte(void)
{
unsigned char i,result=0;
for(i=0;i<8;i++)
{
result>>=1;
// if(DS18B20_ReadBit()) result|=0x80; // 設(shè)為上拉電阻,當讀取值為0時,實際上總線為高電平,所以要反過來
// else result&=0x7f;
if(DS18B20_ReadBit()) result&=0x7f;
else result|=0x80;
}
return(result);
}
/****************************************************************************
* 名稱: void DS18B20_WriteByte(unsigned char Data)
* 功能:給DS18B20 單總線上寫1Byte 數(shù)
* 入口參數(shù):
* 出口參數(shù):
* 說明:
****************************************************************************/
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 上讀取溫度值
* 入口參數(shù):
* 出口參數(shù):
* 說明:
****************************************************************************/
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(); // 讀溫度低字節(jié)
tempH=DS18B20_ReadByte(); // 讀溫度高字節(jié)
// 未考慮溫度為負情況
// 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[i]=tempH;
Temperature[i]<<=8;
Temperature[i]+=tempL;
if(wenduqk) Temperature[i]= Temperature[i]; //返回溫度值
else Temperature[i]= -Temperature[i];
}
//冒泡法排序
for (i=0; i<9;i++)
{
for(j=i+1;j<=9;j++)
{
if(Temperature[i]>Temperature[j])
{
T1=Temperature[i];
Temperature[i]=Temperature[j];
Temperature[i]=T1;
}
}
}
T=0;
for(i=0;i<6;i++)
{
T=T+Temperature[2+i];
}
T=T*(0.625)/6;
}
復制代碼
作者:
li190418
時間:
2018-11-28 11:05
感謝分享,學習下
作者:
dexta64
時間:
2018-12-12 20:57
謝謝。 一個有趣的圖書館
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1