51单片机DS18B20温度传感器
·
DS18B20

DS18B20 是单线接口数字温度传感器,测量范围是-55℃~+125℃,-10℃~+85℃范围内精
度是±0.5℃,测量分辨率为 9~12 位(复位值为 12 位,最大转换时间为 750ms)。
DS18B20 包括寄生电源电路、 64 位 ROM 和单线接口电路、暂存器、 EEPROM、 8 位 CRC 生
成器和温度传感器等。寄生电源电路可以实现外部电源供电和单线寄生供电, 64 位 ROM 中存放
的 48 位序列号用于识别同一单线上连接的多个 DS18B20,以实现多点测温。
64 位 ROM 代码的格式为:
8 位 CRC 校验码 + 48 位序列号 + 8 位系列码(0x28)
其中 8 位 CRC 校验码是 48 位序列号和 8 位系列码的 CRC 校验码
代码
官方文件
onewire.c
#include "onewire.h"
//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{
while(t--);
}
//单总线写操作
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//单总线读操作
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
onewire.h
#ifndef __ONEWIRE_H__
#define __ONEWIRE_H__
#include "reg52.h"
#include "intrins.h"
sbit DQ = P1^4; //单总线接口
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
void Write_DS18B20(unsigned char dat);
unsigned int temper_change(void);
#endif
需要自己写一个温度读取函数
//读取温度的集体操作
unsigned int temper_change(void)
{
u8 a,b;
u16 t=0;
init_ds18b20();
Delay_OneWire(15);
Write_DS18B20(0xcc); //跳过ROM操作命令
Write_DS18B20(0x44); //发送启动温度转换命令
Delay_OneWire(250);
init_ds18b20();
Delay_OneWire(15);
Write_DS18B20(0xcc); //跳过ROM操作命令
Write_DS18B20(0xbe); //发送启动温度转换命令
a=Read_DS18B20(); //先读低八位
b=Read_DS18B20(); //再读高八位
t=b<<8; //左移八位
t=t|a; //t为16位的数,使高八位为b的值,低八位为a的值
t *= 0.0625*100;
return t; //返回温度值
}
在读取温度时需要将中断关闭,读取完毕再打开
EA = 0;
temper_v = temper_change();
EA = 1;
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)