?? ds18b20.c
字號:
#include <msp430x16x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define DQ1 P6OUT |= BIT6
#define DQ0 P6OUT &= ~BIT6
#define DQ_in P6DIR &= ~BIT6
#define DQ_out P6DIR |= BIT6
#define DQ_val (P6IN & BIT6)
/*******************************************
函數名稱:DelayNus
功 能:實現N個微秒的延時
參 數:n--延時長度
返回值 :無
說明 :定時器A的計數時鐘是1MHz,CPU主頻8MHz
所以通過定時器延時能夠得到極為精確的
us級延時
********************************************/
void DelayNus(uint n)
{
CCR0 = n;
TACTL |= MC_1; //增計數到CCR0
while(!(TACTL & BIT0)); //等待
TACTL &= ~MC_1; //停止計數
TACTL &= ~BIT0; //清除中斷標志
}
/*******************************************
函數名稱:Init_18B20
功 能:對DS18B20進行復位操作
參 數:無
返回值 :初始化狀態標志:1--失敗,0--成功
********************************************/
uchar Init_18B20(void)
{
uchar Error;
DQ_out;
_DINT();
DQ0;
DelayNus(500);
DQ1;
DelayNus(55);
DQ_in;
_NOP();
if(DQ_val)
{
Error = 1; //初始化失敗
}
else
{
Error = 0; //初始化成功
}
DQ_out;
DQ1;
_EINT();
DelayNus(400);
return Error;
}
/*******************************************
函數名稱:Write_18B20
功 能:向DS18B20寫入一個字節的數據
參 數:wdata--寫入的數據
返回值 :無
********************************************/
void Write_18B20(uchar wdata)
{
uchar i;
_DINT();
for(i = 0; i < 8;i++)
{
DQ0;
DelayNus(6); //延時6us
if(wdata & 0X01) DQ1;
else DQ0;
wdata >>= 1;
DelayNus(50); //延時50us
DQ1;
DelayNus(10); //延時10us
}
_EINT();
}
/*******************************************
函數名稱:Read_18B20
功 能:從DS18B20讀取一個字節的數據
參 數:無
返回值 :讀出的一個字節數據
********************************************/
uchar Read_18B20(void)
{
uchar i;
uchar temp = 0;
_DINT();
for(i = 0;i < 8;i++)
{
temp >>= 1;
DQ0;
DelayNus(6); //延時6us
DQ1;
DelayNus(8); //延時9us
DQ_in;
_NOP();
if(DQ_val) temp |= 0x80;
DelayNus(45); //延時45us
DQ_out;
DQ1;
DelayNus(10); //延時10us
}
_EINT();
return temp;
}
/*******************************************
函數名稱:Skip
功 能:發送跳過讀取產品ID號命令
參 數:無
返回值 :無
********************************************/
void Skip(void)
{
Write_18B20(0xcc);
}
/*******************************************
函數名稱:Convert
功 能:發送溫度轉換命令
參 數:無
返回值 :無
********************************************/
void Convert(void)
{
Write_18B20(0x44);
}
/*******************************************
函數名稱:Read_SP
功 能:發送讀ScratchPad命令
參 數:無
返回值 :無
********************************************/
void Read_SP(void)
{
Write_18B20(0xbe);
}
/*******************************************
函數名稱:ReadTemp
功 能:從DS18B20的ScratchPad讀取溫度轉換結果
參 數:無
返回值 :讀取的溫度數值
********************************************/
uint ReadTemp(void)
{
uchar temp_low;
uint temp;
temp_low = Read_18B20(); //讀低位
temp = Read_18B20(); //讀高位
temp = (temp<<8) | temp_low;
return temp;
}
/*******************************************
函數名稱:ReadTemp
功 能:控制DS18B20完成一次溫度轉換
參 數:無
返回值 :測量的溫度數值
********************************************/
uint Do1Convert(void)
{
uchar i;
do
{
i = Init_18B20();
}
while(i);
Skip();
Convert();
for(i = 20;i > 0;i--)
DelayNus(60000); //延時800ms以上
do
{
i = Init_18B20();
}
while(i);
Skip();
Read_SP();
return ReadTemp();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -