DS18B20简单介绍温度测量操作

DS18B20的结构

引脚结构

DS18B20引脚有三个
引脚图

可以发现DS18B20的可操作口只有一个,一个口的元件我们以下称之为单总线元件,单总线元件显然的优点就是节约MCU的I/O口,可以腾出更多的I/O口给其他原件使用。
但是单总线元件也有缺点,就是操作非常麻烦。假如我们想要读取DS18B20里的数据或者向DS18B20里发送指令,那么从一个口读取或者写入很多1或者0将会是非常麻烦的操作。

内部结构

需要学习和了解的结构
①温度传感器(大体了解)
②64位ROM(大体了解)
③高速缓存(主要学习)
④报警器(大体了解)

温度传感器可以读取外界的温度,温度由用户自己调节温度分辨率(温度分辨率:类似于精确度,但是由于是电子元件二进制,不是以10为权值,以2为权值,举例实际温度为25.75℃,但是分辨率为0.5只能读取到小数点后精确度为0.5,所以读取到的是25.5),关于温度是怎么读取来的,我们不需要具体知道。如果想了解请,祥见DS18B20工作原理。

64位ROM其中包含的数据是关于每一个DS18B20的地址,地址就像是DS18B20的身份证号,地址的用途在后面会讲到。

高速缓存有9个字节地址
![高速缓存
其中温度低位和温度高位是用来储存温度的,TH和TL是分别储存报警温度的。
其他部分一般不会用到,不做过多介绍。

报警器,在测的的温度高于或者低于TH,TL中储存的数据时触发报警器。

DS18B20的操作

对一个元件来说,我们能对其进行的操作,一定是读操作,写操作中的一种或者两种。
对于DS18B20来说不仅有这两个操作,还有一个复位操作。

复位操作

先说复位操作,每当我们进行一次想要指令的输入之后,都要进行一次复位操作。
复位操作的时序图如下
在这里插入图片描述
先说明时序图中线形的含义与我们可进行操作,
控制器控制低电平:就是我们人为的控制MCU拉低这个总线连接的I/O口的电平。
电阻上拉:另外一个名字就是释放总线,就是人为控制MCU把这个总线连接的I/O口的电平拉高,由于上拉电阻的特性这时我们用MCU测量I/O口的电平就可以获得DS18B20的输入的电平。
DS18B20低电平:由DS18B20将DQ口的电压拉低,只要I/O口被释放了之后,我就可以通过检测I/O口的电压来得到DQ口的电压。
总线控制器和DS18B20同为低电平:顾名思义DQ口被DS18B20拉低与此同时I/O口被DS18B20拉低。

现在我们来讲怎么具体将DS18B20复位
首先要将I/O口拉低至少480us(建议拉低500us左右以免延迟函数造成影响),然后释放总线(把I/O拉高)约20us左右,之后只需检验I/O口的电平,就可以知道DS18B20的状态。如果I/O口为低电平,说明DS18B20已经复位成功并且我们已经接收到了他的响应,之后我们可以对他进行下一步的指令处理。如果我们检测到I/O口的电平为高,说明DS18B20没有复位成功,或者复位成功我们没有在正确的时间段里接收到响应。
具体代码如下

// A code block
var foo = 'bar';
unsigned char temp_init(){
	unsigned char a,b;
	DQ=0;
	Delay500us();
	DQ=1;
	Delay70us();
	b=DQ;
	Delay60us();
	Delay60us();
	DQ=1;
	if(b==1){
	    P2=0x80;
		P0=0x1F;
		P2=0xC0;
		P0=0x01;
		P2=0x00;
		P0=0xff;
		P2=0xE0;
		P0=0xfe;//让数码管显示一段异常的数字(每块板子的数码管结构不同,请根据具体情况改编使用)
		while(1);
	}
}

写操作

写操作的第一个重要意义就是向DS18B20输入指令
介绍一下常用指令
0xcc:跳过ROM识别指令,之前我们说过DS18B20是单总线元件,如果一条总线上连接了许多DS18B20元件,如果我们想要对某一个进行操作就要先识别其地址,并且匹配。本篇只讲解总线上挂一个DS18B20的时候我们怎么做,所以我们采取忽略地址识别的方法
0x44:温度转换指令,让温度传感器中的温度数据储存到高速缓存的前两字节中。
0xbe:读缓存器指令,通过写操作将DS18B20高速缓存中的数据传到MCU中。
0x33:读取ROM指令,当总线上只有一个DS18B20时才能使用此操作,将该DS18B20的地址传回MCU。
0x55:匹配ROM指令,顾名思义定位一个指定地址的DS18B20(具体操作不细细说明)。
写操作的时序写操作
首先将I/O口拉低约5us左右(切记不可超过15us),之后将I/O口的电平拉成我们想要输入的电平,延迟约45us,之后要延迟Xus使整个写操作写一个位的时常超过60us。这时我们就完成了写一位的操作,只要我们循环8遍就可以达成写一个字节的操作。
字节写入的顺序也有要求,要从一个字节的低位开始写,写到高位。

// A code block
var foo = 'bar';
unsigned char temp_write(unsigned char zijie)
{
	int a;
	unsigned char b;
	a=0;
	while(a<8){
		b=zijie&0x01;
		DQ=0;
		Delay5us();
		DQ=b;
		Delay10us();
		Delay10us();
		Delay10us();
		Delay10us();Delay5us();
		zijie=zijie>>1;
		DQ=1;
		Delay10us();
		Delay10us();
		a=a+1;
	}
}

读操作

读时序
读操作
我们要先把I/O口拉低约5us(切记不可超过15us),然后将总线释放(将I/O口拉高),之后延迟5us让DS18B20对DQ口进行操作,之后我们可以检测I/O口的电平就可以知道DS18B20输出的数据,之后延迟Xus让整个读一个位的操作时长超过60us。注意输出数据是,是从输出一个字节的低位输出到一个字节的高位。

unsigned int temp_read(){
	unsigned char a,b;
	unsigned int zijie;
	a=0;
	while(a<8){
		DQ=0;
		Delay5us();
		DQ=1;
		Delay5us();
		zijie=zijie>>1;
		if(DQ==1){
			zijie=zijie|0x80;
		}
		Delay70us();
		DQ=1;
		Delay5us();
		a=a+1;
	}
	return zijie;
}

DS18B20的温度读取

只介绍单总线上只有一个DS18B20的情况

复位1
跳过ROM识别1
温度转换
复位2
跳过ROM识别2
读取高速缓存数据

其中的1,2分代表着第几次执行次命令。
每块MCU的原理图结构不一定相同,在此不张贴自己的代码,有不懂或者错误的地方,欢迎留言提问或者指正。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值