STM32F103 DS18B20温度采集实验

实验目的

学习DS18B20温度传感器的使用,利用其采集温度,掌握单总线通信原理。

实验简介

单总线简介
One-Wire 总线是DALLAS公司研制开发的一种协议,它是由一个总线主节点,一个或多个从节点组成系统,通过一根信号线对从芯片进行数据的读取。每一个符合 One-Wire协议的从芯片都有一个唯一的地址,包括48位的序列号,8位的家族代码和8位的CRC代码。主芯片对各个从芯片的寻址依据这64位的不同来进行。One-Wire总线利用一根线实现双向通信。因此其协议对时序的要求较严格,如应答等时序都有明确的时间要求。基本的时序包括复位及应答时序,写一位时序,读一位时序。在复位及应答时序中,主器件发出复位信号后,要求从器件在规定的时间内送回应答信号;在位读和位写时序中,主器件要在规定的时间内读回或写出数据

单总线工作原理
单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其他设备使用总线。单总线通常要求外接一个约为4.7K的上拉电阻,这样,当总线闲置时,其状态为高电平。主机和从机的通信可通过3个步骤完成,分别为初始化One-Wire器件,识别One-Wire器件和交换数据。由于他们时主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问One-Wire器件都必须严格遵循单总线命令序列,即初始化,ROM命令,功能命令,如果出现序列混乱,One-Wire器件将不响应主机(搜索ROM命令,报警搜索命令除外)

单总线通信过程
所有的单总线器件要求采用严格的信号时序,以保证数据的完整性。DS18B20共有6中信号类型:复位脉冲,存在脉冲,写0,写1,读0,和读1。所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前,几个信号的时序如下:

初始化时序(复位脉冲和存在脉冲):首先复位,由单片机给DS18B20单总线至少480uS的低电平信号。复位后,单片机将数据单总线拉高,当DS18B20接到此复位信号后则会在1560uS后接收一个60240uS的低电平信号存在脉冲
在这里插入图片描述
**写时序:**包括写0和写1时序,所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。写1时序:主机输出低电平,延时2~15us,然后释放总线,延时60us。写0时序:主机输出低电平,延时60us,然后释放总线,延时2us,时序图如下:
在这里插入图片描述

读时序: 单总线器件仅在主机发出读时序时,才向主机传输数据,所以在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间,每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的单平然后延时50us,时序图如下:

在这里插入图片描述
DS18B20的温度读取过程如下:
复位->发SKIP ROM命令(0xcc)->发开始转换命令(0x44)->复位->发送SKIP ROM 命令(0xcc)->发读存储器命令(0xBE)->连续读出两个字节数据(即温度)->结束

电路设计

在这里插入图片描述

HAL库代码

main.c

#include "MyIncludes.h"

u16 sys_cnt = 0;

void systick_isr(void)
{
   
	if(sys_cnt < 1000) sys_cnt++;
	else
	{
   
		sys_cnt = 0;
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4|GPIO_PIN_5);
	}
}

_DS18B20_MEASURE DS18B20_Measure;
//DS18B20测量结构体变量声明
char measure[14];
//用来存储测量结果

int main(void)
{
   			
	System_Init();
	
	LED_Init();	
	
	SysTick_Init(systick_isr);
	
	USART1_Init(115200,NULL,NULL);
	
	while(Ds18b20_Init())
	//如果返回1,就是超时 也就是初始化错误
	{
   
		printf("DS18B20 Init ERROR\r\n");
	}
	
    while(1)
    {
   	
		//显示温度
		Ds18b20_ReadTemper(&DS18B20_Measure);
		
		if(DS18B20_Measure.Temper_plus_minus == 1)  
        //负温度
		{
   
			sprintf(
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值