单总线温度采集

本文详细介绍了如何使用DS18B20温度传感器与51单片机通过单总线通信,包括通信时序、初始化过程和温度读取函数。通过实验和Proteus仿真,展示了如何在普中开发板上实现数码管显示温度,并强调了精确时序在系统中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 实验目标

(1)学习单总线温度传感器的原理和通信时序
(2)使用51单片机的一个 IO 口模拟单总线时序与温度传感器DS18B20通信,将检测的环境温度读取出来

2.实验原理

2.1.通信时序

由于 DS18B20 是单总线器件,所有的单总线器件都要求采用严格的信号时序,以保证 数据的 完整性。DS18B20 时序包括如下几种:初始化时序、写(0 和 1)时序、 读(0 和 1)时序。 DS18B20 发送所有的命令和数据都是字节的低位在前

初始化时序:单片机将数据线电平拉低480~960μs后释放,等待
15~60μs, 单总线器件即可输出一持续60~240μs的低电平, 单片机收到此应答后即可进行操作。

在这里插入图片描述
写时序:当单片机将数据线电平从高拉到低时,产生写时序,有写
“0”和写“1"”两种时序。写时序开始后,DS18B20在15~60μs期间从数据线上采样。如果采样到低电平,则向DS18B20写的是“0”;如果采样到高电平,则向DS18B20写的是“1”。这两个独立时序间至少需拉高总线电平1μs时间。

在这里插入图片描述

读时序:读时序,当单片机从DS18B20读取数据时,产生读时序。此时单片机将数据线电平从高拉到低使读时序被初始化。如果在此后15us内,单片机在数据线上采样到低电平,则从DS18B20读的是“0”;如果在此后的15μs内,单片机在数据线上采样到高电平,则从DS18B20读的是“1”。
在这里插入图片描述

2.2.DS18B20温度传感器介绍

概述:DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接 口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、 适用电压宽、与微处理器接口简单的数字化温度传感器

特点:1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据 线供电。

2、独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即 可实现微处理器与 DS18B20 的双向通讯。

3、DS18B20 支持多点组网功能,多个 DS18B20 可以并联在唯一的三线上, 实现组网多点测温。

4、DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成 在形如一只三极管的集成电路内。

5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃

6、可编程的分辨率为 9~12 位,对应的可分辨温度分别为 0.5℃、0.25℃、 0.125℃ 和 0.0625℃,可实现高精度测温。

7、在 9 位分辨率时最多在 93.75ms 内把温度转换为数字,12 位分辨率时 最多在 750ms 内把温度值转换为数字,速度更快。

8、测量结果直接输出数字温度信号,以"一根总线"串行传送给 CPU,同时 可传送 CRC 校验码,具有极强的抗干扰纠错能力。 9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

内部结构

在这里插入图片描述

3.单总线温度测量系统

实验内容:利用DS18B20和L ED数码管实现单总线温度测量系统,原理电路见图11-3。DS18B20测量范围是-55到128°C。本例只显示00~99。通过本例掌握DS18B20特性及单片机I/O实现单总线协议的方法。

3.1Proteus仿真实验

Proteus仿真时,用手动,即用鼠标单击DS18B20图标上的“个”或
“↓”来改变温度,注意手动调节温度同时,LED数码管会显示出与
DS18B20窗口相同的2位温度数值。

电路原理图如下:

在这里插入图片描述

代码如下:

#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int 
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);

void main(void)
{
uchar i,temp;
delay5(1000);
while(1)
	{
	 temp=retemp();	
	 for(i=0;i<10;i++)//连续扫描数码管10次	
	 {
	 out=(temp/10)&0x0f;
	 smg1=0;
	 smg2=1;
	 delay5(1000);	//延时5ms
	 out=(temp%10)&0x0f;
	 smg1=1;
	 smg2=0;
	 delay5(1000);	//延时5ms
	 }
	}

}

