蓝桥杯——扩展板DS18B20和DHT11

一、DS18B20

直接讲解这个板子上的使用方法(BS18B20以下简称BS):

 DS的温度数据为16位两个字节(字节0,字节1),高四位(SSSS)表示的是温度正负(0正1负),低四位是小数部分。其余是整数。读取的时候是一串16位数据,要获得小数部分就需要除16.0.

DS的存储图:

那如何与DS通讯呢?DS有自己的一套通讯流程和控制指令,下面讲解一下通讯流程和这里用到的指令:

 也就是分为下面三步,一定不要少步骤:

1.初始化

2.ROM控制指令

3.DS的功能指令

初始化的时序逻辑:

 看看就行,赛点给了驱动,下面讲的DHT11没有,那就得自己写了

ROM指令

下面是DS的ROM指令:

  • Read ROM [33h]:

    • 指令:0x33
    • 功能: 主机发送此指令后,DS18B20将其唯一的64位ROM码(8字节)返回给主机。用于标识唯一的DS18B20传感器。
  • Match ROM [55h]:

    • 指令:0x55
    • 功能: 主机通过发送0x55指令,然后传递64位的ROM码,与总线上的DS18B20传感器进行匹配。只有匹配的传感器才会响应后续的指令。
  • Search ROM [F0h]:

    • 指令:0xF0
    • 功能: 主机通过发送0xF0指令,可以在总线上搜索连接的所有DS18B20传感器的ROM码。用于在多个传感器连接到同一总线时识别每个传感器。
  • Skip ROM [CCh]:

    • 指令:0xCC
    • 功能: 主机通过发送0xCC指令,可以跳过对单个传感器的ROM码的匹配,直接与总线上的所有DS18B20通信。适用于只连接一个DS18B20传感器的情况。
  • Alarm Search [ECh]:

    • 指令:0xECh
    • 功能: 主机发送此指令后,DS18B20会在总线上搜索具有温度报警状态的传感器。用于检索出发生温度报警的传感器。
  • Resume [ACh]:

    • 指令:0xACh
    • 功能: 主机发送此指令后,DS18B20从温度转换暂停状态恢复到正常工作状态。用于取消暂停状态。
  • Recall E2 [B8h]:

    • 指令:0xB8h
    • 功能: 主机发送此指令后,DS18B20将从其内部的EEPROM中恢复出厂默认设置,包括温度报警的上下限值和分辨率等设置。
  • Read Power Supply [B4h]:

    • 指令:0xB4h
    • 功能: 主机发送此指令后,DS18B20返回其供电方式的信息。用于检测DS18B20的供电状态,如使用外部电源还是从总线中提取电能。
  • Convert T [44h]:

    • 指令:0x44
    • 功能: 主机发送此指令后,DS18B20启动温度转换。用于触发DS18B20进行温度测量。
  • Write Scratchpad [4Eh]:

    • 指令:0x4E
    • 功能: 主机发送此指令后,DS18B20启动对Scratchpad的写入操作。在此之后,主机可以通过发送写入数据指令来写入Scratchpad中的配置信息,如温度阈值等。
  • Read Scratchpad [BEh]:

    • 指令:0xBE
    • 功能: 主机发送此指令后,DS18B20返回其Scratchpad中的数据,包括温度值等信息。用于读取DS18B20的当前状态和测量结果。

 功能指令:

  1. Convert T (温度转换):

    • 指令:0x44
    • 解释: 主机发送此指令后,DS18B20启动温度转换。DS18B20将开始测量温度并将结果存储在其内部的Scratchpad寄存器中。
  2. Read Scratchpad (读取Scratchpad):

    • 指令:0xBE
    • 解释: 主机发送此指令后,DS18B20将其Scratchpad中的数据传输给主机。这包括温度数据以及相关配置信息。
  3. Write Scratchpad (写入Scratchpad):

    • 指令:0x4E
    • 解释: 主机发送此指令后,DS18B20将准备好接收来自主机的3个字节的数据,用于写入Scratchpad的字节2、3和4中(即TH、TL和配置寄存器)。
  4. Copy Scratchpad (复制Scratchpad):

    • 指令:0x48
    • 解释: 主机发送此指令后,DS18B20将其Scratchpad中的TH、TL和配置寄存器的数据复制到EEPROM中,以便长期存储。
  5. Recall E2 (回忆E2):

    • 指令:0xB8
    • 解释: 主机发送此指令后,DS18B20从其内部的EEPROM中检索出TH、TL和配置寄存器的数据,并将其复制到Scratchpad中。
  6. Read Power Supply (读取供电状态):

    • 指令:0xB4
    • 解释: 主机发送此指令后,DS18B20将其供电方式的信息传输给主机。这用于指示DS18B20是通过外部电源还是通过总线供电。

