[Lanqiaoカップ組み込み拡張ボード] —温度および湿度センサーDHT11の詳細な説明(プログラムソースコードが添付されています)

1.温度および湿度センサー

ここに画像の説明を挿入 ————————————ここに画像の説明を挿入

一般的なアプリケーションでは、ピン1はVDDに接続され、ピン4はGNDに接続され、ピン2はデフォルトで通信ピンとして使用されます。

2.通信プロセス:シリアル通信

  1. MCUからコマンドを受信するか、ポートを介してデータをMCUに送信します。データを送信する場合、完全なデータには40ビットが含まれ、センサーはより高いデータビットを最初に送信します(センサーはより高いデータビットを最初に送信します)。
  2. データ形式(左から右に送信)

ここに画像の説明を挿入

  1. チェックフォーマット
    合計結果の下位8ビットを
    ![ここに画像の説明を挿入](https://img-blog.csdnimg.cn/20210226150306617.png)
    正しく取得し
    ここに画像の説明を挿入
    ます。チェックTrueエラーを返します。チェック:Faultを返します。
    ここに画像の説明を挿入

3、通信シーケンス図

1.全体的なタイミング図のプレビューprocess = image / watermark、type_ZmFuZ3poZW5naGVpdGk、shadow_10、text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1Njg5Nzkw、size_16、color_FFFFFF、t_70)

2.MCUは開始信号をDHTに送信します

データシングルバスのアイドル状態は高電圧レベルです。シングルチップマイクロコンピュータがシングルチップマイクロコンピュータと通信すると、DHT11が起動し、シングルチップマイクロコンピュータのプログラムがデータシングルバスの電圧レベルを高から低に変更します。このプロセスでは、DHTを確保するために少なくとも18msが必要です。シングルチップマイクロコンピュータの信号を検出し、シングルチップマイクロコンピュータが電圧をプルアップして20〜40usのDHT応答を待ちます

ここに画像の説明を挿入

3.DHTはMCUに応答します

DHTは開始信号を検出した後、80usの低電圧応答信号を送信します。次に、DHTプログラムは、DHTがデータを送信する準備として、データシングルバス電圧を低から高、80usに設定します。
データシングルバスが低電圧レベルの場合、DHTが応答信号を送信していることを意味します。DHTが応答信号を送信すると、DHTは電圧を引き上げ、80usを維持してデータ送信の準備をします。
DHTがマイクロコントローラーにデータを送信するとき、データの各ビットは50usの低電圧レベルから始まり、後続の高電圧レベル信号の長さがデータビットが0か1かを決定します。(以下の図4および図5を参照)。
ここに画像の説明を挿入
ここに画像の説明を挿入

第四に、手順

ここに画像の説明を挿入
DHT11電源は3〜5.5VDCです。センサーに電力を供給するときは、不安定な状態を通過させるために1秒以内にセンサーにコマンドを送信しないでください。電源フィルタリングのために、VDDとGNDの間に100nFのコンデンサを追加できます。

1、Mode_Out(uint8_tシグナル)

//MCU 控制 PA7输出 “0” 或 “1”
void Mode_Out(uint8_t signal)
{
    
     
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	if(!signal)
	{
    
    
		GPIO_ResetBits(GPIOA, GPIO_Pin_7);
	}
	else 
	{
    
    	
		GPIO_SetBits(GPIOA, GPIO_Pin_7);
	}
}

2、void Mode_In(void)

//控制MCU接收数据
void Mode_In(void)
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

3、void DHT11_Init(void)

void DHT11_Init(void)
{
    
    
	Mode_Out(1);	//开始之前  先拉高信号线		
}

4、uint8_t Receive_Data(void)

//接收 1 Byte 数据
uint8_t Receive_Data(void)
{
    
    
	u8 i,temp=0,j=220;
	for(i=0;i<8;i++)
	{
    
    
		while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));//50us低电平结束
		
		Delay_us(40);
		
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))//为高时
		{
    
    
			temp=(temp<<1)|1;
			while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)&&(j--));	
		}	
		else
		{
    
    
			temp=(temp<<1)|0;
		}
	}
	return temp;
}

5、uint8_t Ready_DHT11(void)


uint8_t Ready_DHT11(void)
{
    
    
	DHT11_Init();
	
	Mode_Out(0);Delay_us(18000);//18ms
	Mode_Out(1);Delay_us(30);//30us
	
	Mode_In();//输入模式
	if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)) //判断从机的低电平相应
	{
    
    
		while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));//从机发出的80us低电平相应信号结束
		while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));//从机发出的80us高电平信号结束
		
		Humidity_H = Receive_Data(); //接收高8位湿度数据
		Humidity_L = Receive_Data(); //接收低8位湿度数据
		
		Temperature_H = Receive_Data(); //接收高8位温度数据
		Temperature_L = Receive_Data();	//接收低8位温度数据
		
		Check_Out = Receive_Data();	//接收校验位	
	}
	if(((Humidity_H+Humidity_L+Temperature_H+Temperature_L)&(0xFF))==Check_Out) //校验
	{
    
    
		return 1;		
	}
	else
	{
    
    
		return 0;
	}
			
}

6.使用される遅延

void Delay_us(u32 nTime)
{
    
    
	SysTick_Config(SystemCoreClock/1000000);
	DelayTiming = nTime;
	while(DelayTiming != 0);
}
void SysTick_Handler(void)
{
    
    
	if(DelayTiming != 0){
    
    
		DelayTiming--;
	}
}

7、メイン

#include "stm32f10x.h"
#include "bsp_seg.h"
#include "lcd.h"
#include "bsp_dht11.h"
#include <stdio.h>
u32 DelayTiming = 0;

void Delay_Ms(u32 nTime)
{
    
    
	DelayTiming = nTime;

	while(DelayTiming != 0);
}
char txt[20];
int main(void)
{
    
    
	SysTick_Config(SystemCoreClock/1000000);
	
	STM3210B_LCD_Init();
	LCD_Clear(White);
	STM3210B_LCD_Init();
	SEG_GPIO_Config();

	LCD_SetTextColor(White);
	LCD_SetBackColor(Blue);

	LCD_ClearLine(Line0);
	LCD_ClearLine(Line1);
	LCD_ClearLine(Line2);
	LCD_ClearLine(Line3);
	LCD_ClearLine(Line4);
	
	LCD_DisplayStringLine(Line1,(u8*)"    SDHT11  DEMO     ");
	LCD_SetTextColor(Blue);
	LCD_SetBackColor(White);

	while(1)
	{
    
    
			if(1==Ready_DHT11())
			{
    
    
				sprintf(txt,  "Moisture:%2d%%",Humidity_H);
				LCD_DisplayStringLine(Line6,txt);
				sprintf(txt,  "Temperature:%2d",Temperature_H);
				LCD_DisplayStringLine(Line8,txt);
				SEG_Display(Temperature_H/10,Temperature_H%10,12);								
			} 
			Delay_us(1000000);//延时1s
	}
}

表示、対応する温度と湿度の整数部分を読み取るだけ

おすすめ

転載: blog.csdn.net/qq_45689790/article/details/114129398