单总线温度采集

一、实验目标

1、学习单总线温度传感器DB18B20的原理和通信时序;

2、使用51单片机的一个 IO 口模拟单总线时序与温度传感器DS18B20通信,将检测的环境温度读取出来。

二、实验原理

实验设计的主要原理:DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。通过使用51单片机的一个IO口模拟单总线时序与DS18B20通信,可以实现读取环境温度的功能。具体实现原理包括初始化单总线、发送指令给DS18B20、DS18B20响应并发送数据、单片机读取数据、计算温度值以及显示温度值等步骤。通过这种方式,可以方便地获取环境温度并进行相应的处理和显示。

DS18B20写入的功能命令:

ROM指令:

采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
如果是单个DS18B20,直接写跳过ROM指令0xCC即可。

功能指令:

74LS47是一种常用的集成电路芯片,是一种BCD-7段译码器。它可以将4位的二进制代码转换为7段LED数字显示输出,常用于数字显示电路中。它的主要特点是低功耗、高噪声抑制、高可靠性和广泛的工作温度范围等。它可以直接驱动共阳或共阴的LED数字显示管,而不需要使用外部电阻或晶体管进行驱动。此外,74LS47还具有可编程的灵活性,可以通过外部电阻的变化来改变输入输出的逻辑关系。

三、利用DS18B20和LED数码管实现单总线温度测量系统

Keil源码:

#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
	 }
	}

}

 /*--------------精确延时5us子程序---------*/	
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;//写"1" 在15微秒内拉低
	  delay5(12);	   //写"0" 拉低60微秒
	  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);
}

Proteus仿真图:

仿真演示:

四、单总线信号

1)初始化时序

主机先拉低总线480us以上,构成复位脉冲,然后释放总线,DS18B20会在探测到上升沿后,等待15到60us,再拉低总线60到240us构成存在脉冲。

2)写时序

要产生写时序,先把总线拉低至少1us,如果写0,总线必须拉低60到120us,然后释放总线,如果写1,在写时序之后15us内把总线拉高,总时长要大于60us。注意两次写周期之间至少要间隔1us

3) 读时序

要产生读时序,必须把总线拉低至少1us,然后释放总线,在读信号开始后15us内总线控制器采样总线数据,读一位数据至少保持在60us以上。两次读周期之间至少间隔1us

问题:上述实验成功的代码在Keil中进行仿真运行,使用虚拟逻辑分析仪显示单片机与DS18B20的DQ数据线连接引脚的波形,分析其“初始化-->写--->读”总线时序,与原理进行对比分析: 1)判断其是否符合技术要求;2)故意在代码中把时序弄错(改延时delay的延时值),再重新运行之前的实验,看DS18B20是否能正确相应并返回温度。

分析:

1)判断是否符合技术要求:在正常情况下,单片机与DS18B20之间的通信时序需要满足DS18B20的通信协议要求,包括初始化、写入数据、读取数据等步骤。通过使用虚拟逻辑分析仪分析波形,可以判断时序是否符合技术要求。如果时序正确,DS18B20应该能够正确响应并返回温度数据。

2)故意改变延时值:如果在代码中故意改变延时值,导致通信时序出现错误,可能会影响DS18B20的正常通信。例如,如果延时时间太短,DS18B20可能来不及响应或发送数据;如果延时时间太长,可能导致通信超时或数据错误。重新运行实验后,如果时序出现错误,DS18B20可能无法正确响应或返回温度数据。

五、总结

通过这两个步骤的实验,可以验证通信时序的重要性,并了解时序错误对通信的影响。这有助于加深对DS18B20通信协议的理解,并提高对总线通信的应用能力。
 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值