📄 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 + -