51单片机DS18B20温度传感器
时间:2022-09-13 09:00:00
DS18B20
DS18B20 测量范围为-55℃~ 125℃,-10℃~ 85℃范围内精
度是±0.5℃,测量分辨率为 9~12 位(复位值为 12 最大转换时间为位 750ms)。
DS18B20 包括寄生电源电路, 64 位 ROM 单线接口电路、临存器、 EEPROM、 8 位 CRC 生
成器和温度传感器等。寄生电源电路可实现外部电源和单线寄生电源, 64 位 ROM 中存放
的 48 在同一单线上识别多个连接的位序列号 DS18B实现多点测温。
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;