?? ds18b20.c
字號:
//========================================================
// 文件名稱: DS18B20.c
// 功能描述: DS18B20的相關操作,通過用戶接口函數取得函數值
// 維護記錄: 2005-11-22 v1.0
//========================================================
#include "DS18B20.h"
#include "SPCE061A.h"
//========================================================
// 語法格式: void Delay(unsigned int uiTime)
// 實現功能: 延時,在調用Delay(1)時,延時時間小于1us
// 參數: uiTime
// 返回值: 無
//========================================================
void Delay(unsigned int uiTime)
{
while(uiTime > 0)
{
uiTime -= 1;
}
}
//========================================================
// 語法格式: void Set_DQ(int Dir)
// 實現功能: 改變IOB15口的狀態
// 參數: Dir,1:IOB15輸出1;0:IOB15懸浮輸入
// 返回值: 無
//========================================================
void Set_DQ(int Dir)
{
if(Dir > 0)
*P_IOB_Dir |= 0x8000;
else
*P_IOB_Dir &= 0x7fff;
*P_IOB_Buffer |= 0x8000;
}
//========================================================
// 語法格式: void Clr_DQ(int Dir)
// 實現功能: 改變IOA15口的狀態
// 參數: Dir,1:IOB15輸出0;0:IOB15懸浮輸入
// 返回值: 無
//========================================================
void Clr_DQ(int Dir)
{
if(Dir > 0)
*P_IOB_Dir |= 0x8000;
else
*P_IOB_Dir &= 0x7fff;
*P_IOB_Buffer &= 0x7fff;
}
//========================================================
// 語法格式: unsigned int Read_DQ(void)
// 實現功能: 讀取DQ的值
// 參數: 無
// 返回值: DQ的值
//========================================================
unsigned int Read_DQ(void)
{
unsigned int uiTemp;
uiTemp = 0;
if((*P_IOB_Data & 0x8000) > 0)
uiTemp = 1;
return(uiTemp);
}
//========================================================
// 語法格式: unsigned int Read_18B20_Byte(void)
// 實現功能: 讀取18B20的值
// 參數: 無
// 返回值: 18B20的值
//========================================================
unsigned int Read_18B20_Byte(void)
{
int i;
unsigned int Data;
Data = 0;
for(i=0;i<8;i++)
{
Set_DQ(1);
Delay(1);
Clr_DQ(1);
Delay(2);
Set_DQ(0); //切為輸入
Data = Data >> 1;
if(Read_DQ()>0)
Data |= 0x0080;
Delay(31);
}
return(Data);
}
//========================================================
// 語法格式: void Write_18B20_Byte(unsigned int Data)
// 實現功能: 寫18B20
// 參數: 要寫的字節
// 返回值: 無
//========================================================
void Write_18B20_Byte(unsigned int Data)
{
int i;
Set_DQ(1);
Delay(1);
for(i=0;i<8;i++)
{
Clr_DQ(1);
Delay(1);
if((Data&0x0001)>0)
Set_DQ(1);
Data = Data >> 1;
Delay(31);
Set_DQ(1);
Delay(1);
}
}
//========================================================
// 語法格式: int Init_18B20(void)
// 實現功能: 初始化18B20
// 參數: 要寫的字節
// 返回值: 無
//========================================================
int Init_18B20(void)
{
int flag;
Set_DQ(1);
Delay(1);
Clr_DQ(1);
Delay(250);
Set_DQ(0);
Delay(31);
if(Read_DQ()>0)
flag = 1;
else
{
flag = 0;
Delay(220);
}
Set_DQ(1);
return(flag);
}
//========================================================
// 語法格式: unsigned int Read_Temp(void)
// 實現功能: 讀取溫度
// 參數: 無
// 返回值: 溫度值
//========================================================
unsigned int Read_Temp(void)
{
int i;
unsigned int uiT;
unsigned int Data[10];
Set_DQ(1);
while(Init_18B20()>0)
*P_Watchdog_Clear = 0x0001;
Delay(40);
Write_18B20_Byte(0xcc);
Write_18B20_Byte(0x44);
for(i=0;i<26;i++)
Delay(15000); //長時間延時
while(Init_18B20()>0)
*P_Watchdog_Clear = 0x0001;;
Write_18B20_Byte(0xcc);
Write_18B20_Byte(0xbe);
for(i=0;i<8;i++) //數據讀取
Data[i] = Read_18B20_Byte();
i = Data[1]; //溫度的高字節
i = i << 8;
uiT = Data[0]; //溫度的低字節
uiT |= i; //高低字節組和,有效位數11位
Init_18B20();
return uiT;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -