reking8 发表于 2024-12-18 14:50
这是文件包
#include "stm32f10x.h" // Device header
#include "DS18B20.h"
#include "delay.h"
uint8_t DS18B20_Init(void)
{
DS18B20_OUT_Mode();
GPIO_SetBits(GPIOA,GPIO_Pin_0);
DS18B20_Rst();
return DS18B20_Check();
}
void DS18B20_Rst(void)
{
DS18B20_OUT_Mode();
GPIO_ResetBits(DS18B20_PORT,DS18B20_PIN);//复位脉冲,即拉低480-750us
Delay_us(750);
GPIO_SetBits(DS18B20_PORT,DS18B20_PIN);//释放总线,即拉高
Delay_us(30); //拉高后,DS8B20等待15-60us,再发送存在脉冲
}
uint8_t DS18B20_Check(void)
{
uint16_t retry = 0;
DS18B20_IN_Mode();//切换到输入模式
//主机释放总线后,ds18b20会等等待15-60us
while(GPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)&&retry<100)
{
retry ++;
Delay_us(1);
}
if(retry>=100) return 1;
else retry = 0;
//发出存在脉冲60-240us后,拉高释放总线,这里是等待释放
while(!GPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)&&retry<240)
{
retry ++;
Delay_us(1);
}
if(retry >= 240) return 1;
else return 0;
}
void DS18B20_Write_Bit(uint8_t dat)
{
DS18B20_OUT_Mode();//切换到输出模式
if(dat)
{
GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_RESET); //写1
Delay_us(2);
GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_SET);
Delay_us(60);
}
else
{
GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_RESET); //写0
Delay_us(60);
GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_SET);//拉高释放总线
Delay_us(2);
}
}
void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t i=0,k=0;
for(i=0;i<8;i++)
{
k= dat&0x01;
dat>>=1;
Delay_us(2); //位之间有>1us时间间隙
DS18B20_Write_Bit(k);
}
}
uint8_t DS18B20_Read_Bit(void)
{
uint8_t dat;
DS18B20_OUT_Mode();//切换到输出模式
GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_RESET); //主机拉低总线,产生读取命令
Delay_us(2);
GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_SET);//主机拉高释放总线,等待从机发送
DS18B20_IN_Mode();//切换到输入模式
Delay_us(10); //延时,主机必须在15us内采样总线状态
if(GPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)) //采样
{
dat =1;
}
else dat =0;
Delay_us(50);//每次读时序至少需要60us
return dat;
}
uint8_t DS18B20_Read_Byte(void)
{
uint8_t i,dat=0,k=0;
for(i=0;i<8;i++)
{
k = DS18B20_Read_Bit();
dat= (k<<7)|(dat>>1);
}
return dat;
}
void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);//跳过ROM检测
DS18B20_Write_Byte(0x44);//开始转换
}
float DS18B20_Get_Temp(void)
{
uint16_t value,TL,TH;
float temp;
DS18B20_Start();
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);//跳过ROM检测
DS18B20_Write_Byte(0xbe);//开始转换
TL = DS18B20_Read_Byte();//LSB
TH = DS18B20_Read_Byte();//MSB
value = (TH<<8)+ TL;
if((value&0xf800) == 0xf800)
{
value = (~value)+1;
temp=value*(-0.0625);//乘以精度
}
else
{
temp=value*(0.0625);//乘以精度
}
return temp;
}
void DS18B20_OUT_Mode(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DS18B20_RCC_CMD;
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
void DS18B20_IN_Mode(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DS18B20_RCC_CMD;
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
} |