?? ds18b20.c
字號:
/******************************************************************************/
/* 單片機(jī)系統(tǒng)培訓(xùn)項(xiàng)目程序資料 */
/* DS18B20的溫度測試程序 */
/*----------------------------------------------------------------------------*/
/*程序說明:此程序是單片機(jī)89C51控制并接收DS18B20的數(shù)據(jù)而設(shè)計的電路 */
/* 程序中應(yīng)用了一線式通信協(xié)議 */
/* 程序中采用浮點(diǎn)數(shù)存入溫度參數(shù),精度為1/1000 */
/* 程序中做了相應(yīng)的基礎(chǔ)函數(shù),用戶可以直接調(diào)用 */
/*電路描述: */
/******************************************************************************/
#include"reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int
typedef unsigned char byte;
typedef unsigned int word;
#define bool bit
#define true 1
#define false 0
sbit DS18B20_DQ =P3^3; //定義通信端口
/******************************************************************************/
/*函數(shù)名稱:void QNPX_Delay(unsigned int DelayTime) */
/*函數(shù)功能:延時函數(shù),用戶可以根據(jù)單片機(jī)的晶振進(jìn)行調(diào)整時間 */
/*輸入?yún)?shù):無 */
/*返回參數(shù):無 */
/*函數(shù)類型:私有函數(shù) */
/******************************************************************************/
void QNPX_Delay(unsigned int DelayTime)
{
while(DelayTime--){
_nop_();
_nop_();
};
}
/******************************************************************************/
/*函數(shù)名稱:void QNPX_OwReset() */
/*函數(shù)功能:DS18B20的初始化函數(shù) */
/*輸入?yún)?shù):無 */
/*返回參數(shù):無 */
/*函數(shù)類型:私有函數(shù) */
/******************************************************************************/
//
void QNPX_OwReset(void)
{
unsigned char x=0;
DS18B20_DQ = 1; //DQ復(fù)位
QNPX_Delay(8); //稍做延時
DS18B20_DQ = 0; //單片機(jī)將DQ拉低
QNPX_Delay(80); //精確延時 大于 480us
DS18B20_DQ = 1; //拉高總線
QNPX_Delay(14);
x=DS18B20_DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
QNPX_Delay(20);
}
/******************************************************************************/
/*函數(shù)名稱:void QNPX_ReadByte() */
/*函數(shù)功能:讀一個字節(jié),返回讀取的數(shù)據(jù) */
/*輸入?yún)?shù):無 */
/*返回參數(shù):dat:返回從DB18B20讀取的數(shù)據(jù) */
/*函數(shù)類型:私有函數(shù) */
/******************************************************************************/
//
unsigned char QNPX_ReadByte(void)
{
unsigned char Cnt=0;
unsigned char dat = 0;
for (Cnt=8;Cnt>0;Cnt--)
{
DS18B20_DQ = 0; // 給脈沖信號
dat>>=1;
DS18B20_DQ = 1; // 給脈沖信號
if(DS18B20_DQ)
dat|=0x80;
QNPX_Delay(4);
}
return(dat);
}
/******************************************************************************/
/*函數(shù)名稱:QNPX_WriteByte(unsigned char dat) */
/*函數(shù)功能:寫一個字節(jié)到DS18B20 */
/*輸入?yún)?shù):dat:寫入數(shù)據(jù)到DB18B20期 */
/*返回參數(shù):無 */
/*函數(shù)類型:私有函數(shù) */
/******************************************************************************/
//寫一個字節(jié)
void QNPX_WriteByte(unsigned char dat)
{
unsigned char Cnt=0;
for (Cnt=8; Cnt>0; Cnt--)
{
DS18B20_DQ = 0;
DS18B20_DQ = dat&0x01;
QNPX_Delay(5);
DS18B20_DQ = 1;
dat>>=1;
}
//QNPX_Delay(4);
}
/******************************************************************************/
/*函數(shù)名稱:int QNPX_ReadTemperature(void) */
/*函數(shù)功能:讀取溫度 */
/*輸入?yún)?shù):無 */
/*返回參數(shù):返回讀取的溫度,并返回一個整形數(shù)據(jù),經(jīng)過浮點(diǎn)的*0.0625處理,就是可 */
/* 以使用的溫度 */
/*函數(shù)類型:私有函數(shù) */
/******************************************************************************/
int QNPX_ReadTemperature(void)
{
union{
byte c[2];
int x;
}Temp;
float tt=0;
QNPX_OwReset();
QNPX_WriteByte(0xCC); // 跳過讀序號列號的操作
QNPX_WriteByte(0x44); // 啟動溫度轉(zhuǎn)換
QNPX_OwReset();
QNPX_WriteByte(0xCC); //跳過讀序號列號的操作
QNPX_WriteByte(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
Temp.c[1]=QNPX_ReadByte();
Temp.c[0]=QNPX_ReadByte();
return(Temp.x);
}
main()
{
int ReadTemp;
float ChgTemp;
ReadTemp = QNPX_ReadTemperature();
ChgTemp = ReadTemp*0.0625; //輕過轉(zhuǎn)換到攝氏溫度,這個才是真正的溫度,可以用于顯示。
_nop_();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -