新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 自制51單片機常用頭文件(DS18B20)

自制51單片機常用頭文件(DS18B20)

作者: 時間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
/*--------------------------------------------------------------------------

TEMPERATURE.H

本文引用地址:http://m.butianyuan.cn/article/201611/317352.htm

The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __TEMPERATURE_H__
#define __TEMPERATURE_H__

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P3^3; // ds18b20單片機連接口

uchar data Tp[8]; // 溫度顯示數(shù)據(jù)

/******************************ds1820程序

***************************************/
/*****************************************************
函 數(shù) 名:void Delay_DS(uint useconds)
功 能:DS18B20延時1微秒
說 明:DS18B20時序延時
入口參數(shù):useconds
返 回 值:無
*****************************************************/
//延時
void Delay_DS(uint useconds)//延時1微秒
{
while (useconds--);
}

/*****************************************************
函 數(shù) 名:void Ow_Reset()
功 能:DS18B20復(fù)位
說 明:DS18B20使用時先要復(fù)位
入口參數(shù):無
返 回 值:
*****************************************************/
void Ow_Reset()
{
DQ = 1; // DQ復(fù)位
Delay_DS(4); // 延時
DQ = 0; // DQ拉低
Delay_DS(100); // 精確延時大于480us
DQ = 1; // 拉高
Delay_DS(40);
}

/*****************************************************
函 數(shù) 名:uchar Read_byte()
功 能:從 1-wire 總線上讀取一個字節(jié)
說 明:讀總線上的數(shù)據(jù)有嚴(yán)格的時序
入口參數(shù):
返 回 值:value
*****************************************************/
uchar Read_byte()
{
uchar i = 0;
uchar value = 0;

for (i=8; i>0; i--)
{
DQ = 0; // 給脈沖信號
value >>= 1;
DQ = 1; // 給脈沖信號
if(DQ)
value |= 0x80;
Delay_DS(10);
}

return (value);
}

/*****************************************************
函 數(shù) 名:void Write_Byte()
功 能:向 1-WIRE 總線上寫一個字節(jié)
說 明:寫總線上的數(shù)據(jù)有嚴(yán)格的時序
入口參數(shù):val
返 回 值:無
*****************************************************/
void Write_Byte(uchar val)
{
uchar i = 0;

for (i=8; i>0; i--)
{
DQ = 0;
DQ = val & 0x01;
Delay_DS(10);
DQ = 1;
val >>= 1;
}
}

/*****************************************************
函 數(shù) 名:void Read_Temperature()
功 能:讀溫度并放入顯示數(shù)組中
說 明:
入口參數(shù):xx,yy
返 回 值:無
*****************************************************/
void Read_Temperature()
{
uchar a,b;
uchar tflag; // 溫度正負(fù)標(biāo)志
uint tvalue; // 溫度值

Ow_Reset();
Write_Byte(0xcc); // 跳過讀序列號*
Write_Byte(0x44); // 啟動溫度轉(zhuǎn)換

Ow_Reset();
Write_Byte(0xcc); // 跳過讀序列號
Write_Byte(0xbe); // 讀取溫度

a = Read_byte(); // 讀出溫度低8位
b = Read_byte(); // 讀出溫度高8位
tvalue = b;
tvalue <<= 8;
tvalue = tvalue | a;

if( tvalue < 0x0fff)
{
tflag = 0;
}
else
{
tvalue = ~tvalue + 1;
tflag = 1;
}

tvalue = tvalue*(0.625); // 溫度值擴大10倍,精確到1位小數(shù)

Tp[2] = tvalue%1000/100+0x30; // 十位數(shù)
Tp[3] = tvalue%100/10+0x30; // 個位數(shù)
Tp[4] = 0x2e; // 顯示小數(shù)點
Tp[5] = tvalue%10+0x30; // 顯示溫度小數(shù)位
Tp[6] = 0x01; // 顯示自定義字符
Tp[7]= 0x43; // 顯示字符"C"

if (tflag == 0)
{
Tp[1] = 0x20; // 正溫度不顯示符號
}
else
{
Tp[1] = 0x2d; // 負(fù)溫度顯示負(fù)號:-
}
if (Tp[2] == 0x30)
{
Tp[2] = 0x20; // 如果十位為0,不顯示
}
}

/*****************************************************
函 數(shù) 名:void Adjust_Res()
功 能:溫度分辨率調(diào)整
說 明:此函數(shù)可以對溫度的顯示進行精度調(diào)節(jié).
入口參數(shù):res
返 回 值:無
*****************************************************/
void Adjust_Res(char res) // res 分別等于 0x1f, 0x3f, 0x5f 溫度讀數(shù)分辨率分別對應(yīng)
// 0.5, 0.25, 0.125
{
Ow_Reset(); // 復(fù)位
Write_Byte(0xcc); // 跳過Rom
Write_Byte(0x4e); // 寫暫存器

Write_Byte(0x02); // 寫TH
Write_Byte(0x01); // 寫TL
Write_Byte(res); // 溫度轉(zhuǎn)換分辨率設(shè)置

Ow_Reset(); // 復(fù)位
Write_Byte(0xcc); // 跳過Rom
Write_Byte(0x48); // 把暫存器內(nèi)容寫到EPRam中
}

#endif



關(guān)鍵詞: 51單片機頭文件DS18B2

評論


技術(shù)專區(qū)

關(guān)閉