?? ds18b20.c
字號:
/******************************************************************************/
/**
/** 功能描述:通過AT89S/C52,DS18B20和6位數碼管,采集溫度并在數碼管上實時顯示。
/** 并有相應的不同顏色的led和蜂鳴器指示。
/** 創 建 人:chiusir@yahoo.cn 日期:2008-04-06 */
/** 修 改 人: 日期:2008-04-18 */
/** 其他說明:
/******************************************************************************/
#include<regx51.h>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
sbit SIO = P2^0;
/*******************************************************************************
*** 函 數 名: void DLY_us(U8 x)
*** 功能描述: 微秒級延時;
*** 全局變量: NO !
*** 輸 入: x !
*** 輸 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函數說明:
*** //1-5,2-7,3-9 ,5--16.5us,10-30.4,22-52,25-58,35-78,61-125,125-250,250--500us
/******************************************************************************/
void DLY_us(U8 x) //x取值1~255;
{
while(--x);
}
/*******************************************************************************
*** 函 數 名: void DLY_ms(U16 x)
*** 功能描述: 毫秒級延時;
*** 全局變量: NO !
*** 輸 入: U16 x !
*** 輸 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函數說明:
/******************************************************************************/
void DLY_ms(U8 x) //x取值1~255;
{
U8 i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
/*******************************************************************************
*** 函 數 名: void Init1820()
*** 功能描述:
*** 全局變量: NO !
*** 輸 入: NO !
*** 輸 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函數說明:
/******************************************************************************/
void Init1820()
{
SIO = 1;
_nop_();
SIO = 0; //拉低數據線,準備Reset OneWire Bus;
DLY_us(125); //延時500us,Reset One-Wire Bus.
DLY_us(125);
SIO = 1; //提升數據線;
DLY_us(15); //延時35us;
while(SIO) //等待Slave 器件Ack 信號;
{
_nop_();
}
DLY_us(60); //延時125us;
SIO = 1; //提升數據線,準備數據傳輸;
}
/*******************************************************************************
*** 函 數 名: static void DS18B20_WR(U8 cmd)
*** 功能描述: 寫一個字節;
*** 全局變量: NO !
*** 輸 入: cmd:8bit;
*** 輸 出: NO !
*** 函數說明: cmd主要有Rom操作指令和E2Ram操作指令兩種;
/******************************************************************************/
void WR1820(U8 cmd)
{
U8 i;
for(i=0;i<8;i++)
{
if(cmd & 0x01) //低位在前;
{
SIO = 0; //結束Recovery time;
_nop_();
_nop_();
_nop_();
SIO = 1;
} //發送數據;
else
SIO = 0; //結束Rec time;
_nop_();
_nop_();
_nop_();
//SIO = 0; } //發送數據;
DLY_us(30); //等待Slave Device采樣;
SIO = 1; //Recovery;
_nop_(); //Recovery Time Start;
cmd >>= 1;
}
}
/*******************************************************************************
*** 函 數 名: U8 RD1820(void)
*** 功能描述: 讀取一個字節;
*** 全局變量: NO !
*** 輸 入: NO !
*** 輸 出: 8bit data;*
*** 函數說明: 讀之前必須首先寫1;
/******************************************************************************/
U8 RD1820(void)
{
U8 i;
U8 tmp=0;
SIO = 1;
_nop_(); //準備讀;
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先發;
SIO = 0; //Read init;
_nop_(); //1us;
SIO = 1; //必須寫1,否則讀出來的將是不預期的數據;
DLY_us(2); //延時7us;
_nop_();
if(SIO) //在12us處讀取數據;
tmp |= 0x80;
DLY_us(30); //延時55us;
SIO = 1;
_nop_(); //恢復One Wire Bus;
}
return tmp;
}
/*******************************************************************************
*** 函 數 名: U16 RD_T();
*** 功能描述: 讀取溫度;
*** 全局變量: NO !
*** 輸 入: NO !
*** 輸 出: 16bit data;
*** 函數說明: 讀之前必須首先寫1;
/******************************************************************************/
U16 RD_T()
{
U16 tp;
U8 tmbuf[2];
Init1820();
WR1820(0xcc);
//delay_ms(2);
WR1820(0x44);
// _nop_();
// SIO=1;
// delay_ms(250); //多個1820時要延時,單個就不用,數據手冊里看
// delay_ms(250);
// delay_ms(250);
Init1820();
WR1820(0xcc);
WR1820(0xbe);
tmbuf[0]=RD1820();
tmbuf[1]=RD1820();
Init1820();
tp=tmbuf[1]*256+tmbuf[0];
return(tp);
}
/*******************************************************************************
**** End Of File
*******************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -