********************************************************************
**這是學(xué)習(xí) msp430g2553 單片機(jī)時寫的DS18b20 的程序 **
**DS18b20單總線,時序嚴(yán)格,完全自學(xué)明白浪費了n久?。?*
**最高精度0.0625,即溫度每變 0.0625 就能被檢測到**
**網(wǎng)上一些 *0.0625 、*256/1000、/16 的都是錯誤的(I think) **
**DQ 接 p2.4**
********************************************************************
********************************************************************
**DS18b20 操作時序:**
**1. DS18b20 初始化**
**2. 對64位ROM進(jìn)行操作**
**讀ROM**
**搜索ROM**
**跳過ROM**
**告警搜索**
**3. 對寄存器進(jìn)行操作**
**4. 精度默認(rèn)的為0.0625 ,無法重新設(shè)定,沒找到相應(yīng)的指令**
**相對應(yīng)的轉(zhuǎn)換時間為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//跳過ROM
#define Search_ROM 0xf0//搜索ROM
#define Alarm_Search 0xec//告警搜索
#define Convert_Temperature 0x44 //溫度轉(zhuǎn)換
#define Read_Scratchpad 0xbe//讀暫存存儲器9字節(jié)內(nèi)容
#define Write_Scratchpad 0x4e//寫暫存存儲器,寫的是TH and TL , 接著發(fā)送兩位數(shù)據(jù)就可以
****************************************************
**內(nèi)部暫存存儲器9字節(jié)內(nèi)容**
**1. 溫度低8位**
**2. 溫度高8位**
**3. 溫度上限TH**
**4. 溫度下線TL**
**5. 配置**
**6.7.8 保留**
**9. CRC 校驗碼**
****************************************************
unsigned int Check_val; //初始化檢測變量
unsigned int Temp;//溫度整數(shù)值
****************************************************************************************
**DS18b20 初始化方法:**
**1 主機(jī)發(fā)送 480 - 960 us 的低電平,釋放總線**
** 2 等待 15 - 60 us**
** 3 檢測DQ上是否有低電平出現(xiàn)**
**有:復(fù)位成功 ,通常時間為 60-240 us**
**無:復(fù)位失敗,繼續(xù)等待**
**4 DQ上出現(xiàn)低電平后,低電平持續(xù)15us,然后DS18b20開始對單片機(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;
}