51+DS18B20测量温度

一.简述

DS18B20是DALLAS公司出品的一种数字式单总线温度传感器,测温范围为-55°C到125°C(-67°F到257°F),被广泛应用在温度测量领域中。显著优点就是接线简单。因为它只有三个引脚:VCC,GND和DQ数据线,可以实现单总线数据传输,简化了硬件设计。

而且,它可以使用数据线供电,可以再省去一个电源线,只要接地和数据线即可。

下面是一个TSOC封装的引脚图:

 

在实际使用中,要注意不能把它的正负极引脚接反,否则很容易造成芯片损坏。在实际使用时还常常用到下面这种形态的封装。这时可以如图所示,面朝芯片的平面一侧,从左到右依次是GND,DQ,VDD引脚。供电电源可取3V到5.5V。

此外,每一个DS18B20的内部都有一个唯一的64位长的编号作为标识,所以可以将多个DS18B20串在一根总线上实现温度查询测量。这个64位长的序列存储在其ROM中,开始8位为产品编号,同系列的DS18B20是相同的;接下来的48位为每个器件的唯一编号,最后8位为前面56位的循环校验码CRC码。

二.将存储器数据转换为实际温度的方法

DS18B20用两个存储器存储温度测量之。其中高8位为符号存储。若温度小于0,则此8位全为1;若温度大于0,则此8位均为0。为什么要采用这样的存储方式呢??在这种存储方式下,数据实际上是以补码的方式在存储。所以当我们用C语言编程的时候,可以直接把高8位和低8位组合到一起,然后直接赋给一个int型的变量。考虑到它的1LSB为0.0625°,所以我们还要再乘以0.0625才能得到真实的温度。

三.硬件连接

下面是我的单片机开发板的硬件连接图:

首先是DS18B20模块:

可以看到,在芯片的DQ引脚上又加了一个上拉电阻,这是是选择了10K。这是因为DS18B20输出高电平的能力不强,一般采用接上拉电阻的方式增强其输出能力,上拉电阻一般取4到5K即可。这是一种比较简单的上拉方法,其中DALLAS公司的数据手册中还提出了他们建议的上拉方法,可以参考其手册来设计。

 

