单片机ds18b20的介绍和源码

DS18B20温度模块

   1.1模块特征

      

供电方式 (两种供电方式:供电为:35.5V)

    


DS18B20结构图

      

主要由2部分组成:64ROM9字节暂存器,如图所示

 

   164ROM。它的内容是64位序列号,它可以被看做是该DS18B20de地址序列码,

        其作用是使每个DS18B20都不相同,这样就可以实现一根总线上挂载多个DS18B20

        的目的。(由于实验条件,本次只在一根总线下挂载了一个DS18B20)。

   29字节暂存器包含:温度传感器、上限触发TH高温报警器、下线触发TL低温报警

        器、高速暂存器、8CRC产生器。

         

 

以上部分为9字节的暂存单元(包括EEPROM)。

字节01是温度暂存器,用来存储转换好的温度。

字节23是用户用来设置最高报警和最低报警值。软件实现。(由于设计时的气候环境,

         只设置了一个上限温度报警,而没有设定下限温度报警)。

字节4是配置寄存器,用来配置转换精度,让它工作在912位。

字节57保留位。

字节8 CRC校验位。是64ROM中的前56位编码的校验码。由CRC发生器产生。


温度寄存器

    温度寄存器结构图

          

    

      温度寄存器由两个字节组成,分为低8位和高8位,一共16个字节。

        *其中,第0位到第3位,存储的是温度值的小数部分。

        *4位到第10位存储的是温度值的整数部分。

        *11位到第15位为符号位,全0表示是正温度,全1表示负温度。

        *下表中的数值,如果相应的位为1,表示存在,如果相应的位为0,表示不存在。

             

   

  配置寄存器

    配置寄存器结构图

             

      精确值:

           9--bit       0.5

           10-bit       0.25

           11-bit       0.125

           12-bit       0.0625

            一般都默认为12--bit 


       

  初始化

          

         初始化时序包括:主机发出的复位脉冲和从机发出的应答脉冲。主机通过拉低单总线480-960us产生复位脉冲;然后由主机释放总线,并进入接收模式。主机释放总线时,    会产生一由低电平跳变为高电平的上升沿,单总线器件检测到该上升沿后,延时15-60us,接着单总线器件通过拉低总线60-240us来产生应答脉冲。主机接收到从机的以应     答脉冲后,说明有单总线器件在线,初始化完成,主机可以对从机进行ROM命令和操作。

位写入时序

       

   

      写时隙:当主机把数据线从逻辑高电平拉到逻辑低电平时候,开始写时隙,两种写时间隙:写1和写0。所有写时隙必须最少持续60us,包括两个写周期间至少1us的恢            复时间。DQ引脚电平变低后,DS18B20在一个15us60us的时间内对DQ引脚采样。如果DQ引脚高电平,写1,如果低电平,写0,主机要生成一个写1时间隙。

         必须把数据线拉到低电平然后释放,在写时隙开始后的15us内允许数据拉到高电平。主机要生成一个写0时间隙,必须把数据线拉到低电平并保持60us

 位读入时序

     

  

  当主机把总线从高电平拉低,并保持至少1us后释放总线;并在15us内读取从DS18B20输出的数据。

 

DS18B20ROM操作命令

  用途:主要用于选定在单总线上的DS18B20,分为5个命令。

1:读出ROM,代码为33H,用于读出DS18B20的序列号,即64位激光ROM代码。

2:匹配ROM,代码为55H,用于识别(或选中)某一特定的DS18B20进行操作。

3:搜索ROM,代码为F0H,用于确定总线上的节点数以及所有节点的序列号。

4:跳过ROM,代码为CCH,当总线仅有一个DS18B20时,不需要匹配。

5:报警搜索,代码为ECH,主要用于鉴别和定位系统中超出程序设定的报警温度

        界限的节点。

 

 启动温度转换

   三个步骤:

   1、复位DS18B20

   2、发出跳过ROM命令(CCH

   3、发出启动温度转换命令(44H

 其中Skip ROM 命令仅适用于总线上只有一个DS18B20时的情况。


部分源码:

 

#include <reg52.h>
#include "./delay/delay.h"
#include <intrins.h>
#include <stdio.h>
#include "./LCD1602/LCD1602.h"

sbit ds = P3^4;
bit ack = 0;

void ds18b20_reset()
{
		ds = 1;
		ds = 0;
		delay_us(200);
		delay_us(200);
		ds = 1;
		delay_us(30);
	
		if(0 == ds)
		{
				ack = 1;
		}
		else
		{
				ack = 0;
		}
		delay_us(200);
		delay_us(200);
}

void ds18b20_write_byte(unsigned char byte)
{
		unsigned char i;
		for(i = 0; i < 8; i++)
		{
				ds = 0;
				_nop_();
				_nop_();
				ds = byte & 0x01;
				byte >>= 1;
				delay_us(30);
				ds = 1;
		}
		delay_us(30);
}

bit ds18b20_read_bit()
{
		bit temp;
		ds = 1;
		ds = 0;
		_nop_();
		_nop_();
		ds = 1;
		temp = ds;
		delay_us(30);
		return temp;
}

unsigned char ds18b20_read_byte()
{
		unsigned char i, j, k;
		for(i = 0; i < 8; i++)
		{
				j = ds18b20_read_bit();
				k = (j << 7) | (k >> 1);
		}
		return k;
}

void main()
{
		unsigned char a;
		unsigned char i;
		unsigned int temp, b;
		float wendu;
		unsigned char disbuf[20];
		BLK = 0;
	
		lcd1602_init();
		while(1)
		{
				
				ds18b20_reset();
				ds18b20_write_byte(0xcc);
				ds18b20_write_byte(0x44);
			
				ds18b20_reset();
				ds18b20_write_byte(0xcc);
				ds18b20_write_byte(0xbe);
				a = ds18b20_read_byte();
				b = ds18b20_read_byte();
				temp = (b << 8) | a;
				wendu = (float)temp * 0.0625;
				sprintf(disbuf,"temp is:%7.3f",wendu);
				lcd1602_dis_str(0,0,disbuf);
			
				
				

		}
}




  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值