使用51单片机写一个DS18B20数据采集实验:编写程序读取DS18B20的温度值;实现数码管显示温度值保留一位小数
时间: 2024-03-06 07:51:11 浏览: 71
51单片机+DS18B20+数码管组成的温度计电路包含源代码和Proteus仿真电路
5星 · 资源好评率100%
好的,这里是一个基于51单片机的DS18B20数据采集实验,代码如下:
```
#include <reg51.h>
#include <intrins.h>
// 定义DS18B20数据线连接的引脚
#define DS18B20_DATA P2_0
// 定义数码管连接的引脚
#define DIGIT1 P0_0
#define DIGIT2 P0_1
#define DIGIT3 P0_2
#define DIGIT4 P0_3
#define SEGMENTA P0_4
#define SEGMENTB P0_5
#define SEGMENTC P0_6
#define SEGMENTD P0_7
// 数码管数字的编码
unsigned char digits[] = {
//gfedcba
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
};
// 延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 114; j++) {
_nop_();
}
}
}
// 读取DS18B20的温度值
unsigned int readTemperature() {
unsigned char i, j;
unsigned char temp;
unsigned int temperature;
unsigned char buffer[9];
// 发送复位信号
DS18B20_DATA = 0;
delay(500);
DS18B20_DATA = 1;
delay(60);
// 发送读取温度命令
DS18B20_DATA = 0;
delay(1);
DS18B20_DATA = 1;
delay(1);
// 等待DS18B20响应
while(!DS18B20_DATA);
// 读取DS18B20发送的数据
for (i = 0; i < 9; i++) {
DS18B20_DATA = 0;
delay(1);
DS18B20_DATA = 1;
delay(1);
buffer[i] = DS18B20_DATA;
}
// 将读取到的数据转换为温度值
temp = buffer[0] >> 4;
temp |= buffer[1] << 4;
temperature = temp * 100;
temp = buffer[7] >> 1;
temperature += temp;
return temperature;
}
// 显示一个数字到指定位置
void showDigit(unsigned char digit, unsigned char position) {
P0 = 0xff;
switch (position) {
case 0:
DIGIT1 = 0;
break;
case 1:
DIGIT2 = 0;
break;
case 2:
DIGIT3 = 0;
break;
case 3:
DIGIT4 = 0;
break;
default:
break;
}
P0 = digits[digit];
delay(1);
P0 = 0xff;
}
void main() {
unsigned int temperature;
unsigned char intPart, decimalPart;
while(1) {
// 读取温度值
temperature = readTemperature();
// 在串口中输出温度值
printf("Temperature: %d.%d\n", temperature / 10, temperature % 10);
// 在数码管上显示温度值
intPart = temperature / 10;
decimalPart = temperature % 10;
showDigit(intPart / 1000, 0);
showDigit(intPart / 100 % 10, 1);
showDigit(intPart / 10 % 10, 2);
showDigit(intPart % 10, 3);
showDigit(decimalPart, 2);
delay(1000);
}
}
```
这个程序使用了51单片机的GPIO口来读取DS18B20的温度值,并使用数码管显示温度值。在显示温度值时,程序将温度值拆分为整数部分和小数部分,并分别显示到数码管上。显示一个数字时,程序使用showDigit函数将数字显示到数码管的指定位置上。
阅读全文