//精确延时5微妙子程序
void delay5(uchar n)
{
	 do
	 {
	 _nop_();
	 _nop_();
	 _nop_();
	 n--;
	 }
	 while(n);
}
//初始化函数
void init_ds18b20(void)
{
	 uchar x=0; 
	 DQ =0;    
	 delay5(120); 
	 DQ =1;    
	 delay5(16);
	 delay5(80);
}
//读取一字节函数
uchar readbyte(void)
{
	uchar i=0;
	uchar date=0;
	for (i=8;i>0;i--)
	 {
		  DQ =0;
		  delay5(1);
		  DQ =1;	//15微秒内拉释放总线
		  date>>=1;
		  if(DQ)
		  date|=0x80;
		  delay5(11);
	 }
 	return(date);
}
//写一字节函数
void writebyte(uchar dat)
{
 uchar i=0;
 for(i=8;i>0;i--)
	 {
	  DQ =0;
	  DQ =dat&0x01;
	  delay5(12);	  
	  DQ = 1;	   
	  dat>>=1;
	  delay5(5);
	  }
}
//读取温度函数
uchar retemp(void)
{
	uchar a,b,tt;
	uint t;
	init_ds18b20();
	writebyte(0xCC); 
	writebyte(0x44);
	init_ds18b20();
	writebyte(0xCC); 
	writebyte(0xBE); 
	a=readbyte();
	b=readbyte();
	t=b;
	t<<=8;
	t=t|a;
	tt=t*0.0625;
	return(tt);
}

仿真效果如下:

请添加图片描述

3.2.普中开发板

硬件设计
本实验使用到硬件资源如下:
(1)动态数码管
(2)DS18B20
开发板上DS18B20 模块电路,如下图所示:
在这里插入图片描述
从上图可以看出,传感器接口的单总线管脚接至单片机 P3.7 IO 口上

软件设计
要实现的功能是:插上 DS18B20 温度传感器,数码管显示检测的温度值。
程序框架如下:
(1)编写数码管显示功能
(2)编写 DS18B20 读取温度功能
(3)编写主函数

3.2.1 数码管显示

在这里插入图片描述

3.2.2.DS18B20 初始化函数
/********************************************************************
***********
* 函 数 名 : ds18b20_init
* 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测 DS 的存在
* 输 入 : 无
* 输 出 : 1:不存在,0:存在
*********************************************************************
**********/
u8 ds18b20_init(void)
{
ds18b20_reset();
return ds18b20_check();
}
3.2.2温度读取函数
/********************************************************************
***********
* 函 数 名 : ds18b20_read_temperture
* 函数功能 : 从 ds18b20 得到温度值
* 输 入 : 无
* 输 出 : 温度数据
*********************************************************************
**********/
float ds18b20_read_temperture(void)
{
float temp;
u8 dath=0;
u8 datl=0;
u16 value=0;
ds18b20_start();//开始转换
ds18b20_reset();//复位
ds18b20_check();
ds18b20_write_byte(0xcc);//SKIP ROM
ds18b20_write_byte(0xbe);//读存储器
datl=ds18b20_read_byte();//低字节
dath=ds18b20_read_byte();//高字节
value=(dath<<8)+datl;//合并为 16 位数据
if((value&0xf800)==0xf800)//判断符号位,负温度
{
value=(~value)+1; //数据取反再加 1
temp=value*(-0.0625);//乘以精度
}
else //正温度
{
temp=value*0.0625;
}
return temp;

该函数首先调用了 ds18b20_start 函数用来开始 DS18B20 的温度转换,其代码如下:

/********************************************************************
***********
* 函 数 名 : ds18b20_start
* 函数功能 : 开始温度转换
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
void ds18b20_start(void)
{
ds18b20_reset();//复位
ds18b20_check();//检查 DS18B20
ds18b20_write_byte(0xcc);//SKIP ROM
ds18b20_write_byte(0x44);//转换命令
}

最终将 2 个字节的温度数据读取出来,判断最高字节的高 5 位是否为 0,如果为 0 表明读取的温度值为正温度,直接乘以 0.0625 即可,否则为负温度,需取反后加 1 再乘以 0.0625。

3.2.3 主函数

在这里插入图片描述
实验现象如下:

3.3.keil总线时序

在这里插入图片描述
通过对波形的细致分析,我们可以确认该程序严格遵循了所需的技术规范,其运行表现与预期相符。然而,当对延时函数进行调整,进而改变了原有的时序安排后,再次进行实验时,我们发现温度采集功能出现了异常,无法获得准确的数据。由此可见,在此类温度采集程序中,精确把控时序逻辑具有至关重要的意义。

总结

DS18B20采用单总线协议,只需一条数据线即可实现与微控制器的双向通信,大大简化了硬件连接。在布线复杂或需要节省引脚资源的项目中,这一特性尤为实用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值