Arduino与Proteus仿真实例-DS18B20温度传感器驱动仿真

DS18B20温度传感器驱动仿真

DS18B20 是一种温度传感器,它提供 9 位到 12 位的温度读数。 … 该传感器的通信可以通过单线总线协议完成,该协议使用一条数据线与内部微处理器进行通信。

在前面的实例中,对DS18B20做了详细的介绍,请参考:

1、仿真电路原理图

在这里插入图片描述

2、仿真代码实现

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
// Interfacing Arduino with DS18B20 temperature sensor

#include <LiquidCrystal.h> // include LCD library code

#define DS18B20\_PIN 2



int raw_temp;
float temp;
char txt[] = " C ";

void setup(void) {
// start serial port
Serial.begin(9600);

}

void loop(void) {
if(ds18b20\_read(&raw_temp)) {
Serial.print("Temperature = ");
temp = (float)raw_temp / 16; // Convert temperature raw value into degree Celsius (temp in °C = raw/16)
Serial.print(temp); // Print temperature value in degree Celsius
Serial.println("\*C"); // Print '°C'
}
else {
Serial.println("Communication Error!");
}
delay(1000);
}

bool ds18b20\_start(){
bool ret = 0;
digitalWrite(DS18B20_PIN, LOW); // Send reset pulse to the DS18B20 sensor
pinMode(DS18B20_PIN, OUTPUT);
delayMicroseconds(500); // Wait 500 us
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(100); //wait to read the DS18B20 sensor response
if (!digitalRead(DS18B20_PIN)) {
ret = 1; // DS18B20 sensor is present
delayMicroseconds(400); // Wait 400 us
}
return(ret);
}

void ds18b20\_write\_bit(bool value){
digitalWrite(DS18B20_PIN, LOW);
pinMode(DS18B20_PIN, OUTPUT);
delayMicroseconds(2);
digitalWrite(DS18B20_PIN, value);
delayMicroseconds(80);
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(2);
}

void ds18b20\_write\_byte(byte value){
byte i;
for(i = 0; i < 8; i++)
ds18b20\_write\_bit(bitRead(value, i));
}

bool ds18b20\_read\_bit(void) {
bool value;
digitalWrite(DS18B20_PIN, LOW);
pinMode(DS18B20_PIN, OUTPUT);
delayMicroseconds(2);
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(5);
value = digitalRead(DS18B20_PIN);
delayMicroseconds(100);
return value;
}

byte ds18b20\_read\_byte(void) {
byte i, value;
for(i = 0; i <8; i++)
bitWrite(value, i, ds18b20\_read\_bit());
return value;
}

bool ds18b20\_read(int \*raw_temp_value) {
if (!ds18b20\_start()) // Send start pulse
return(0); // Return 0 if error
ds18b20\_write\_byte(0xCC); // Send skip ROM command
ds18b20\_write\_byte(0x44); // Send start conversion command
while(ds18b20\_read\_byte() == 0); // Wait for conversion complete
if (!ds18b20\_start()) // Send start pulse
return(0); // Return 0 if error
ds18b20\_write\_byte(0xCC); // Send skip ROM command
ds18b20\_write\_byte(0xBE); // Send read command
\*raw_temp_value = ds18b20\_read\_byte(); // Read temperature LSB byte and store it on raw\_temp\_value LSB byte
\*raw_temp_value |= (unsigned int)(ds18b20\_read\_byte() << 8); // Read temperature MSB byte and store it on raw\_temp\_value MSB byte
return(1); // OK --> return 1
}

3、仿真结果

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/121450779