总结:如何驱动DS18B20温度传感器

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******************************/
时间: 2024-09-15 22:54:48

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

DS18B20温度传感器测温显示在数码管上(29.9℃)

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define uchar unsigned char #define uint unsigned int; /******************************************************************/ /* 定义端口 */ /*************************************************************

《开源硬件创客——15个酷应用玩转树莓派》——1.2树莓派基本介绍

1.2树莓派基本介绍 正所谓"既要仰望星空,又要脚踏实地",那在本节中,作者将给大家详细介绍树莓派的硬件配置,以及各类精彩纷呈的应用. 1.2.1 树莓派的"身体构造" 树莓派硬件.接口及其连接设备如图1-5所示.下面就让我们按图索骥,一同来探索树莓派的"身体构造"吧! 在人身体结构中,最重要的部位应该就是心脏了.那么树莓派的"心脏"是什么?下面请听作者一一道来.树莓派采用了一颗由博通公司(Broadcom Corporati

【AllJoyn专题】基于AllJoyn和Yeelink的传感器数据上传与指令下行的研究

接触高通物联网框架AllJoyn不太久,但确是被深深地吸引了.在我看来,促进我深入学习的原因有三点:一.AllJoyn开源,对开源的软硬件总会有种莫名的喜爱,尽管也许不会都深入下去:二.顺应潮流,物联网虽远未普及,但已是大势所趋,高通公司在领域布局,致力于打造舒适高效的智能家居场景,推出AllJoyn软件框架,适应了发展趋势:三.文档丰富,开源软件的使用,特别是框架,若没有文档相助,相信没有多少开发者愿意尝试,AllJoyn在这方面做得不错,日后还需做得更好.当然啦,也有些额外原因,包括高通的大

四位辉光管时钟-学长毕设

电路 在电路上,全部使用成品模块进行制作,通过简单的导线连接即可完成.具体介绍如下: 1) Arduino 兼容控制板 控制板采用 Bluno Beetle. Bluno Beetle 是一块兼容 Arduino Uno 的开发板,体积较小,且内置了蓝牙 4.0 功能.使用这块板子不仅可以节省空间,还支持无线下载程序,并能通过蓝牙实现更多功能. 2) 实时时钟与温度传感器 实时时钟模块采用 DFRobot 的 DS1307 模块,用于在掉电的情况下维持时间.另外,这一模块预留了 DS18B20

手把手教你写Linux设备驱动---input子系统(一)--input事件应用程序的读写实现(基于友善之臂4412开发板)

     这节,我们来说下input子系统,什么是input子系统? input子系统就是输入子系统.      输入子系统是 Linux内核用于管理各种输入设备 (键盘,鼠标,遥控杆,书写板等等 )的部分,用户通过输入子系统进行内核,命令行,图形接口之间的交换.输入子系统在内核里实现,因为设备经常要通过特定的硬件接口被访问 (例如串口, ps/2, usb等等 ),这些硬件接口由内核保护和管理.内核给用户导出一套固定的硬件无关的 input API,供用户空间程序使用. 输入子系统分为三块:

ds18b20-关于51单片机的,DS18B20

问题描述 关于51单片机的,DS18B20 这个代码是书上的代码,我有两个问题 1.51单片机已经从DS18B20上获得了温度数据,为什么不直接拿去显示,需要用串口传递 2.comm(buff):将数组里面的温度数据传递到哪里去了? 附上代码: #include #include #define uchar unsigned char #define uint unsigned int sbit ds=P2^2; //温度传感器信号线 sbit dula=P2^6; //数码管段选线 sbit

温度传感器有源电子标签设计浅析

射频识别RFID(Radio Frequency Identification)技术是近年来开始兴起并逐渐走向成熟的一种自动识别技术.该技术以非接触式.存储容量大.识别速度快.距离远.可多卡识别等优点而得到了越来越广泛的应用[1].随着RFID技术成熟与RFID标签成本的下降,逐步呈现一些具有实际应用价值的发展趋势,其中之一是RFID与温度传感器相结合[2].目前在矿井生产安全监测监控系统中,普遍是用电缆线传输采集到的温度值,而电缆线很容易被拉脱.拉断.擦破,从而引起电火花触发瓦斯而引发矿难.把

zigbee 温度-基于Zigbee技术 DS18B20芯片的程序

问题描述 基于Zigbee技术 DS18B20芯片的程序 基于上述芯片,读取芯片内温度传感器的数值,将外部温度和内部温度显示出来 或者是选一个外接传感器(温度.震动等),将传感器数值通过串口显示在电脑屏幕上 解决方案 网上有好多的啊,你可以自己去百度的

小米随身wifi驱动安装失败解决方法

  小米随身wifi支持windows xp, windows vista 32/64位,windows 7 32/64位 ,windows 8 32/64位usb 2.0接口;符合ieee 802.11n协议,兼容ieee 802.11g和ieee 802.11b标准; 下面,我们就来看看小米随身wifi驱动无法安装的解决方法. 米随身wifi驱动安装失败解决方法: 1.下载最新版本的小米随身wifi驱动,重新安装后,换个usb口重新连接小米随身wifi可以了. 2.安装时,用系统默认的就路径