?? ds18b20.c
字號:
#include "msp430x14x.h" // Standard Equations
#include "DS18B20.h"
//----------------------------------------------------------------------
void Delay(unsigned int x); //延時程序
void Temp(void);
//-----------------------全局變量定義------------------------------
unsigned char ID[5][8]; //ID[5][8]為檢索到的地址
unsigned char TEMP_NUMBER; //溫度傳感器數量
unsigned int TEMP[5]; //溫度值
float fT[5];
//-----------------------軟件標志定義------------------------------
unsigned int FLAG; //軟件標志
//FLAG.0--DS18B20復位OK FLAG.1--溫度傳感器OK FLAG.2--搜索溫度結束
//****************************************************************************
//模塊名:Init_DS18B20
//編寫者:liukang
//描述: 初試化DS18B20子程序。
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
void Init_DS18B20(void)
{
DS_DIR = DS18B20;
DS_OUT = 0;
}
void main(void)
{
unsigned int iq0;
WDTCTL = WDTPW +WDTHOLD; //停看門狗
//---------------------------系統時鐘定義---------------------
BCSCTL1&=~XT2OFF; //打開XT2振蕩器
do
{
IFG1 &= ~OFIFG; // 清除振蕩器失效標志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延時,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判斷XT2是否起振
BCSCTL2 =SELM_2+DIVS_0+SELS; //選擇MCLK、SMCLK為XT2
Init_DS18B20();
_EINT();
while (1)
{
Temp();
for (iq0 = 5; iq0 != 0; iq0--)
{
fT[iq0-1] = 0.0625 * TEMP[iq0-1];
}
_NOP();
}
}
//****************************************************************************
//模塊名:Rst_DS18B20
//編寫者:liukang
//描述: 復位溫度傳感器DS18B20子程序。
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
void Rst_DS18B20(void)
{
unsigned int I;
FLAG |= FLAG_TEMP_RET; //預設ds18b20復位OK
W18BUS_0; //拉低總線
Delay(960); //延時480uS
SF18BUS; //釋放總線
Delay(50); //延時15-60uS
I = 890;
while (/*(R18BUS) && */(I != 0)) I--; //循環條件:ds18b20總線不為“0”
//并且延時總時間不夠4mS
if (I != 0)
{
_NOP();
while(!(R18BUS));
}
else
{
FLAG &= ~FLAG_TEMP_RET;
}
}
//****************************************************************************
//模塊名:Read_BUS_bit
//編寫者:liukang
//描述: 從單總線讀一位數據子程序。
//功能: DATA右移一位,從單總線讀一位數據到DATA的最高位,
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
unsigned char Read_BUS_bit (unsigned char DATA)
{
unsigned char I;
DATA >>= 1;
SF18BUS; //釋放總線
I = 30;
while (I != 0) I--;
_DINT();
W18BUS_0; //拉低總線2uS
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
W18BUS_1; //拉高總線
I = 20;
while (I != 0) I--;
if (R18BUS != 0)
DATA |= 0X80;
_NOP();
_EINT();
I = 25; //延時45uS
while (I != 0) I--;
return (DATA);
}
//****************************************************************************
//模塊名:Write_BUS_bit
//編寫者:liukang
//描述: 向單總線寫一位數據子程序。
//功能: 把DATA的最低一位數據寫到單總線上,DATA右移一位
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
unsigned char Write_BUS_bit (unsigned char DATA)
{
unsigned char I;
_DINT();
W18BUS_1;
if (DATA&0X01)
{
DS_DIR |= DS18B20;
DS_OUT &= ~DS18B20;
_NOP();
_NOP();
DS_OUT |= DS18B20;
}
else
{
W18BUS_0;
}
_EINT();
I = 16; //延時15uS
while (I != 0) I--;
DATA >>= 1;
I = 80;
while (I != 0) I--;
W18BUS_1;
_NOP();
_NOP();
return (DATA);
}
//****************************************************************************
//模塊名:Read_BUS_Byte
//編寫者:liukang
//描述: 從單總線讀一個字節數據子程序。
//功能: 返回從單總線讀出的一個字節數據,調用了Read_BUS_bit
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
unsigned char Read_BUS_Byte (void)
{
unsigned char I;
unsigned char DATA;
for (I = 8;I != 0;I--)
{
DATA = Read_BUS_bit(DATA);
}
return (DATA);
}
//****************************************************************************
//模塊名:Write_BUS_Byte
//編寫者:liukang
//描述: 向單總線寫一個字節數據子程序。
//功能: 調用Write_BUS_bit,把DATA數據寫到單總線上
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
void Write_BUS_Byte (unsigned char DATA)
{
unsigned char I;
for (I = 8;I != 0;I--)
{
DATA = Write_BUS_bit(DATA);
}
}
//****************************************************************************
//模塊名:Read_BUS_2bit
//編寫者:liukang
//描述: 從單總線讀2位數據子程序。
//功能: 調用Read_BUS_bit,從單總線讀2位數據到DATA高位,并返回DATA
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
unsigned char Read_BUS_2bit (void)
{
unsigned char DATA;
DATA = 0;
DATA = Read_BUS_bit(DATA);
DATA = Read_BUS_bit(DATA);
return(DATA);
}
//****************************************************************************
//模塊名:Right_Move_Temp
//編寫者:liukang
//描述: 循環右移子程序。
//功能:
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
void Right_Move_Temp(unsigned char *PA,unsigned char *PB)
{
unsigned char DATA,I;
DATA = 0;
if (*PA & 0X01) DATA = 0X80;
PB = PB+7;
if (*PB & 0X01) DATA |= 0X01;
for (I=0; I<7; I++)
{
*PA >>= 1;
*PB >>= 1;
if (*(PA+1) & 0X01) *PA |= 0X80;
else *PA &= 0X7F;
if (*(PB-1) & 0X01) *PB |= 0X80;
else *PB &= 0X7F;
PA++;
PB--;
}
*PA >>= 1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -