51单片机实时显示DS18B20上面的温度代码
时间: 2023-10-29 15:23:09 浏览: 90
下面是一个简单的51单片机实时显示DS18B20上面温度的代码示例,使用的是单总线模式:
```
#include <REG51.H>
sbit DQ = P1^0; // 定义DS18B20的数据线
void Delay10us() { // 延时函数
unsigned char i, j;
i = 2;
j = 199;
do {
while (--j);
} while (--i);
}
unsigned char ds18b20_init() { // DS18B20初始化函数
unsigned char i;
DQ = 1; // 把总线拉高
Delay10us();
DQ = 0; // 发送复位脉冲
Delay10us();
DQ = 1; // 释放总线
Delay10us();
i = DQ; // 等待DS18B20的应答信号
Delay10us();
return i;
}
void ds18b20_write_byte(unsigned char dat) { // 向DS18B20写入一个字节
unsigned char i, j;
for (i = 0; i < 8; i++) {
DQ = 0; // 发送起始信号
Delay10us();
DQ = dat & 0x01; // 发送数据位
Delay10us();
DQ = 1; // 释放总线
dat >>= 1;
}
}
unsigned char ds18b20_read_byte() { // 从DS18B20读取一个字节
unsigned char i, j, dat = 0;
for (i = 0; i < 8; i++) {
DQ = 0; // 发送起始信号
Delay10us();
DQ = 1; // 释放总线
Delay10us();
dat >>= 1; // 读取数据位
if (DQ) dat |= 0x80;
}
return dat;
}
void main() {
unsigned char i, temp;
unsigned char temp_data[2]; // 存放读取到的温度数据
while (1) {
if (ds18b20_init()) { // 如果初始化失败则重试
continue;
}
ds18b20_write_byte(0xcc); // 跳过ROM操作
ds18b20_write_byte(0x44); // 启动温度转换
Delay10us();
if (ds18b20_init()) { // 如果初始化失败则重试
continue;
}
ds18b20_write_byte(0xcc); // 跳过ROM操作
ds18b20_write_byte(0xbe); // 读取温度数据
temp_data[0] = ds18b20_read_byte(); // 读取温度数据的整数部分
temp_data[1] = ds18b20_read_byte(); // 读取温度数据的小数部分
temp = temp_data[0]; // 计算实际温度值
if (temp_data[1] & 0x80) temp += 0.5;
printf("Temperature: %d.%dC\r\n", temp, (temp_data[1] & 0x7f) * 100 / 128); // 输出温度值
Delay10us();
}
}
```
这个代码使用了51单片机的串口输出函数`printf()`,需要在程序中先进行串口初始化。另外,由于DS18B20的温度转换需要一定的时间,因此需要在读取温度数据之前进行一定的延时,确保温度转换完成。
阅读全文