DS18B20时序分析:

以下是STM32的驱动代码:

#include "bsp_ds18b20.h"

static void DS18B20_GPIO_Config(void)
{		

	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE); 

  	GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;	

  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

  	GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);

		GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
}

static void DS18B20_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;

	  GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;

	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	

	  GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}

static void DS18B20_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
  	GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;	

  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  	GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}

static void DS18B20_Rst(void)
{

	DS18B20_Mode_Out_PP();

	DS18B20_DATA_OUT(LOW);
	Delay_us(750);

	DS18B20_DATA_OUT(HIGH);

	Delay_us(15);
}

static uint8_t DS18B20_Presence(void)
{
	uint8_t pulse_time = 0;

	DS18B20_Mode_IPU();

	while( DS18B20_DATA_IN() && pulse_time<100 )
	{
		pulse_time++;
		Delay_us(1);
	}
	if( pulse_time >=100 )
		return 1;
	else
		pulse_time = 0;

	while( !DS18B20_DATA_IN() && pulse_time<240 )
	{
		pulse_time++;
		Delay_us(1);
	}
	if( pulse_time >=240 )
		return 1;
	else
		return 0;
}

static uint8_t DS18B20_Read_Bit(void)
{
	uint8_t dat;

	DS18B20_Mode_Out_PP();
	DS18B20_DATA_OUT(LOW);
	Delay_us(10);

	DS18B20_Mode_IPU();
	//Delay_us(2);

	if( DS18B20_DATA_IN() == SET )
		dat = 1;
	else
		dat = 0;

	Delay_us(45);

	return dat;
}

uint8_t DS18B20_Read_Byte(void)
{
	uint8_t i, j, dat = 0;	

	for(i=0; i<8; i++)
	{
		j = DS18B20_Read_Bit();
		dat = (dat) | (j<<i);
	}

	return dat;
}

void DS18B20_Write_Byte(uint8_t dat)
{
	uint8_t i, testb;
	DS18B20_Mode_Out_PP();

	for( i=0; i<8; i++ )
	{
		testb = dat&0x01;
		dat = dat>>1;
		if (testb)
		{
			DS18B20_DATA_OUT(LOW);
			Delay_us(8);

			DS18B20_DATA_OUT(HIGH);
			Delay_us(58);
		}
		else
		{
			DS18B20_DATA_OUT(LOW);
			/* 60us < Tx 0 < 120us */
			Delay_us(70);

			DS18B20_DATA_OUT(HIGH);
			Delay_us(2);
		}
	}
}

void DS18B20_Start(void)
{
	DS18B20_Rst();
	DS18B20_Presence();
	DS18B20_Write_Byte(0XCC);
	DS18B20_Write_Byte(0X44);
}

uint8_t DS18B20_Init(void)
{
	DS18B20_GPIO_Config();
	DS18B20_Rst();

	return DS18B20_Presence();
}

float DS18B20_Get_Temp(void)
{
	uint8_t tpmsb, tplsb;
	short s_tem;
	float f_tem;

	DS18B20_Rst();
	DS18B20_Presence();
	DS18B20_Write_Byte(0XCC);
	DS18B20_Write_Byte(0X44);			

	DS18B20_Rst();
  DS18B20_Presence();
	DS18B20_Write_Byte(0XCC);
  DS18B20_Write_Byte(0XBE);			

	tplsb = DS18B20_Read_Byte();
	tpmsb = DS18B20_Read_Byte(); 

	s_tem = tpmsb<<8;
	s_tem = s_tem | tplsb;

	if( s_tem < 0 )
		f_tem = (~s_tem+1) * 0.0625;
	else
		f_tem = s_tem * 0.0625;

	return f_tem;
}

/*************************************END OF FILE******************************/

总结:如何驱动DS18B20温度传感器的更多相关文章

  1. DS18b20温度传感器基础使用

    认识管脚 认识唯一标示的64位地址序列号 寄存器数据译码成温度值(下面只针对12位转化的,还有9..10等其他位的转化方式,不同位的转化,其精度也不同) 传感器存储器 配置寄存器使用说明 DS18b2 ...

  2. DS18B20温度传感器知识点总结

    2018-01-1818:20:48 感觉自己最近有点凌乱,一个很简单的问题都能困扰自己很久.以前能很好使用和调试的DS18B20温度传感器,今天愣是搞了很久,妈卖批. 仅仅一个上拉电阻就困扰了我很久 ...

  3. 单线制DS18B20温度传感器LED数码管显示当前的温度值

    /******************************************* 程序功能:利用单线制DS18B20温度传感器 LED数码管显示当前的温度值 ***************** ...

  4. STM32驱动DS18B20

    DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器.与传 统的热敏电阻等测温元件相比,它是一种新型的体积小.适用电压宽.与微处理器接口简单的 数字化温度传感器.一线 ...

  5. 「雕爷学编程」Arduino动手做(39)——DS18B20温度传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  6. 单片机学习(十二)1-Wire通信协议和DS18B20温度传感器

    目录 一.DS18B20 1. DS18B20简介 2. 电路原理图 3. 内部结构 内部完整结构框图 存储器结构 二.单总线(1-Wire BUS) 1. 单总线简介 2. 电路规范 3. 单总线的 ...

  7. nanopi的ds18b20温度传感器测试

    参考(抄袭)资料在这里 先接线,3.3v,gnd,数据输出脚,我是PG11 vim /boot/armbianEnv.txt overlays=w1-gpio param_w1_pin=PG11 pa ...

  8. 使用天祥TX-1C调试DS18B20温度传感器的收获

    翻查DS18B20的DataSheet编写操作函数,其过程遇到了不少坎,记下来备查. 对于单总线的DS18B20芯片,首先严格按照时序图写出正确的“写0”.“写1”和“读0.1”的基础函数,再以此写出 ...

  9. stm32 ds18b20 温度传感器

    相关文章:http://blog.csdn.net/zhangxuechao_/article/details/74991985 举例 void DS18B20_in() { GPIO_InitTyp ...

随机推荐

  1. 非负矩阵分解NMF

    http://blog.csdn.net/pipisorry/article/details/52098864 非负矩阵分解(NMF,Non-negative matrix factorization ...

  2. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  3. 1079. Total Sales of Supply Chain (25) -记录层的BFS改进

    题目如下: A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyon ...

  4. 详解EBS接口开发之库事务处理带提前发运通知(ASN)采购接收入库-补充

     A)   Via ROI Create a ASN [ship,ship]  for a quantity =3 on STANDARD PURCHASE ORDER Create  via R ...

  5. Hadoop:hadoop fs、hadoop dfs与hdfs dfs命令的区别

    http://blog.csdn.net/pipisorry/article/details/51340838 'Hadoop DFS'和'Hadoop FS'的区别 While exploring ...

  6. C++对C的函数拓展 - 默认参数

    1 C++中可以在函数声明时为参数提供一个默认值, 当函数调用时没有指定这个参数的值,编译器会自动用默认值代替 void myPrint(int x = 3) { printf("x:%d& ...

  7. Unity UGUI基础之Text

    Text作为UGUI最基础的控件以及最常用的控件,它在项目中的应用绝对可以算是最多的,任何一个UI界面可以说都离不开它,它的基本属性如下: 一.rect transform组件: rect trans ...

  8. Zookeeper实现负载均衡

    原理解析         架构图                  每台WorkServer启动的时候都会到Server创建临时节点.         每台ClientServer启动的时候,都会到S ...

  9. 敏捷测试(3)--基于story的敏捷基础知识

    基于story的敏捷基础知识----story编写 为什么使用Story? 软件行业40年多来,需求分析技术已经很成熟了,但是MRD驱动的过程不堪重负.因为往往MRD编写会占去很多时间,MRD评审又会 ...

  10. Html.java 存储页面信息类

    Html.java 存储页面信息类 package com.iteye.injavawetrust.miner; /** * 存储页面信息类 * @author InJavaWeTrust * */ ...