蓝桥杯嵌入式国赛 ---- DS18B20温度传感器

本文详细介绍了基于STM32F103RBT6的CT117E开发板上,如何使用DS18B20温度传感器进行温度测量。首先,从原理图中解析出DS18B20与PA6端口的连接,然后提供DS18B20的初始化函数和相关IO操作。接着,展示了DS18B20的复位和数据传输过程,包括读写位操作。最后,给出了在主函数中调用DS18B20读取温度并显示的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文是基于嵌入式开发板CT117E,stm32f103RBT6。

一、原理图

在这里插入图片描述

二、由原理图得到的信息

  • 一个端口TDQ。
  • 与PA6连接。

三、DS18B20初始化

ds18b20.c


#include "stm32f10x.h"
#include "ds18b20.h"

#define delay_us(X)  delay((X)*72/5)

void delay(unsigned int n)
{
	while(n--);
}

void ds18b20_init_x(void)
{
  	GPIO_InitTypeDef GPIO_InitStructure;
  	/* Enable  clock */
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  , ENABLE);
  
  	/* Configure Ports */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//
void mode_input1(void )
{
  	GPIO_InitTypeDef GPIO_InitStructure;

  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void mode_output1(void )
{
  	GPIO_InitTypeDef GPIO_InitStructure;

  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//
uint8_t ow_reset(void)
{ 
	uint8_t err;

   	OW_DIR_OUT(); // pull OW-Pin low for 480us
   	OW_OUT_LOW(); // disable internal pull-up (maybe on from parasite)

   	delay_us(400);	  //about 480us
   
   	// set Pin as input - wait for clients to pull low
   	OW_DIR_IN(); // input

   	delay_us(66);
   	err = OW_GET_IN();		// no presence detect
   	// nobody pulled to low, still high


   	// after a delay the clients should release the line
  	// and input-pin gets back to high due to pull-up-resistor
   	delay_us(480-66);
   	if( OW_GET_IN() == 0 )		// short circuit
      err = 1;

   	return err;
 }

uint8_t ow_bit_io( uint8_t b )
{ 
 	OW_DIR_OUT(); // drive bus low
 	OW_OUT_LOW();	
 	delay_us(1); // Recovery-Time wuffwuff was 1

 	if ( b ) OW_DIR_IN(); // if bit is 1 set bus high (by ext. pull-up)
	
#define  OW_CONF_DELAYOFFSET  5
 	delay_us(15-1-OW_CONF_DELAYOFFSET);
      
 	if( OW_GET_IN() == 0 ) b = 0;  // sample at end of read-timeslot
	
 	delay_us(60-15);
 	OW_DIR_IN();

 	return b;
}

uint8_t ow_byte_wr( uint8_t b )
{ 	
	uint8_t i = 8, j;
   	do 
    { 
		j = ow_bit_io( b & 1 );
      	b >>= 1;
      	if( j ) b |= 0x80;
    } 
   	while( --i );
   	return b;
}

//
uint8_t ow_byte_rd( void )
{
   	return ow_byte_wr( 0xFF ); 
}
float ds18b20_read(void)  
{
	u8 i;
	s16 x;
	u8 val[2];
	u8 s;
	float temp;
	

	ow_reset();
	ow_byte_wr(OW_SKIP_ROM);
	ow_byte_wr(DS18B20_CONVERT);
	delay_us(750000);

	ow_reset();
	ow_byte_wr(OW_SKIP_ROM);
	ow_byte_wr(DS18B20_READ);

	for(i=0;i<2;i++)
	{
		val[i]=ow_byte_rd();
	}

	if(val[1]>7)    //零下温度处理
	{
		val[0]=~val[0];
		val[1]=~val[1];
		s=1;
	}
	else
	{
		s=0;
	}

	x=val[1];
	x=x<<8;
	x=x | val[0];
	//x=x&0x7ff;
	temp=(float)x/16.0;   

	if(s)
	{
		return -temp;
	}
	else
	{
		return temp;
	}


}


ds18b20.h

#ifndef __DS18B20_H
#define __DS18B20_H

#include "stm32f10x.h"

#define OW_DIR_OUT() 	mode_output1()
#define OW_DIR_IN() 	mode_input1()
#define OW_OUT_LOW() 	(GPIO_ResetBits(GPIOA,GPIO_Pin_6))
#define OW_GET_IN()  	(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6))

#define OW_SKIP_ROM 		0xCC
#define DS18B20_CONVERT 	0x44
#define DS18B20_READ 		0xBE


void ds18b20_init_x(void);
float ds18b20_read(void);

#endif


四、ds18b20在主函数的应用方法

while(1)
{
	        temp = ds18b20_read();
			sprintf((char *)buff,"wendu: %2.2f     ",temp);
			LCD_DisplayStringLine(Line5,buff);
			Delay_Ms(200);
}
### DS18B20蓝桥杯中的使用教程及相关资料 #### 关于DS18B20的简介 DS18B20是一种数字化温度传感器,具有高精度和易用性的特点。它支持单总线通信协议,能够实现多设备共用一条数据线进行通信[^1]。 #### 蓝桥杯DS18B20的应用实例 在蓝桥杯嵌入式中,参者通常会利用官方提供的扩展板来操作DS18B20温度传感器。具体来说,可以通过单片机控制DS18B20完成温度采集功能。例如,在实际项目中,可以编写程序使单片机通过单总线与DS18B20交互,从而获取当前环境温度并显示出来[^2]。 #### 唯一ID特性和多器件连接方式 值得注意的是,每一个DS18B20都拥有独一无二的64位ROM ID号。这一特性允许在同一根总线上挂接多个DS18B20模块而不发生冲突。当需要访问特定的一个或者几个传感器时,可通过执行ROM搜索命令找到目标设备后再读取其对应的温度数值[^3]。 #### 单总线通讯机制概述 为了正确地同DS18B20交换信息,必须遵循严格的时序规定。其中包含了两种基本的操作单元:“写入时隙”用于向传感器发送指令或参数;而“读取时隙”则负责接收来自传感器的数据反馈。每次传输仅限传递单一比特的信息量,并且所有的这些活动都是基于同一根物理导线即所谓的‘单总线’之上完成的[^4]。 以下是简单的初始化函数以及读取温度值的例子: ```c #include <stdio.h> #define ONE_WIRE_PIN P1_7 //定义单总线端口 void delay_us(unsigned int us); unsigned char reset_bus(void); void write_bit(unsigned char bit_value); unsigned char read_bit(); void start_convertion(); // 初始化单总线 unsigned char reset_bus() { unsigned char presence_pulse; ONE_WIRE_PIN = 0; //拉低总线至少480us触发复位序列 delay_us(500); ONE_WIRE_PIN = 1; //释放总线等待从机响应存在脉冲信号 delay_us(60); presence_pulse = !ONE_WIRE_PIN;//检测是否存在脉冲表示有无设备应答 delay_us(420); //延长时间让总线稳定下来准备下一步动作 return presence_pulse; } int main(){ float temperatureCelsius; if(reset_bus()){ printf("Device detected\n"); // 发送跳过ROM命令 (针对只有一个DS18B20的情况) write_byte(0xCC); // 启动转换命令 start_convertion(); // ...继续处理其他逻辑直到获得最终结果... printf("Temperature is %.2f C",temperatureCelsius); } } ``` 以上代码片段展示了如何设置单总线接口并与之互动的基础框架结构。然而这只是一个非常基础版本的实际应用可能还需要考虑更多细节比如错误校验等功能增强稳定性等等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值