#include "18B20.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
//初始化,返回1表示成功
uint8_t DS18B20_init(void){
DS18B20_reset();
if(DS18B20_check()){
DS18B20_reset();
DS18B20_check();
return 1;
}else{
return 0;
}
}
//获取温度
float DS18B20_get(void){
struct temparature DS18B20_temp;
float value=0;
uint8_t tmp;
DS18B20_reset();
DS18B20_check();
DS18B20_writeByte(0xcc);
DS18B20_writeByte(0x44);
do{
tmp = DS18B20_readByte();
}while(tmp != 0xff);
DS18B20_reset();
DS18B20_check();
DS18B20_writeByte(0xcc);
DS18B20_writeByte(0xbe);
DS18B20_temp.value = DS18B20_readByte();
DS18B20_temp.symbol = DS18B20_readByte();
if(DS18B20_temp.symbol>7){
value = ((uint16_t)(DS18B20_temp.symbol&0x1f))<<8;
value += DS18B20_temp.value;
printf("-");
printf("%f\n",value);
return -value;
}else{
value = ((uint16_t)DS18B20_temp.symbol)<<8;
value += DS18B20_temp.value;
printf("当前温度:+");
printf("%f\n",value*0.0625);
return value;
}
}
//复位
void DS18B20_reset(void){
HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET);
delay_us(750);
HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET);
delay_us(15);
}
//响应
uint8_t DS18B20_check(void){
uint16_t count=0;
while(HAL_GPIO_ReadPin(DQ_GPIO_Port, DQ_Pin)&&count<200){
delay_us(1);
count++;
}
if(count>=200){
return 0;
}else{
count=0;
}
while(HAL_GPIO_ReadPin(DQ_GPIO_Port, DQ_Pin)==0&&count < 240){
delay_us(1);
count++;
}
if(count>=240){
return 0;
}
return 1;
}
//读位
uint8_t DS18B20_readBit(void){
uint8_t tmp;
HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET);
delay_us(11);
tmp = HAL_GPIO_ReadPin(DQ_GPIO_Port, DQ_Pin);
delay_us(50);
return tmp;
}
//读字节
uint8_t DS18B20_readByte(void){
uint8_t return_val=0;
for(int i=0;i<8;i++){
return_val = (return_val>>1) | DS18B20_readBit()<<7;
}
return return_val;
}
//写字节
void DS18B20_writeByte(uint8_t data){
uint8_t j;
uint8_t testb;
for (j=1;j<=8;j++)
{
testb=data&0x01;
data=data>>1;
if (testb)
{
HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET);
delay_us(60);
}
else
{
HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET);
delay_us(60);
HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET);
delay_us(2);
}
}
}
DS18B20 HAL库 驱动,供参考
最新推荐文章于 2024-05-30 20:23:08 发布