代码:

uint16_t ds18b20_read()
{
	uint8_t low_temp, high_temp;
	ow_reset();            //步骤一,初始化
	ow_byte_wr(0xCC);      //步骤二,ROM指令
	ow_byte_wr(0x44);      //步骤三,功能控制指令
	delay_us(750000);
	ow_reset();
	ow_byte_wr(0xCC);
	ow_byte_wr(0xBE);
	low_temp = ow_byte_rd();//读取
	high_temp = ow_byte_rd();
	return ((high_temp<<8)|low_temp);//合成结果
}

为什么延时750ms呢?如下

 12位分辨率最大转换时间为750ms。

二、DHT11

这个传感器就要靠我们自己来写了,也不难。

MCU和DHT11传感器之间的通信协议采用单总线数据格式。每个通信过程大约需要4毫秒。数据由整数部分和小数部分组成。完整的数据传输为40位,传感器先发送高位数据位。数据格式为:8位整数RH(湿度)数据 + 8位小数RH数据 + 8位整数T(温度)数据 + 8位小数T数据 + 8位校验和。如果数据传输正确,则校验和应该是“8位整数RH数据 + 8位小数RH数据 + 8位整数T数据 + 8位小数T数据”的最后8位。

MCU的起始信号与DHT11的应答

数据单母线自由状态处于高压电平。当单片机与DHT11的通信开始时,单片机程序将数据单总线电压水平从高到低,该过程必须至少需要18 ms以确保DHT检测单片机的信号,然后单片机将提高电压,等待20-40我们DHT的响应。

一旦DHT检测到启动信号,它将发出一个持续80us的低压电平响应信号。然后DHT程序将数据单总线电压水平从低到高,并保持80us,为DHT发送数据做准备。当DHT向单片机发送数据时,每一位数据都以50us低压电平开始,以下高压电平信号的长度决定了数据位是“0”还是“1” 

所以在开始通讯前要先进行上面这样一个MCU发出起始信号,DHT11给出回应:

代码如下:

#include "main.h"

#define	DHT11_PIN_PORT       GPIOA
#define	DHT11_PIN        GPIO_PIN_7
#define	DHT11_PIN_CLOCK  __HAL_RCC_GPIOA_CLK_ENABLE()
#define	DHT11_PIN_OUT_H   HAL_GPIO_WritePin(DHT11_PIN_PORT, DHT11_PIN, GPIO_PIN_SET)
#define	DHT11_PIN_OUT_L   HAL_GPIO_WritePin(DHT11_PIN_PORT, DHT11_PIN, GPIO_PIN_RESET)
#define	DHT11_PIN_IN      HAL_GPIO_ReadPin(DHT11_PIN_PORT, DHT11_PIN)
extern float DH_Humi;
extern float DH_Temp;
void DHT11_GetValue(void);
void DHT11_Start()
{
	DHT11_OUT();//PA7对外输出
	DHT11_PIN_OUT_L;//拉低电平
	HAL_Delay(20);//按照通讯协议等20us
	DHT11_PIN_OUT_H;//拉高
	DelayDH_us(60);//等20~40,可以多等一会
}

uint8_t DHT11_Cheak()
{
	DHT11_IN();//PA7输入
	uint8_t tim;
	while(DHT11_PIN_IN&&tim<100)//按照通讯协议DHT11这里会先拉低,在这里等待拉低
	{
	tim++;	
		DelayDH_us(1);
	}
	if(tim>=100) return 0;//超时返回0代表未联系上DHT11
	tim=0;
	while(!DHT11_PIN_IN&&tim<100)//等DHT11拉高
	{
	tim++;	
		DelayDH_us(1);
	}
	if(tim>=100) return 0;//超时
	return 1;//联系成功,这之后DHT11会发送数据
}

数据的时序

数据0的时序

 数据1的时序

从上面可以看出来DHT11区别0/1是根据拉低50us后再拉高后高电平的持续时间。 

那我们就可以等大于30us的(可以更多)如果是低电平那就是0否则是1.

uint8_t DHT11_Read_Bit(void)
{
    uint8_t re = 0;
    while(DHT11_PIN_IN && re < 110) //等待变为低电平
    {
        re++;
        DelayDH_us(1);
    }
    re = 0;
    while(!DHT11_PIN_IN && re < 110) //等待变高电平
    {
        re++;
        DelayDH_us(1);
    }
    DelayDH_us(60);//等待60us
    if(DHT11_PIN_IN)return 1;
    else return 0;
}

之后就可以调用这个函数读取一个字节:

//从DHT11读取一个字节
uint8_t DHT11_Read_Byte(void)
{
    uint8_t i, dat;
    dat = 0;
    for (i = 0; i < 8; i++)
    {
        dat <<= 1;
        dat |= DHT11_Read_Bit();
    }
    return dat;
}

再封装一下,DHT11读取数据函数:

  uint8_t buf[5];
uint8_t DHT11_Read_Data(float *temp, float *humi)
{
  
    uint8_t i;
    DHT11_Start();
    if(DHT11_Cheak() == 1)
    {
        for(i = 0; i < 5; i++)
        {
            buf[i] = DHT11_Read_Byte();
        }
        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
        {
            *humi = buf[0]+buf[1]/8.0;
            *temp = buf[2]+buf[3]/8.0;
        }
    }
    else return 0;
    return 1;
}

 温湿度的变量我设置为了全局,方便调试

void DHT11_GetValue()
{
	DHT11_Read_Data(&DH_Temp,&DH_Humi);
}

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: DS18B20DHT11和LCD1602是一些常见的电子元件设备。 DS18B20是一种数字温度传感器,可以通过一根数据线进行通信。它具有高精度和稳定的特点,可以广泛应用于室内温度检测、气象站等领域。 DHT11是一种数字湿度温度传感器,可以同时测量环境的湿度和温度。它采用单总线通信协议,具有较高的湿温测量精度和稳定性。常用于室内温湿度监测、智能家居等场景。 LCD1602是一种常用的字符型液晶显示器,具有16列和2行的显示区域。它可以显示数字、字符和自定义图案,通过与单片机进行通信,实现信息的显示和交互。常用于温度、湿度、时间等数据的实时显示。 以上三个元件都以数字信号进行通信,可以方便地与单片机或其他数字设备进行连接。它们在电子制作和嵌入式系统中有着广泛的应用,如环境监测、智能家居、无人机等领域。同时,这些元件的价格较低,易于购买和使用,方便了创客和学习者进行电子实验和项目开发。 ### 回答2: DS18B20是一种数字温度传感器,具有高精度和快速响应的特点。它能够通过单总线接口与微控制器通信,并提供当前环境温度的数值。DS18B20采用测量电阻值与环境温度之间的线性关系来计算温度。 DHT11也是一种数字温湿度传感器,它可以同时测量环境的温度和湿度。DHT11采用特殊的数字信号输出方式,通过一种单总线接口与微控制器通信。DHT11具有低成本和简单的使用特点,适用于家居自动化和气象站等应用。 LCD1602是一种16x2字符液晶屏,它具有16个字符宽度和2行显示内容的能力。LCD1602可以通过并行接口与微控制器连接,可以显示各种字符和图形。LCD1602通常用于显示传感器数据、系统状态和菜单选项等应用。 综合上述三者的特性,我们可以使用DS18B20DHT11传感器来获取环境的温度和湿度数据,然后将这些数据通过微控制器处理后,利用LCD1602显示屏来显示出来。这样,我们就可以实时地监测环境的温湿度情况,并通过LCD1602显示屏直观地展示给用户。这种组合可以应用于各种需要温湿度数据显示的场景,例如室内温湿度监测、温室自动化控制等。 ### 回答3: DS18B20DHT11和LCD1602是智能家居领域中常用的传感器和显示模块。 DS18B20是一种数字温度传感器,具有高精度、数字信号输出、单线制接口等特点。它能够测量环境温度,并将温度值以数字形式输出给控制器或主控设备,常用于温度检测及温度控制领域。 DHT11是一款测量环境温度和湿度的传感器,通过数字化的方式将温湿度值输出给外部设备。它具有低功耗、简单的串口输出、较高的精度等特点,广泛应用于室内环境监测、气象站、农业等领域。 LCD1602是一种常见的字符型液晶显示模块,能够显示2行16个字符。通过控制模块,可将需要显示的文字、数字等内容展示在液晶屏上,具有显示内容清晰、接口简单易用的特点。它常用于智能家居系统中的控制面、信息展示等功能。 综合来看,DS18B20DHT11和LCD1602可以协同工作,实现智能家居中的温度、湿度检测和显示功能。比如,在一个智能温控系统中,DS18B20DHT11可以分别用于检测室内温度和湿度,并将检测结果传输给控制器。控制器通过对温度和湿度数据的处理,判断是否需要调整室内温度。同时,将温度和湿度数据显示在LCD1602上,使用户能够直观地了解室内环境情况。这样,用户就可以根据LCD1602上的显示信息,采取相应的措施,如开启空调等,实现智能化的温控管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满城烟雨DLRY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值