蓝桥杯单片机基础部分——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温度传感器蓝桥杯竞赛中的应用 #### 一、DS18B20简介 DS18B20是一种数字温度传感器,支持OneWire总线协议。该器件能够提供9至12位摄氏温度测量数据,并具有独特的单总线接口特性,在硬件连接上仅需一条信号线即可完成通信[^2]。 #### 二、CRC校验机制解析 对于每一个有效的DS18B20设备而言,其内部存储着唯一的64位ROM编码,由三部分组成:首先是8位家族码(Family Code),用于标识产品型号;其次是48位序列号(Serial Number),用来区分不同个体;最后是8位循环冗余检验值(Cyclic Redundancy Check, CRC),它是由前两者共同计算得出的结果,确保了识别信息传输过程中的准确性。 #### 三、基于蓝桥杯平台的实际案例分析 为了帮助参赛者更好地理解和运用这一组件,《蓝桥杯国信长天单片机》提供了关于如何利用DS18B20实现精准测温功能的教学指南。此教程不仅涵盖了基础理论知识讲解,还包括详细的编程指导与实例演示,使学习者可以快速掌握操作技巧并应用于实际项目当中。 ```c #include <stdio.h> #include "onewire.h" #define ONE_WIRE_BUS P0_7 /* 定义 One-Wire 总线端口 */ void main(void){ uint8_t rom_code[8]; // 存储读取到的 ROM 编码 OW_Init(ONE_WIRE_BUS); // 初始化 One-Wire 接口 if (OW_Reset(ONE_WIRE_BUS)){ printf("No device found.\n"); return; } OW_Read_ROM_Code(rom_code); for(int i=0;i<8;i++){ printf("%02X ",rom_code[i]); } } ``` 上述代码展示了通过OneWire库函数来初始化总线、检测是否存在外接设备以及获取指定节点上的唯一ID编号的过程。这段简单的例子可以帮助初学者熟悉基本的操作流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值