一、介绍
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<8; i++) { writeBit(byte & 1); byte >>= 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() { //... }