#include "ds18b20.h"
#include "delay.h"
#include "slave_com.h"
/*******************************************************************************
* 函 数 名: ds18b20_rst
* 功 能: 复位ds18b20
* 输 入: 无
* 输 出: 无
* 返 回 值: 无
* 备 注: 无
*******************************************************************************/
void ds18b20_rst(void)
{
DS18B20_IO_OUT();
DS18B20_DQ_OUT = SIGNAL_LOW;
delay_us(750);
DS18B20_DQ_OUT = SIGNAL_HIGH;
delay_us(15);
}
/*******************************************************************************
* 函 数 名: ds18b20_check
* 功 能: 检查ds18b20连接
* 输 入: 无
* 输 出: 无
* 返 回 值: 无
* 备 注: SUCCESS 连接成功,FALSE 连接失败
*******************************************************************************/
u8 ds18b20_check(void)
{
u8 retry_times = 0;
DS18B20_IO_IN();
while (DS18B20_DQ_IN && retry_times < 200)
{
retry_times++;
delay_us(1);
}
if(retry_times>=200)
{
return FALSE;
}
else
{
retry_times=0;
}
while ( !DS18B20_DQ_IN && retry_times<240)//检查信号是否持续存在
{
retry_times++;
delay_us(1);
}
if(retry_times>=240)
return FALSE;
return SUCCESS;
}
/*******************************************************************************
* 函 数 名: ds18b20_read_bit
* 功 能: 从DS18B20读取一个位
* 输 入: 无
* 输 出: 无
* 返 回 值: 无
* 备 注: SUCCESS 连接成功,FALSE 连接失败
*******************************************************************************/
u8 ds18b20_read_bit(void)
{
u8 data;
DS18B20_IO_OUT();
DS18B20_DQ_OUT = 0;
delay_us(2);
DS18B20_DQ_OUT = 1;
DS18B20_IO_IN();
delay_us(12);
if(DS18B20_DQ_IN)
{
data=1;
}
else
{
data=0;
}
delay_us(50);
return data;
}
/*******************************************************************************
* 函 数 名: ds18b20_read_byte
* 功 能: 从DS18B20读取一个字节
* 输 入: 无
* 输 出: 无
* 返 回 值: 读到的数据
* 备 注: 无
*******************************************************************************/
u8 ds18b20_read_byte(void)
{
u8 i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=ds18b20_read_bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
/*******************************************************************************
* 函 数 名: DS18B20_Write_Byte
* 功 能: 写一个字节到DS18B20
* 输 入: 无
* 输 出: 无
* 返 回 值: 无
* 备 注: 无
*******************************************************************************/
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
DS18B20_DQ_OUT=0; // Write 1
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0; // Write 0
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
}
}
//开始温度转换
void DS18B20_Start(void)
{
ds18b20_rst();
ds18b20_check();
DS18B20_Write_Byte(0xcc); // skip rom
DS18B20_Write_Byte(0x44); // convert
}
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在
u8 ds18b20_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTG口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PORTG.7 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_7);//输出1
ds18b20_rst();
return ds18b20_check();
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
extern volatile uint32_t system_run_time_ms;
extern MASTER_STATUS_INFO master_status_infor;
float DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
float ftmp;
DS18B20_Start(); // ds1820 start convert
ds18b20_rst();
ds18b20_check();
DS18B20_Write_Byte(0xcc); // skip rom
DS18B20_Write_Byte(0xbe); // convert
TL=ds18b20_read_byte(); // LSB
TH=ds18b20_read_byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0; //温度为负
}
else
temp=1; //温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL; //获得低八位
tem = (float)tem*0.625;
ftmp = tem / 10.0; //转换
master_status_infor.master_temp = tem*100;
if(temp)
return ftmp; //返回温度值
else
return -ftmp;
}
评论0