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);
} |