#include <reg52.h>
#include <msp430x14x.h>
#include "DS18B20.h"
extern void Delay(unsigned int dly);
#define DQ_IN (P1DIR&=~BIT6)
#define DQ_OUT (P1DIR|= BIT6)
#define DQ_val (P1IN & BIT6)
#define DQ_1 (P1OUT|=BIT6)
#define DQ_0 (P1OUT&=~BIT6)
unsigned char tem[]={0,0},Neg_flag; //数组存储读取的温度数据,负数标志
/*******************************************************************************
* Function Name : void Delayus(unsigned int dly)
* Description : 延时 dly us
* Input : dly
* Output : None
* Return : None
*******************************************************************************/
void Delayus(unsigned int dly)
{
TACTL|= TASSEL_2+MC_1+TACLR;
CCR0 = dly;
while(!(TACTL&BIT0)); //等待时间到
TACTL = 0; //停止计数 ??????
TACTL &= ~BIT0; //清中断标志
}
/*******************************************************************************
* Function Name : unsigned char Init_DS18B20(void)
* Description : IO 初始化
* Input : void
* Output : None
* Return : None
*******************************************************************************/
unsigned char Init_DS18B20(void)
{
unsigned char tp;
DQ_OUT;
DQ_0; //MCU 拉低最少480us 再释放等待DS拉高
Delayus(600); //480us~960us
DQ_1;
DQ_IN; //释放总线
Delayus(55); //等15~60us
_NOP();
if(DQ_val==BIT6) tp=1; //初始失败
else tp=0; //初始成功
return tp;
}
/*******************************************************************************
* Function Name : void Write_DS18B20(unsigned char data)
* Description : 向18B20写数据
* Input : void
* Output : None
* Return : None
*******************************************************************************/
void Write_DS18B20(unsigned char data)
{
unsigned char i;
DQ_OUT;
for(i=0;i<8;i++)
{
DQ_0; //下降沿
Delayus(3); //15~60us 等待18B20采样
if(data&0x01) //写从低到高位
{
DQ_1;
}
else
{
DQ_0;
}
Delayus(65);
data>>=1;
DQ_1;
Delayus(2);
}
}
/*******************************************************************************
* Function Name : unsigned char Read_DS18B20(void);
* Description : 读18B20数据
* Input : void
* Output : None
* Return : 18B20数据
*******************************************************************************/
unsigned char Read_DS18B20(void)
{
unsigned int i, rdata;
for(i=0;i<8;i++)
{
rdata>>=1;
DQ_0;
Delayus(2); //下降沿
DQ_1;
DQ_IN; //释放总线
Delayus(3); //延时5 us
if(DQ_val==BIT6)
{
rdata |= 0x80; //读从高位开始
}
Delayus(45);
DQ_OUT;
DQ_1;
Delayus(2);
}
return rdata;
}
/*******************************************************************************
* Function Name : unsigned char Convert_18B20(void);
* Description : 18B20转换
* Input : void
* Output : None
* Return : None
*******************************************************************************/
unsigned char *Convert_18B20(void)
{
unsigned char n;
do
n = Init_DS18B20(); //复位
while(n);
Write_DS18B20(0xCC); //跳过 ROm指令
Write_DS18B20(0x44); //温度转换 RAM指令
Delay(750); //等待750us温度转换完成
do
n = Init_DS18B20(); //复位
while(n);
Write_DS18B20(0xCC); //跳过ROM
Write_DS18B20(0xBE);; //读存储器指令 读数据
tem[0] = Read_DS18B20(); //
tem[1] = Read_DS18B20();
return tem;
}
/*******************************************************************************
* Function Name : unsigned char Compute_18B20(unsigned char data);
* Description : 计算18B20转换后的温度值
* Input : 16进制的温度值
* Output : None
* Return : 十进制的温度值
*******************************************************************************/
float Compute_18B20()
{
unsigned char temper=0;
if(tem[0]&0xF0)
{
Neg_flag = 1; //负数标志
temper = tem[1]+tem[0]*256;
temper = (~temper) +1; //取反加一
}
else
{
temper = tem[1]+tem[0]*256;
}
return temper;
} |