|
|
#include <DS18B20.h>
#include "intrins.h"
unsigned char DS18B20_time;
sbit DQ = P1^4 ; //定義DS18B20端口DQ
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
void delay_18B20(unsigned int i)
{
while (i--)
{ _nop_();_nop_();_nop_();_nop_();
}
}
//設(shè)置全局變量,專門用于嚴(yán)格延時(shí)
/*****************************************************
函數(shù)功能:將DS18B20傳感器初始化,讀取應(yīng)答信號
出口參數(shù):flag
***************************************************/
/*初始化ds1820 */
/*******************************************************************/
bit Init_DS18B20(void)
{ unsigned char x=0;
DQ = 1; //DQ拉高
delay_18B20(80); //延時(shí)
DQ = 0; //DQ拉低
delay_18B20(800); //延時(shí) 480us以上
DQ = 1; //DQ拉高
delay_18B20(140);
x=DQ; delay_18B20(200);
}
/*****************************************************
函數(shù)功能:從DS18B20讀取一個(gè)字節(jié)數(shù)據(jù)
出口參數(shù):dat
***************************************************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // ?????
dat>>=1;
DQ = 1; // ?????
if(DQ)
dat|=0x80;
delay_18B20(40); //40
}
return(dat);
}
/*****************************************************
函數(shù)功能:向DS18B20寫入一個(gè)字節(jié)數(shù)據(jù)
入口參數(shù):dat
***************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(50); //50
DQ = 1;
dat>>=1;
}
}
/*****************************************************
函數(shù)功能:做好讀溫度的準(zhǔn)備
***************************************************/
void Read_Temperature(void)
{
Init_DS18B20(); //將DS18B20初始化
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
for(DS18B20_time=0;DS18B20_time<100;DS18B20_time++)
; //溫度轉(zhuǎn)換需要一點(diǎn)時(shí)間
Init_DS18B20(); //將DS18B20初始化
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器,前兩個(gè)分別是溫度的低位和高位
}
/******************************************************************************
以下是與溫度有關(guān)的顯示設(shè)置
******************************************************************************/
/****************************************************
函數(shù)功能:溫度的處理
入口參數(shù):x
***************************************************/
unsigned int Disp_Temperature()
{
unsigned char b=0;
unsigned char TN; //儲存溫度的整數(shù)部分
unsigned char TD; //儲存溫度的小數(shù)部分
unsigned int a;
unsigned int auu;
unsigned int temp_value=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_18B20(1);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(1);
a=ReadOneChar(); //???????
b=ReadOneChar(); //???????
TN=b*16+a/16; //實(shí)際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
//這樣得出的是溫度的整數(shù)部分,小數(shù)部分被丟棄了
TD=(a%16)*10/16; //計(jì)算溫度的小數(shù)部分,將余數(shù)乘以10再除以16取整,
//這樣得到的是溫度小數(shù)部分的第一位數(shù)字(保留1位小數(shù))
auu=TN*10+TD;
return auu;
}
|
|