单总线温度采集

本文详细介绍了DS18B20温度传感器的通信原理,包括初始化序列、写时序和读时序,以及如何通过代码实现环境温度采集,并展示了Pertous仿真和Keil波形分析的过程。通过改变时序的实验,突出了正确通信时序对温度读取准确性的重要性。
摘要由CSDN通过智能技术生成

目录

一、DS18B20

1.DS18B20简介

二、DB18B20通信时序

1.初始化序列

2.写时序

3.读时序

三、环境温度采集

1.代码实现

2.Pertous仿真

3.keil波形分析

4.改变时序再行观察


一、DS18B20

1.DS18B20简介

DS18B20 是美信公司的一款温度传感器,单片机可以通过 1-Wire 协议与 DS18B20 进行通信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 DS18B20 的数据引脚和单片机的一个 IO 口接上就可以了。

2.DS18B20引脚排列及说明

二、DB18B20通信时序

1.初始化序列

 DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。当发出应答复位脉冲的存在脉冲后,DS18B20通知主机它在总线上并且准备好操作了。 

2.写时序

读写时隙

主机在写时隙向DS18B20写入数据,并在读时隙从DS18B20读入数据。在单总线上每个时隙只传送一位数据。

 写时间隙

 有两种写时隙:写“0”时间隙和写“1”时间隙。总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0。

  所有的写时隙必须至少有60us的持续时间。相邻两个写时隙必须要有最少1us的恢复时间。所有的写时隙(写0和写1)都由拉低总线产生。

        为产生写1时隙,在拉低总线后主机必须在15us内释放总线(拉低的电平要持续至少1us)。由于上拉电阻的作用,总线电平恢复为高电平,直到完成写时隙。

        为产生写0时隙,在拉低总线后主机持续拉低总线即可,直到写时隙完成后释放总线(持续时间60-120us)。

         写时隙产生后,DS18B20会在产生后的15到60us的时间内采样总线,以此来确定写0还是写1。

代码实现:

向DS18B20写一位数据:

void WR_Bit(bit i)
    {
          DQ=0;//产生写时序 
          _nop_();
          _nop_();//总线拉低持续时间要大于1us
          DQ=i;//写数据 ,0和1均可
          Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取 
          DQ=1;//释放总线 
    }

​

​

DS18B20写字节函数,先写最低位:

void WR_Byte(unsigned char dat)
    {
          unsigned char i="0";
          while(i++<8)
          {
                 WR_Bit(dat&0x01);//从最低位写起 
                 dat>>=1; //注意不要写成dat>>1
          }
    }

3.读时序

读时序

DS18B20只有在主机发出读时隙后才会向主机发送数据。因此,在发出读暂存器命令 [BEh]或读电源命令[B4h]后,主机必须立即产生读时隙以便DS18B20提供所需数据。另外,主机可在发出温度转换命令T [44h]或Recall命令E 2[B8h]后产生读时隙,以便了解操作的状态(在 DS18B20操作指令这一节会详细解释)。

读时间隙

   所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。在主机产生读时隙后,DS18B20开始发送0或1到总线上。DS18B20让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。因此,主机释放总线和采样总线等动作要在15μs内完成。

代码实现:

向DS18B20读一位数据:

 unsigned char Read_Bit()
    {
          unsigned char ret;
          DQ=0;//拉低总线
          _nop_(); _nop_();   
          DQ=1;//释放总线       
          _nop_(); _nop_();
          _nop_(); _nop_();
          ret=DQ;//读时隙产生7 us后读取总线数据。把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性
          Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求 
       DQ=1;//释放总线 
          return ret; //返回读取到的数据 
    }

DS18B20读一个字节函数,先读最低位:

三、环境温度采集

1.代码实现

要求:使用DS18B20温度传感器采集当前环境温度、数码管显示检测的温度值,以此达到检测环境温度的要求。

具体代码如下:

#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++)	
	 {
	 out=(temp/10)&0x0f;
	 smg1=0;
	 smg2=1;
	 delay5(1000);	
	 out=(temp%10)&0x0f;
	 smg1=1;
	 smg2=0;
	 delay5(1000);	
	 }
	}
 
}
 
 
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;	
		  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);
}

2.Pertous仿真

pertous里面我们使用仿真DS18B20传感器向芯片输入数值,然后在数码管上显示,仿真电路如下:

开发板实验结果如下:

3.keil波形分析

4.改变时序再行观察

当我们修改延时函数,将时序弄错后再行重复实验仿真,得到的温度是不准确的,不会再返回正确的温度,仿真效果如下:

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值