蓝桥杯单片机基础部分——5、DS18B20温度传感器

前言

好久没有更新关于蓝桥杯单片机相关的模块了,今天更新一下数字温度传感器DS18B20的相关应用

单线数字温度计DS1820介绍

DS1820数字温度计提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DS1820 或从 DS1820 送出,因此从主机CPU到DSl820仅需一条线(和地线) 。DS1820的电源可以由数据线本身提供而不需要外部电源。因为每一个DS1820在出厂时已经给定了唯一的序号,因此任意多个DS1820可以存放在同一条单线总线上,这允许在许多不同的地方放置温度敏感器件。DS1820的测量范围从-55℃ 到+125℃ ,增量值为0.5℃ 。

DSl820中用于贮存测得的温度值的两个8位存贮器RAM,编号为0号和1号。1 号存贮器存放温度值的符号,如果温度为负(℃ )则1号存贮器8位全为1,否则全为0。0号存贮器用于存放温度值的补码 LSB(最低位)的 “1”表示 0.5 将存贮器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-55℃~125℃ ) 。
每只D51820都可以设置成两种供电方式,即数据总线供电方式和外部供电方式,采取数据总线供电方式可以节省一根导线,但完成温度测量的时间较长,采取外部供电方式则多用一根导线,但测量速度较快 。
在这里插入图片描述
在这里插入图片描述

温度计算

DS18B20用12位存贮温值度,最高位为符号位,下图为18b20的温度存储方式 负温度S=1,正温度S=0,如
0550H 为+85℃ ,0191H 为 25.0625℃ ,FC90H为-55℃
在这里插入图片描述

DSl820工作过程及时序

DSl820 工作过程中的协议如下

1、初始化
单总线上的所有处理均从初始化开始
2、ROM操作品令
总线主机检测到DS18B20的存在 便可以发出ROM操作命令之一
在这里插入图片描述

3、存储器操作命令
在这里插入图片描述
4、时序
主机使用时间隙来读写DS18B20的数据位和写命令字的位
(1)初始化
主机总线to时刻发送一复位脉冲(最短为480us的低电平信号), 接着在t1时刻释放总线并进入接收状态,DSl820在检测到总线的上升沿之后,等待15-60us,接DS18B20在t2时刻发出存在脉冲(低电平 持续60-240 us),如图中虚线所示
在这里插入图片描述

(2)写时间隙
当主机总线t o时刻从高拉至低电平时,就产生写时间隙,从to时刻开始15us之内应将所需写的位送到总线上,DS18B20在t。后15-60us间对总线采样,若低电平 写入的位是0,若高电平,写入的位是1,连续写2位间的间隙应大于1us
在这里插入图片描述
(3)读时间隙
主机总线to时刻从高拉至低电平时,总线只须保持低电平1 7ts。之后在t1时刻将总线拉高,产生读时间隙,读时间隙在t1时刻后t 2时刻前有效。t2距t0为15us 也就是说:t2时刻前主机必须完成读位,并在t0后的60us一120us内释放总线,读位子程序
在这里插入图片描述

代码

又臭又长的介绍,总不如代码来的实惠,直接上代码

onewire.c

#include "onewire.h"

//单总线延时函数
void Delay_OneWire(unsigned int t)
{
  while(t--);
}

//DS18B20芯片初始化
bit Init_DS18B20(void)
{
	bit initflag = 0;
	DQ = 1;
	Delay_OneWire(120);
	DQ = 0;
	Delay_OneWire(800); 
	DQ = 1;
	Delay_OneWire(100); 
	initflag = DQ;    
	Delay_OneWire(50);
  
	return initflag;
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(50);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(50);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(50);
	}
	return dat;
}

onewire.h

#ifndef _ONEWIRE_H
#define _ONEWIRE_H

#include <REGX52.H>



#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe

//IC引脚定义
sbit DQ = P1^4;

//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);

#endif

实际使用部分代码

unsigned int ds18b20()
{
	unsigned int LSB,MSB;
	unsigned int temp = 0;
	Init_DS18B20();
	Write_DS18B20(0xcc);//跳过读序号列号的操作
	Write_DS18B20(0x44);//启动温度转换
	
	Init_DS18B20();
	Write_DS18B20(0xcc);//跳过读序号列号的操作
	Write_DS18B20(0xbe);//读取温度寄存器
	LSB = Read_DS18B20();//读低8位
	MSB = Read_DS18B20();//读高8位
	temp = MSB;
	temp = (temp<<8) |LSB;
	temp *= 0.0625;
	return temp;
}

本人水平有限,所有代码都是自己的风格书写,但是大致的应该是没有什么问题,希望对大家有帮助如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论

上一节:蓝桥杯单片机基础部分——4、DS1302时钟

### 关于蓝桥杯嵌入式系统中使用DS18B20温度传感器 #### 实现IAP15F2K61S2上的DS18B20温度读取操作 为了在IAP15F2K61S2单片机上实现对DS18B20温度传感器的操作,需要理解并遵循特定的硬件连接方式以及编程逻辑。具体来说,初始化过程涉及配置单片机引脚作为输入/输出端口来模拟单总线协议通信[^1]。 ```c #include <reg52.h> sbit DS18B20_PIN = P1^4; void DS18B20_Init(void){ // 初始化设置 } // 单总线写一位函数 void WriteBit(unsigned char bit) { DS18B20_PIN = 0; _nop_(); if(bit) { DS18B20_PIN = 1; _nop_(); _nop_(); } else { DS18B20_PIN = 0; _nop_(); _nop_(); DS18B20_PIN = 1; } } ``` #### ROM与存储器操作命令解析 针对DS18B20的操作不仅限于简单的数据交换;还包括一系列ROM指令用于识别设备身份,还有专门用来控制内部寄存器状态的记忆体指令。这些对于确保每次交互都是面向正确的目标器件至关重要[^2]。 #### 完整项目代码示例 完整的程序应当能够完成从启动到最终数据显示的一系列流程,这通常涉及到几个主要部分:首先是初始化阶段,接着发出开始转换信号给传感器使其测量当前环境温湿度值,最后则是读回所测得的数据并通过适当的方式呈现出来,比如利用数码管显示装置。 ```c unsigned int ReadTemperature() { unsigned char i, j; unsigned int temp_data=0; // 发送复位脉冲 DS18B20_RST(); // 跳过ROM序列号匹配 WRITE_BYTE(0xCC); // 启动温度转换命令 WRITE_BYTE(0x44); // ... (等待转换结束) DS18B20_RST(); WRITE_BYTE(0xCC); WRITE_BYTE(0xBE); for(i=0;i<9;i++) { temp_data |= READ_BYTE()<<((8-i)*8); } return temp_data; } ``` #### 连接方法说明 根据实际应用情况,可能还需要注意物理层面上如何将DS18B20正确无误地接入电路板之中。一般情况下,该型号采用三针接口设计,其中一根为电源正极VCC、另一根接地GND而剩下的则负责传输信号DQ,并且后者需经由电阻拉高至合适电平以便稳定工作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值