微控制器部分采用STC的89C52,如下:

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是基于51单片机+DS18B20温度传感器+LCD1602显示器的程序: ```c #include <reg52.h> #include <intrins.h> #define LCD1602_DATAPORT P0 // LCD1602数据口定义 sbit LCD1602_RS = P2^0; // LCD1602 RS引脚定义 sbit LCD1602_RW = P2^1; // LCD1602 RW引脚定义 sbit LCD1602_EN = P2^2; // LCD1602 EN引脚定义 #define DS18B20_DQ P3_7 // DS18B20数据线定义 unsigned char str[16]; // 存储温度字符串 void delay(unsigned int t) // 延时函数 { unsigned int i,j; for(i=0;i<t;i++) { for(j=0;j<125;j++); } } void LCD1602_WriteCmd(unsigned char cmd) // 写命令函数 { LCD1602_RS = 0; // RS置低 LCD1602_RW = 0; // RW置低 LCD1602_DATAPORT = cmd; // 将命令写入数据口 LCD1602_EN = 1; // EN置高 _nop_(); // 空操作 _nop_(); _nop_(); LCD1602_EN = 0; // EN置低 } void LCD1602_WriteData(unsigned char dat) // 写数据函数 { LCD1602_RS = 1; // RS置高 LCD1602_RW = 0; // RW置低 LCD1602_DATAPORT = dat; // 将数据写入数据口 LCD1602_EN = 1; // EN置高 _nop_(); // 空操作 _nop_(); _nop_(); LCD1602_EN = 0; // EN置低 } void LCD1602_Init() // LCD1602初始化函数 { LCD1602_WriteCmd(0x38); // 8位数据总线,2行显示,5*7点阵字符 delay(5); LCD1602_WriteCmd(0x0c); // 关闭光标显示 delay(5); LCD1602_WriteCmd(0x06); // 右移光标 delay(5); LCD1602_WriteCmd(0x01); // 清屏 delay(5); } unsigned char DS18B20_Init() // DS18B20初始化函数 { unsigned char flag = 0; DS18B20_DQ = 1; // DQ置高 delay(10); DS18B20_DQ = 0; // DQ置低 delay(80); DS18B20_DQ = 1; // DQ置高 delay(10); flag = DS18B20_DQ; // 读取DS18B20应答信号 delay(10); return flag; } void DS18B20_WriteByte(unsigned char dat) // DS18B20写字节函数 { unsigned char i; for(i=0;i<8;i++) { DS18B20_DQ = 0; // DQ置低 _nop_(); // 空操作 _nop_(); DS18B20_DQ = dat&0x01; // 写入数据,从低位开始写 delay(10); DS18B20_DQ = 1; // DQ置高 dat >>= 1; // 右移一位 } } unsigned char DS18B20_ReadByte() // DS18B20读字节函数 { unsigned char i,dat = 0; for(i=0;i<8;i++) { dat >>= 1; // 右移一位 DS18B20_DQ = 0; // DQ置低 _nop_(); // 空操作 _nop_(); DS18B20_DQ = 1; // DQ置高 delay(2); if(DS18B20_DQ) // 判断数据位 { dat |= 0x80; // 写入数据,从高位开始写 } else { dat &= 0x7f; } delay(10); } return dat; } void DS18B20_GetTemp() // DS18B20读取温度函数 { unsigned char TL,TH; float temp; DS18B20_Init(); // DS18B20初始化 DS18B20_WriteByte(0xcc); // 跳过ROM操作 DS18B20_WriteByte(0x44); // 启动温度转换 delay(750); // 等待转换完成 DS18B20_Init(); // DS18B20初始化 DS18B20_WriteByte(0xcc); // 跳过ROM操作 DS18B20_WriteByte(0xbe); // 读取温度寄存器数据 TL = DS18B20_ReadByte(); // 读取低温度字节 TH = DS18B20_ReadByte(); // 读取高温度字节 temp = TH; temp *= 256; temp += TL; temp *= 0.0625; // 计算温度值 sprintf(str,"Temp:%.2fC ",temp); // 将温度值转换为字符串 } void main() { LCD1602_Init(); // LCD1602初始化 while(1) { DS18B20_GetTemp(); // 获取温度值 LCD1602_WriteCmd(0x80); // 设置光标位置为第一行第一列 for(unsigned char i=0;i<16;i++) // 写入温度字符串 { LCD1602_WriteData(str[i]); } delay(1000); // 延时1秒 } } ``` 以上程序实现了基于51单片机+DS18B20温度传感器+LCD1602显示器的温度监测功能。具体实现过程为:初始化LCD1602和DS18B20,循环读取DS18B20温度值,将温度值转换为字符串并在LCD1602上显示,然后延时1秒后继续循环读取温度值。 ### 回答2: 这是一个基于51单片机DS18B20温度传感器和LCD1602显示器的程序,用于测量环境温度并在LCD显示器上显示。 首先,我们需要连接硬件设备。将DS18B20温度传感器的VCC引脚连接51单片机的5V电源引脚,将GND引脚连接到GND引脚,将DQ引脚连接到P0口(可以根据需要更改引脚)。然后,将LCD1602显示器的VCC引脚连接到5V电源引脚,将GND引脚连接到GND引脚,将SCL引脚连接51单片机的P2口,将SDA引脚连接到P3口。 接下来,打开编程软件,创建一个新的项目。首先,我们需要引入51单片机的头文件和宏定义。然后,我们需要定义DS18B20传感器的一些常量和变量,包括温度传感器的ROM码和温度值。接着,我们需要写一些函数用于初始化DS18B20传感器和LCD1602显示器,并读取温度值。 在主函数中,我们首先需要调用初始化函数来初始化DS18B20传感器和LCD1602显示器。然后,我们可以通过调用读取温度值的函数来获取当前环境温度,并将其存储到温度变量中。最后,我们可以通过调用LCD显示函数来在LCD显示器上显示温度值。 程序的基本逻辑是,当主函数运行时,首先初始化DS18B20传感器和LCD1602显示器。然后,通过读取温度传感器的值并将其转换为实际温度值,将实际温度值存储在温度变量中。最后,通过将温度值转换为字符串,并调用LCD显示函数将其显示在LCD1602显示器上。 以上是一个简单的基于51单片机DS18B20温度传感器和LCD1602显示器的程序。程序的功能是测量环境温度并在LCD显示器上显示。 ### 回答3: 基于51单片机DS18B20温度传感器和LCD1602显示器的程序如下: 首先,我们需要包含头文件 #include <reg51.h> #include <lcd.h> #include <ds18b20.h> 然后,定义所需的变量 sbit LCD_RS = P2^0; // 设置LCD_RS引脚 sbit LCD_RW = P2^1; // 设置LCD_RW引脚 sbit LCD_EN = P2^2; // 设置LCD_EN引脚 定义主函数 void main() { float temperature; // 存储温度值 char display[16]; // 存储显示在LCD上的字符串 LCD_Init(); // 初始化LCD1602显示器 DS18B20_Init(); // 初始化DS18B20传感器 while (1) // 无限循环 { temperature = DS18B20_GetTemp(); // 获取温度值 sprintf(display, "Temperature: %.2fC", temperature); // 格式化温度值字符串 LCD_Clear(); // 清除LCD屏幕 LCD_Write_String(display); // 显示温度值 Delay(500); // 延迟500毫秒 } } 程序的逻辑是:首先,我们初始化LCD和DS18B20传感器。然后,在无限循环中,我们不断获取温度值,并将其格式化为字符串。然后,我们清除LCD屏幕并在LCD上显示温度值。最后,我们延迟500毫秒,以便能够看到温度在LCD上的显示。该程序可以实时显示DS18B20传感器测量到的温度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值