12. DS18B20数字温度传感器

DS18B20 介绍

数字温度传感器 DS18B20。 具有体积小、硬件开销低、抗干扰能力强、精度高的特点。 常见的封装形式有:直插式、管道式、螺纹式、磁铁吸附式、不锈钢封装式等。 DS18B20的测温范围可达-55°C ~ +125°C,在-10°C ~ +85°C范围时精度为±0.5°C,工作电压3.0v ~ 5.0v

文档链接

特性

  • 独特的1-Wire接口只需要一个引脚进行通信
  • 每个器件都有一个存储在板载ROM中的唯一64位串行代码
  • 不需要其他外部辅助器件
  • 可以从数据线供电
  • 电源范围为3.0V至5.5V
  • 测温范围从–55°C到+125°C (–67°F到+257°F),–10°C到+85°C的精度为±0.5°C
  • 分辨率9或12位可调
  • 12位转换最多用时750ms
  • 用户可定义的非易失性报警

单总线介绍

1-Wire是Maxim子公司达拉斯半导体的专利技术,仅用单一信号线就可像I²C、SPI一样,传输时钟(clock)又传输数据(data),并且数据传输是双向的。1-Wire使用较低的数据传输速率,通常是用来沟通小型设备,如数字温度计。 -- 维基百科

Arduino 如何使用 DS18B20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <OneWire.h>
#include <DallasTemperature.h>

const int ONE_WIRE_BUS = 2;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
Serial.begin(9600);
sensors.begin();
}


void loop(void){
sensors.requestTemperatures();

Serial.print("Celsius temperature: ");
Serial.print(sensors.getTempCByIndex(0));
Serial.print(" - Fahrenheit temperature: ");
Serial.println(sensors.getTempFByIndex(0));
delay(1000);
}

51单片机如何使用 DS18B20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <mcs51/8051.h>
#include <stdio.h>
#define __nop() __asm nop __endasm

#define ONE_BUS P2_0

void delay_t(unsigned int t)
{
while(t--);
}

void delay(unsigned int t)
{
signed int a, b;
for(a=t; a>0; a--)
for(b=125; b>0; b--);
}

__bit one_wire_init()
{
__bit status = 1;
ONE_BUS = 1;
delay_t(8);
ONE_BUS = 0;
delay_t(80); // 480us~960us
ONE_BUS = 1;
delay_t(8);
status = ONE_BUS;
delay_t(4); // 60us~240us
return status;
}

void one_wire_write_byte(unsigned char data)
{
unsigned char i;
for(i=0; i<8; i++)
{
ONE_BUS = 0;
ONE_BUS = data & 0x01;
delay_t(4); // 15us~30us
ONE_BUS = 1;
data >>= 1;
}
delay_t(4);
}

unsigned char one_wire_read_byte()
{
unsigned char i = 0;
unsigned char data = 0;
for(i=0; i<8; i++)
{
ONE_BUS = 0;
data >>= 1;
ONE_BUS = 1;
if(ONE_BUS)
{
data |= 0x80;
}
delay_t(4);
}
return data;
}

void request_temperature()
{
one_wire_init();
one_wire_write_byte(0xCC);
one_wire_write_byte(0x44);
}

unsigned char get_temperature()
{
unsigned char lsb, msb;
one_wire_init();
one_wire_write_byte(0xCC);
one_wire_write_byte(0xBE);

lsb = one_wire_read_byte();
msb = one_wire_read_byte();

msb <<= 4;
msb += (lsb >> 4);
return msb;
}

void serial_init()
{
TMOD |= 0x20;
SCON |= 0x50;
// 波特率 9600
TH1 = 0XFD;
TL1 = 0XFD;
// 启动定时器1
TR1=1;
//中断允许
EA=1;
}

void putchar(char c)
{
SBUF = c;
while(!TI);
TI = 0;
}

void setup()
{
__bit status = 1;
serial_init();
status = one_wire_init();
if(!status)
{
printf("invalid status\n");
}
}

void loop()
{
char value = 0;
request_temperature();
printf("value: %d \n", get_temperature());
delay(500);
}

void main()
{
setup();
while(1) loop();
}

一些有用的链接