文章目录[隐藏]
DS18B20测温
硬件资料
DS18B20特性
内部存储器表
温度读取及计算
配置寄存器(分辨率)
读写时序
工程创建
- MX配置
- KEIL工程内添加"DS18B20"驱动
程序编写
DS18B20驱动
复位检测
// 复位检测
uint8_t DS18B20_Reset()
{
uint8_t flag;
DS18B20_DQ(0);// 对照复位时序图:
Delay_us(480);
DS18B20_DQ(1);// OD门写1即释放管理权,与外部电平无关
Delay_us(80);// 上拉电阻会自动拉高
flag = READ_DQ;// 读到0必然是DS18B20拉低,即确认存在;读到1则没有DS18B20拉低
Delay_us(400);
return flag;
}
写数据
// 写数据
void DS18B20_WriteByte(uint8_t dat)
{
uint8_t j;
for(j=0;j<8;j++)
{
DS18B20_DQ(0);// 写0/写1 先拉低
Delay_us(4);// 延时
DS18B20_DQ(dat & 0x01); // 取出最低位,结果全0为0,否则为1
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);// 最多延时15us
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);// DS18B20未写.h文件,用函数声明代替
#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);// LCD1602显示
HAL_Delay(2000);
}
}
版权声明:本文为CSDN博主「wcsq0523」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wcsq0523/article/details/121549804
暂无评论