一、介绍
DS18B20温度传感器是一种数字温度传感器,控制协议简单,数据稳定可靠,而且价格低廉,非常适合用于单片机控制系统中。
DS18B20采用单总线结构,只需要三根引脚即可完成通讯。它可以工作在-55℃至125℃的温度范围内,并提供了9至12位分辨率。此外, DS18B20还可以通过使用外部供电提高精度。
二、DS18B20的接线
DS18B20只需要三根线(DQ, GND, VCC)即可完成与单片机的连接。
DQ – 连接到单片机的任意IO口,用于数据的传输
GND – 连接到单片机的 GND
VCC – 连接到单片机的 VCC
+---------+
| |
| VCC --------------- 3.3V - 5V
| |
| GND --------------- GND
| |
| |
DQ ------------+ +---------------
三、使用DS18B20进行温度测量
DS18B20通过一次性写入指令来启动温度测量,并通过读取传感器的数据进行温度的计算。以下是使用DS18B20进行温度测量的基本步骤:
1、复位信号线:
void reset() {
digitalWrite(DQ, LOW);
delayMicroseconds(480);
pinMode(DQ, INPUT);
delayMicroseconds(60);
int presence = digitalRead(DQ);
delayMicroseconds(420);
}
2、向DS18B20发送写入指令以启动温度测量:
void writeBit(uint8_t bit) {
pinMode(DQ, OUTPUT);
digitalWrite(DQ, LOW);
delayMicroseconds(5);
digitalWrite(DQ, bit);
delayMicroseconds(60);
pinMode(DQ, INPUT);
}
void writeByte(uint8_t byte) {
for (uint8_t i=0; i>= 1;
}
}
void startConversion() {
reset();
writeByte(0xCC); // Skip ROM command
writeByte(0x44); // Start Conversion
}
3、读取DS18B20返回的数据:
void readBit(uint8_t& bit) {
pinMode(DQ, OUTPUT);
digitalWrite(DQ, LOW);
delayMicroseconds(1);
pinMode(DQ, INPUT);
delayMicroseconds(14);
bit = digitalRead(DQ);
delayMicroseconds(45);
}
uint8_t readByte() {
uint8_t byte = 0;
for (uint8_t i=0; i<8; i++) {
uint8_t bit;
readBit(bit);
byte |= (bit << i);
}
return byte;
}
void readScratchpad(uint8_t* scratchpad) {
reset();
writeByte(0xCC); // Skip ROM command
writeByte(0xBE); // Read Scratchpad
for (uint8_t i=0; i<9; i++) {
scratchpad[i] = readByte();
}
}
4、将DS18B20返回的数据进行温度计算:
float readTemperature() {
startConversion();
delay(750);
uint8_t scratchpad[9];
readScratchpad(scratchpad);
int16_t raw = scratchpad[0] | (scratchpad[1] << 8);
float temp = (float)raw / 16.0;
return temp;
}
四、示例代码
下面是一个简单的示例程序,用于读取DS18B20的温度值并将其打印到串口:
#include <OneWire.h>
OneWire ds(DQ);
void setup() {
Serial.begin(9600);
}
void loop() {
float temp = readTemperature();
Serial.print("Temperature: ");
Serial.print(temp, 1);
Serial.println("C");
delay(1000);
}
void reset() {
//...
}
void writeBit(uint8_t bit) {
//...
}
void writeByte(uint8_t byte) {
//...
}
void startConversion() {
//...
}
void readBit(uint8_t& bit) {
//...
}
uint8_t readByte() {
//...
}
void readScratchpad(uint8_t* scratchpad) {
//...
}
float readTemperature() {
//...
}
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/193761.html
微信扫一扫
支付宝扫一扫