?? msp430f149-
字號:
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define DQ1 P3OUT |= BIT0
#define DQ0 P3OUT &= ~BIT0
/////////////////////////////////////////////
void DelayNus(unsigned int n);
unsigned char Init_18B20(void);
void Write_18B20(unsigned char wdata);
unsigned char Read_18B20(void);
void Skip(void);
void Convert(void);
void Read_SP(void);
unsigned int ReadTemp(void);
unsigned int Do1Convert(void);
/*******************************************
函數名稱: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;
_DINT();
DQ0;
DelayNus(500);
DQ1;
DelayNus(55);
P3DIR &=~ BIT0;
_NOP();
if(P3IN & BIT0)
{
Error = 1; //初始化失敗
P3DIR |= BIT0;
}
else
{
Error = 0; //初始化成功
P3DIR |= BIT0;
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
P3DIR &= ~BIT0;
_NOP();
if(P3IN & BIT0) temp |= 0x80;
DelayNus(45); //延時45us
P3DIR |= BIT0;
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 + -