📄 ds18b20.c
字号:
#include "msp430x14x.h" // Standard Equations
#include "DS18B20.h"
#include "Time_A.h"
//----------------------------------------------------------------------
void Delay(unsigned int x); //延时程序
void Temp(void);
//-----------------------全局变量定义------------------------------
unsigned char ID[5][8]; //ID[5][8]为检索到的地址
unsigned char TEMP_NUMBER; //温度传感器数量
int TEMP[5]; //温度值*10
float Temperature;
unsigned int ConverFlag;
//-----------------------软件标志定义------------------------------
unsigned int FLAG; //软件标志
//FLAG.0--DS18B20复位OK FLAG.1--温度传感器OK FLAG.2--搜索温度结束
//****************************************************************************
//模块名:Init_DS18B20
//编写者:liukang
//描述: 初试化DS18B20子程序。
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
void Init_DS18B20()
{
DS_DIR |= DS18B20;
DS_OUT = 0;
}
//****************************************************************************
//模块名: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(900); //延时480uS
SF18BUS; //释放总线
Delay(40); //延时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; //拉高总线
_EINT();
I = 20;
while (I != 0) I--;
if (R18BUS != 0)
DATA |= 0X80;
_NOP();
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;
*PB >>= 1;
if (DATA & 0X80) *PA |= 0X80;
else *PA &= 0X7F;
if (DATA & 0X01) *PB |= 0X80;
else *PB &= 0X7F;
}
//****************************************************************************
//模块名:CRC_Verify
//编写者:liukang
//描述: CRC校验子程序。
//功能:
//版本: 1.0
//修改: 2006年05月12日
//****************************************************************************
const unsigned char CRC_H[16] =
{0x00,0x9d,0x23,0xbe,0x46,0xdb,0x65,0xf8,0x8c,0x11,0xaf,0x32,0xca,0x57,0xe9,0x74};
const unsigned char CRC_L[16] =
{0x00,0x5e,0xbc,0xe2,0x61,0x3f,0xdd,0x83,0xc2,0x9c,0x7e,0x20,0xa3,0xfd,0x1f,0x41};
unsigned char CRC_Verify(unsigned char * buf,unsigned char length)
{
unsigned char crc = 0x00;
do
{
crc ^= *buf;
crc = CRC_H[crc >> 4] ^ CRC_L[crc & 0x0f];
buf++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -