DS18b20 溫度檢測(cè)說(shuō)明
********************************************************************
**這是學(xué)習(xí) msp430g2553 單片機(jī)時(shí)寫(xiě)的DS18b20 的程序 **
**DS18b20單總線,時(shí)序嚴(yán)格,完全自學(xué)明白浪費(fèi)了n久??!**
**最高精度0.0625,即溫度每變 0.0625 就能被檢測(cè)到**
**網(wǎng)上一些 *0.0625 、*256/1000、/16 的都是錯(cuò)誤的(I think) **
**DQ 接 p2.4**
********************************************************************
********************************************************************
**DS18b20 操作時(shí)序:**
**1. DS18b20 初始化**
**2. 對(duì)64位ROM進(jìn)行操作**
**讀ROM**
**搜索ROM**
**跳過(guò)ROM**
**告警搜索**
**3. 對(duì)寄存器進(jìn)行操作**
**4. 精度默認(rèn)的為0.0625 ,無(wú)法重新設(shè)定,沒(méi)找到相應(yīng)的指令**
**相對(duì)應(yīng)的轉(zhuǎn)換時(shí)間為750ms**
********************************************************************
#include
#include
#define DQ_1 P2OUT |= BIT4
#define DQ_0 P2OUT &= ~BIT4
#define DQ_inP2DIR &= ~BIT4
#define DQ_outP2DIR |= BIT4
#define DQ_val(P2IN & BIT4)
#define Read_ROM0x33//讀ROM
#define Match_ROM 0x55//匹配ROM
#define Skip_ROM 0xcc//跳過(guò)ROM
#define Search_ROM 0xf0//搜索ROM
#define Alarm_Search 0xec//告警搜索
#define Convert_Temperature 0x44 //溫度轉(zhuǎn)換
#define Read_Scratchpad 0xbe//讀暫存存儲(chǔ)器9字節(jié)內(nèi)容
#define Write_Scratchpad 0x4e//寫(xiě)暫存存儲(chǔ)器,寫(xiě)的是TH and TL , 接著發(fā)送兩位數(shù)據(jù)就可以
****************************************************
**內(nèi)部暫存存儲(chǔ)器9字節(jié)內(nèi)容**
**1. 溫度低8位**
**2. 溫度高8位**
**3. 溫度上限TH**
**4. 溫度下線TL**
**5. 配置**
**6.7.8 保留**
**9. CRC 校驗(yàn)碼**
****************************************************
unsigned int Check_val; //初始化檢測(cè)變量
unsigned int Temp;//溫度整數(shù)值
****************************************************************************************
**DS18b20 初始化方法:**
**1 主機(jī)發(fā)送 480 - 960 us 的低電平,釋放總線**
** 2 等待 15 - 60 us**
** 3 檢測(cè)DQ上是否有低電平出現(xiàn)**
**有:復(fù)位成功 ,通常時(shí)間為 60-240 us**
**無(wú):復(fù)位失敗,繼續(xù)等待**
**4 DQ上出現(xiàn)低電平后,低電平持續(xù)15us,然后DS18b20開(kāi)始對(duì)單片機(jī)發(fā)送的數(shù)據(jù)進(jìn)行采樣**
****************************************************************************************
unsigned intDS18b20_init(void)
{
DQ_out;
DQ_0;
__delay_cycles(600);
DQ_1;
__delay_cycles(60);
DQ_in;
_NOP();
if(DQ_val)
{
Check_val = 0;//初始化失敗
}
else
{
Check_val = 1;//初始化成功
}
__delay_cycles(10);
DQ_out;
DQ_1;
__delay_cycles(100);
return Check_val;
}