写一个DS18B20数据采集实验:编写程序读取DS18B20的温度值;实现数码管显示温度值保留一位小数
时间: 2024-03-06 22:51:10 浏览: 139
好的,这里是一个基于Arduino的DS18B20数据采集实验,代码如下:
```
#include <OneWire.h>
#include <DallasTemperature.h>
// 数据线连接的引脚
#define ONE_WIRE_BUS 2
// 创建OneWire和DallasTemperature对象
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// 数码管连接的引脚
int digit1 = 3;
int digit2 = 4;
int digit3 = 5;
int digit4 = 6;
int digitPins[] = {digit1, digit2, digit3, digit4};
// 数码管数字对应的引脚
int segmentA = 7;
int segmentB = 8;
int segmentC = 9;
int segmentD = 10;
int segmentE = 11;
int segmentF = 12;
int segmentG = 13;
int segmentDP = A0;
int segmentPins[] = {segmentA, segmentB, segmentC, segmentD, segmentE, segmentF, segmentG, segmentDP};
// 数码管数字的编码
byte digits[] = {
//gfedcba dp
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11110110, // 9
};
void setup() {
// 初始化串口
Serial.begin(9600);
// 初始化DallasTemperature对象
sensors.begin();
// 设置数码管引脚为输出
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT);
}
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
}
void loop() {
// 读取温度值
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// 在串口中输出温度值
Serial.print("Temperature: ");
Serial.print(tempC);
Serial.println(" C");
// 显示温度值到数码管(保留一位小数)
int intPart = (int)tempC;
int decimalPart = (int)(tempC * 10) % 10;
// 显示整数部分
showDigit(intPart / 1000, 0);
showDigit(intPart / 100 % 10, 1);
showDigit(intPart / 10 % 10, 2);
showDigit(intPart % 10, 3);
// 显示小数点和小数部分
digitalWrite(segmentDP, HIGH);
showDigit(decimalPart, 2);
delay(1000);
}
void showDigit(int digit, int position) {
// 显示一个数字到指定位置
byte value = digits[digit];
for (int i = 0; i < 8; i++) {
digitalWrite(segmentPins[i], bitRead(value, i));
}
digitalWrite(digitPins[position], HIGH);
delay(1);
digitalWrite(digitPins[position], LOW);
}
```
这个程序使用了OneWire和DallasTemperature库来读取DS18B20的温度值,然后使用数码管显示温度值。在显示温度值时,程序将温度值拆分为整数部分和小数部分,并分别显示到数码管上。其中,showDigit函数用来将一个数字显示到数码管的指定位置上。
阅读全文