DS18B20测温
硬件资料
DS18B20特性
内部存储器表
温度读取及计算
配置寄存器(分辨率)
读写时序
工程创建
- MX配置
- KEIL工程内添加"DS18B20"驱动
程序编写
DS18B20驱动
复位检测
uint8_t DS18B20_Reset()
{
uint8_t flag;
DS18B20_DQ(0);
Delay_us(480);
DS18B20_DQ(1);
Delay_us(80);
flag = READ_DQ;
Delay_us(400);
return flag;
}
写数据
void DS18B20_WriteByte(uint8_t dat)
{
uint8_t j;
for(j=0;j<8;j++)
{
DS18B20_DQ(0);
Delay_us(4);
DS18B20_DQ(dat & 0x01);
Delay_us(60);
DS18B20_DQ(1);
Delay_us(6);
dat = dat >> 1;
}
}
读数据
uint8_t DS18B20_ReadByte()
{
uint8_t j,rdata=0;
for(j=0;j<8;j++)
{
rdata >>=1;
DS18B20_DQ(0);
Delay_us(4);
DS18B20_DQ(1);
Delay_us(10);
if(READ_DQ==1)
rdata = rdata | 0x80;
Delay_us(60);
DS18B20_DQ(1);
Delay_us(6);
}
return rdata;
}
测量主程序
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "LCD1602_Sprintf.h"
void SystemClock_Config(void);
float DS18B20_Temp(void);
#include <stdio.h>
#include <string.h>
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xff);
return ch;
}
float temper=0;
char trmper_dis[100]={0};
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
LCD1602_Init();
StartMenu();
while (1)
{
temper=DS18B20_Temp();
printf("the temper is %.4f\r\n",temper);
sprintf(trmper_dis,"%.4f",temper);
LCD1602_Display_str(2,0,trmper_dis);
HAL_Delay(2000);
}
}