主頁 >  其他 > STM32F103+DHT11模塊+DS18B20模塊 顯示實時溫濕度并高溫高濕報警

STM32F103+DHT11模塊+DS18B20模塊 顯示實時溫濕度并高溫高濕報警

2021-04-27 12:25:51 其他

目錄

  • 前言
    • 代碼下載:
    • 功能介紹:
  • 接線
    • DS18B20
    • DHT11
  • 效果圖
    • 普通環境
      • 普通版main.c
      • 升級版
    • 哈熱氣
      • 普通版
      • 升級版
    • 搓手捂熱
  • 核心代碼
    • 普通版main.c
    • 升級版main.c
    • bsp_dht11.h
    • bsp_dht11.c
    • ds18b20.h
    • ds18b20.c
  • 參考用圖
    • DHT11
    • DS18B20

前言

參考資料:
YL-47 DHT11 使用說明–.pdf
DHT11說明書最新版–.pdf
DHT11模塊–.pdf
DHT11模塊使用說明書
DS18B20.pdf
ds18b20中文資料詳解
原始碼參考:
野火dht11溫濕度傳感器測驗實驗
正點原子TFTLCD顯示實驗
正點原子18B20數字溫度傳感器實驗
正點原子按鍵實驗
正點原子蜂鳴器實驗
開發板:正點原子 STM32F103 精英版
語言:C語言
開發環境:Keil5
開發板使用了 LED KEY BEEP TFTLCD USART DHT11模塊 DS18B20模塊

代碼下載:

碼云 GitHub

功能介紹:

1、LED0約2秒一閃,表示程式運行中,
2、LCD和串口顯示實時的溫濕度,2秒一回圈,上面一個temp是DS18B20,下面的是DHT11,%RH 相對濕度, CEL 攝氏度(ps:不接入DS18B20的話會回圈等待)
3、按鍵都會翻轉LED1,KEY1 開啟報警模式,KEY0關閉報警模式,(按鍵10ms一巡檢)
4、報警模式下:當溫度不低于85攝氏度或者濕度不低于90%RH,蜂鳴器報警,可以通過按下KEY0關閉報警模式,(報警串口會有列印,LCD也會有提示)

接線

DS18B20

VCC -》 3.3V
DQ -》 PG11
GND -》 GND

DHT11

VCC -》 3.3V
DATA -》 PB10
GND -》 GND

效果圖

普通環境

普通版main.c

升級版


哈熱氣

普通版

我這哈了3下

然后持續手扇風

ok,溫濕度降下來了,

升級版

搓手捂熱

手有汗,濕度也上來了
(下圖是舊的,僅供參考)


最后本來應該整個打火機的,可惜沒有,夾咯吱窩下(僅DHT11 舊圖)

最后來個鼻息

核心代碼

普通版main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "bsp_dht11.h"
#include "ds18b20.h"

DHT11_Data_TypeDef DHT11_Data;

/*
	DS18B20
	供電電壓:3 - 5.5V
	接線:DQ -》 PG11 (IO口)
	
	DHT11
	供電電壓:3.3 - 5V
	接線:DATA -》 PB10 (IO口)
*/

int main(void)
{
	u8 str[100] = {0};
	// DS18B20用變數
	short temperature;
	delay_init();	    	 //延時函式初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //設定NVIC中斷分組2:2位搶占優先級,2位回應優先級
	uart_init(115200);	 	//串口初始化為115200
 	LED_Init();			     //LED埠初始化
	LCD_Init();				 // LCD初始化
	DHT11_GPIO_Config();     // 初始化DTT11的引腳 DATA -> PB10
	LED0 = 0;
	POINT_COLOR = WHITE;
	BACK_COLOR = BLACK;
	LCD_Clear(BLACK); 
	while(DS18B20_Init())	//DS18B20初始化	
	{
		LCD_ShowString(10,70,200,16,16,"DS18B20 Error");
		delay_ms(200);
		LCD_Fill(10,70,239,130+16,WHITE);
 		delay_ms(200);
	}
	LCD_ShowString(10,90,200,16,16,"Temp:   . CEL"); 
  	while(1) 
	{
		POINT_COLOR = WHITE;
		
		// DS18B20
		temperature = DS18B20_Get_Temp();	
		if(temperature < 0)
		{
			LCD_ShowChar(10+40, 90, '-', 16, 0);			//顯示負號
			temperature = -temperature;					    //轉為正數
		}else LCD_ShowChar(10+40,90,' ', 16, 0);			//去掉負號
		LCD_ShowNum(10+40+8, 90, temperature/10, 2, 16);	//顯示正數部分	    
		LCD_ShowNum(10+40+32, 90,temperature%10, 1, 16);	//顯示小數部分
		printf("溫度為 %u.%u℃ \r\n",temperature/10, temperature%10);
		
		// DHT11
		// 呼叫Read_DHT11讀取溫濕度,若成功則輸出該資訊
		if( Read_DHT11(&DHT11_Data) == SUCCESS)
		{
			printf("濕度為%d.%d %RH ,溫度為 %d.%d℃ \r\n", DHT11_Data.humi_int, DHT11_Data.humi_deci, DHT11_Data.temp_int, DHT11_Data.temp_deci);
			sprintf((char*)str, "HUM: %d.%d%%RH  ", DHT11_Data.humi_int, DHT11_Data.humi_deci);
			LCD_ShowString(10,130,200,24,24, str);
			sprintf((char*)str, "TEMP: %d.%dCEL ", DHT11_Data.temp_int, DHT11_Data.temp_deci);
			LCD_ShowString(10,170,200,24,24, str);
			//printf("\r\n 濕度:%d,溫度:%d \r\n" ,DHT11_Data.humi_int,DHT11_Data.temp_int);
		}
		else
		{
			printf("Read DHT11 ERROR!\r\n");
		}
		LED0 = !LED0;
		// 采樣周期不得低于1秒,否則會讀取失敗
		delay_ms(1000);
		delay_ms(1000);
	} 
}
 

升級版main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "bsp_dht11.h"
#include "ds18b20.h"
#include "key.h"
#include "beep.h"

DHT11_Data_TypeDef DHT11_Data;

/*
	DS18B20
	供電電壓:3 - 5.5V
	接線:DQ -》 PG11 (IO口)
	
	DHT11
	供電電壓:3.3 - 5V
	接線:DATA -》 PB10 (IO口)
*/

int main(void)
{
	u8 str[100] = {0};
	// 蜂鳴器報警標志位
	u8 flag = 0;
	// 報警模式
	u8 mode = 0;
	vu8 key = 0;
	// 回圈計數
	u8 time = 0;
	// DS18B20用變數
	short temperature;
	delay_init();	    	 //延時函式初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //設定NVIC中斷分組2:2位搶占優先級,2位回應優先級
	uart_init(115200);	 	 //串口初始化為115200
 	LED_Init();			     //LED埠初始化
	LCD_Init();				 // LCD初始化
	KEY_Init();				 // KEY初始化
	BEEP_Init();			 // BEEP初始化
	DHT11_GPIO_Config();     // 初始化DTT11的引腳 DATA -> PB10
	LED0 = 0;
	LED1 = 0;
	POINT_COLOR = WHITE;
	BACK_COLOR = BLACK;
	LCD_Clear(BLACK); 
	while(DS18B20_Init())	//DS18B20初始化	
	{
		LCD_ShowString(10,70,200,16,16,"DS18B20 Error");
		delay_ms(200);
		LCD_Fill(10,70,239,130+16, BLACK);
 		delay_ms(200);
	}
	LCD_ShowString(10,90,200,16,16,"Temp:   . CEL"); 
	LCD_ShowString(10,220,220,12,12,"TOUCH KEY0 CLOSE ALARM MODE"); 
	LCD_ShowString(10,240,220,12,12,"TOUCH KEY1 OPEN ALARM MODE"); 
	POINT_COLOR = RED;
	LCD_ShowString(10,260,100,12,12,"ALARM MODE: OFF"); 
	POINT_COLOR = WHITE;
  	while(1) 
	{
		flag = 2;
		POINT_COLOR = WHITE;
		
		key = KEY_Scan(0); //得到鍵值
		if (key)
		{
			switch (key)
			{
				case WKUP_PRES: 
					LED1 = !LED1;
					break;
				// KEY1 按下 開啟報警模式
				case KEY1_PRES: 
					mode = 1;
					LED1 = !LED1;
					LCD_ShowString(80,260,100,12,12,"ON  "); 
					printf("開啟報警模式\r\n");
					break;
				// KEY1 按下 關閉報警模式
				case KEY0_PRES: 
					mode = 0;
					LED1 = !LED1;
					LCD_ShowString(80,260,100,12,12,"OFF "); 
					printf("關閉報警模式\r\n");
					break;
			}
		}
		
		// 約2秒一次
		if(time % 200 == 0)
		{
			// DS18B20
			temperature = DS18B20_Get_Temp();	
			if(temperature < 0)
			{
				LCD_ShowChar(10+40, 90, '-', 16, 0);			//顯示負號
				temperature = -temperature;					    //轉為正數
			}else LCD_ShowChar(10+40,90,' ', 16, 0);			//去掉負號
			LCD_ShowNum(10+40+8, 90, temperature/10, 2, 16);	//顯示正數部分	    
			LCD_ShowNum(10+40+32, 90,temperature%10, 1, 16);	//顯示小數部分
			printf("溫度為 %u.%u℃ \r\n",temperature/10, temperature%10);
			
			// DHT11
			// 呼叫Read_DHT11讀取溫濕度,若成功則輸出該資訊 采樣周期不得低于1秒,否則會讀取失敗
			if( Read_DHT11(&DHT11_Data) == SUCCESS)
			{
				printf("濕度為%d.%d %RH ,溫度為 %d.%d℃ \r\n", DHT11_Data.humi_int, DHT11_Data.humi_deci, DHT11_Data.temp_int, DHT11_Data.temp_deci);
				sprintf((char*)str, "HUM: %d.%d%%RH  ", DHT11_Data.humi_int, DHT11_Data.humi_deci);
				LCD_ShowString(10,130,200,24,24, str);
				sprintf((char*)str, "TEMP: %d.%dCEL ", DHT11_Data.temp_int, DHT11_Data.temp_deci);
				LCD_ShowString(10,170,200,24,24, str);
				//printf("\r\n 濕度:%d,溫度:%d \r\n" ,DHT11_Data.humi_int,DHT11_Data.temp_int);
			}
			else
			{
				printf("Read DHT11 ERROR!\r\n");
			}
			
			// 判斷溫度是否不低于85攝氏度
			if(temperature >= 850 || DHT11_Data.temp_int >= 85)
			{
				printf("溫度過高!!!\r\n");
				flag++;
			}
			else
			{
				flag--;
			}
			
			// 判斷濕度是否高于90%RH
			if(DHT11_Data.humi_int >= 90)
			{
				printf("濕度過高!!!\r\n");
				flag++;
			}
			else
			{
				flag--;
			}
			
			// 判斷是否需要報警
			if(flag >= 2 && mode == 1)
			{
				LCD_ShowString(10,200,200,16,16,"BEEP!!!(>__<)"); 
				printf("BEEP!!!(>__<)\r\n");
				BEEP = 1;
			}
			
			if(flag < 2)
			{
				LCD_ShowString(10,200,200,16,16,"     (- v -)    "); 
				BEEP = 0;
			}
			
			// 重新置零
			time = 0;
			
			LED0 = !LED0;
		}
		
		if(mode == 0)
		{
			LCD_ShowString(10,200,200,16,16,"     (- v -)    "); 
			BEEP = 0;
		}
		
		time++;
		delay_ms(10);
	} 
}
 

bsp_dht11.h

#ifndef __DHT11_H
#define	__DHT11_H

#include "stm32f10x.h"
#include "delay.h"

#define HIGH  1
#define LOW   0

#define DHT11_CLK     RCC_APB2Periph_GPIOB
#define DHT11_PIN     GPIO_Pin_10                  
#define DHT11_PORT		GPIOB 

//帶參宏,可以像行內函式一樣使用,輸出高電平或低電平
#define DHT11_DATA_OUT(a)	if (a)	\
					GPIO_SetBits(GPIOB,GPIO_Pin_10);\
					else		\
					GPIO_ResetBits(GPIOB,GPIO_Pin_10)
 //讀取引腳的電平
#define  DHT11_DATA_IN()	   GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)

typedef struct
{
	uint8_t  humi_int;		//濕度的整數部分
	uint8_t  humi_deci;	 	//濕度的小數部分
	uint8_t  temp_int;	 	//溫度的整數部分
	uint8_t  temp_deci;	 	//溫度的小數部分
	uint8_t  check_sum;	 	//校驗和
		                 
}DHT11_Data_TypeDef;

void DHT11_GPIO_Config(void);
static void DHT11_Mode_IPU(void);
static void DHT11_Mode_Out_PP(void);
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data);
static uint8_t Read_Byte(void);

#endif /* __DHT11_H */

bsp_dht11.c

#include "bsp_dht11.h"

/*
 * 函式名:DHT11_GPIO_Config
 * 描述  :配置DHT11用到的I/O口
 * 輸入  :無
 * 輸出  :無
 */
void DHT11_GPIO_Config(void)
{		
	/*定義一個GPIO_InitTypeDef型別的結構體*/
	GPIO_InitTypeDef GPIO_InitStructure;

	/*開啟DHT11_PORT的外設時鐘*/
	RCC_APB2PeriphClockCmd(DHT11_CLK, ENABLE); 

	/*選擇要控制的DHT11_PORT引腳*/															   
  	GPIO_InitStructure.GPIO_Pin = DHT11_PIN;	

	/*設定引腳模式為通用推挽輸出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*設定引腳速率為50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*呼叫庫函式,初始化DHT11_PORT*/
  	GPIO_Init(DHT11_PORT, &GPIO_InitStructure);		  

	/* 拉高GPIOB10	*/
	GPIO_SetBits(DHT11_PORT, GPIO_Pin_10);	 
}

/*
 * 函式名:DHT11_Mode_IPU
 * 描述  :使DHT11-DATA引腳變為上拉輸入模式
 * 輸入  :無
 * 輸出  :無
 */
static void DHT11_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;

	  	/*選擇要控制的DHT11_PORT引腳*/	
	  GPIO_InitStructure.GPIO_Pin = DHT11_PIN;

	   /*設定引腳模式為浮空輸入模式*/ 
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; 

	  /*呼叫庫函式,初始化DHT11_PORT*/
	  GPIO_Init(DHT11_PORT, &GPIO_InitStructure);	 
}

/*
 * 函式名:DHT11_Mode_Out_PP
 * 描述  :使DHT11-DATA引腳變為推挽輸出模式
 * 輸入  :無
 * 輸出  :無
 */
static void DHT11_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;

	 	/*選擇要控制的DHT11_PORT引腳*/															   
  	GPIO_InitStructure.GPIO_Pin = DHT11_PIN;	

	/*設定引腳模式為通用推挽輸出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*設定引腳速率為50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	/*呼叫庫函式,初始化DHT11_PORT*/
  	GPIO_Init(DHT11_PORT, &GPIO_InitStructure);	 	 
}

/* 
 * 從DHT11讀取一個位元組,MSB先行
 */
static uint8_t Read_Byte(void)
{
	uint8_t i, temp=0;

	for(i=0;i<8;i++)    
	{	 
		/*每bit以50us低電平標置開始,輪詢直到從機發出 的50us 低電平 結束*/  
		while(DHT11_DATA_IN()==Bit_RESET);

		/*DHT11 以26~28us的高電平表示“0”,以70us高電平表示“1”,
		 *通過檢測 x us后的電平即可區別這兩個狀 ,x 即下面的延時 
		 */
		delay_us(40); //延時x us 這個延時需要大于資料0持續的時間即可	   	  

		if(DHT11_DATA_IN()==Bit_SET)/* x us后仍為高電平表示資料“1” */
		{
			/* 等待資料1的高電平結束 */
			while(DHT11_DATA_IN()==Bit_SET);

			temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,MSB先行 
		}
		else	 // x us后為低電平表示資料“0”
		{			   
			temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
		}
	}
	return temp;
}
/*
 * 一次完整的資料傳輸為40bit,高位先出
 * 8bit 濕度整數 + 8bit 濕度小數 + 8bit 溫度整數 + 8bit 溫度小數 + 8bit 校驗和 
 */
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
{  
	/*輸出模式*/
	DHT11_Mode_Out_PP();
	/*主機拉低*/
	DHT11_DATA_OUT(LOW);
	/*延時18ms*/
	delay_ms(18);

	/*總線拉高 主機延時30us*/
	DHT11_DATA_OUT(HIGH); 

	delay_us(30);   //延時30us

	/*主機設為輸入 判斷從機回應信號*/ 
	DHT11_Mode_IPU();

	/*判斷從機是否有低電平回應信號 如不回應則跳出,回應則向下運行*/   
	if(DHT11_DATA_IN() == Bit_RESET)     
	{
		/*輪詢直到從機發出 的80us 低電平 回應信號結束*/  
		while(DHT11_DATA_IN()==Bit_RESET);

		/*輪詢直到從機發出的 80us 高電平 標置信號結束*/
		while(DHT11_DATA_IN()==Bit_SET);

		/*開始接收資料*/   
		DHT11_Data->humi_int= Read_Byte();

		DHT11_Data->humi_deci= Read_Byte();

		DHT11_Data->temp_int= Read_Byte();

		DHT11_Data->temp_deci= Read_Byte();

		DHT11_Data->check_sum= Read_Byte();


		/*讀取結束,引腳改為輸出模式*/
		DHT11_Mode_Out_PP();
		/*主機拉高*/
		DHT11_DATA_OUT(HIGH);

		/*檢查讀取的資料是否正確*/
		if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
			return SUCCESS;
		else 
			return ERROR;
	}
	else
	{		
		return ERROR;
	}   
}


ds18b20.h

#ifndef __DS18B20_H
#define __DS18B20_H 
#include "sys.h"   
//	 
//本程式只供學習使用,未經作者許可,不得用于其它任何用途
//ALIENTEK戰艦STM32開發板
//DS18B20驅動代碼	   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2012/9/12
//版本:V1.0
//著作權所有,盜版必究,
//Copyright(C) 廣州市星翼電子科技有限公司 2009-2019
//All rights reserved									  
//

//IO方向設定
#define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
IO操作函式											   
#define	DS18B20_DQ_OUT PGout(11) //資料埠	PA0 
#define	DS18B20_DQ_IN  PGin(11)  //資料埠	PA0 
   	
u8 DS18B20_Init(void);//初始化DS18B20
short DS18B20_Get_Temp(void);//獲取溫度
void DS18B20_Start(void);//開始溫度轉換
void DS18B20_Write_Byte(u8 dat);//寫入一個位元組
u8 DS18B20_Read_Byte(void);//讀出一個位元組
u8 DS18B20_Read_Bit(void);//讀出一個位
u8 DS18B20_Check(void);//檢測是否存在DS18B20
void DS18B20_Rst(void);//復位DS18B20    
#endif

ds18b20.c

#include "ds18b20.h"
#include "delay.h"	
//	 
//本程式只供學習使用,未經作者許可,不得用于其它任何用途
//ALIENTEK精英STM32開發板
//DS18B20驅動代碼	   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2012/9/12
//版本:V1.0
//著作權所有,盜版必究,
//Copyright(C) 廣州市星翼電子科技有限公司 2009-2019
//All rights reserved									  
//
  


//復位DS18B20
void DS18B20_Rst(void)	   
{                 
	DS18B20_IO_OUT(); 	//SET PG11 OUTPUT
    DS18B20_DQ_OUT=0; 	//拉低DQ
    delay_us(750);    	//拉低750us
    DS18B20_DQ_OUT=1; 	//DQ=1 
	delay_us(15);     	//15US
}
//等待DS18B20的回應
//回傳1:未檢測到DS18B20的存在
//回傳0:存在
u8 DS18B20_Check(void) 	   
{   
	u8 retry=0;
	DS18B20_IO_IN();	//SET PG11 INPUT	 
    while (DS18B20_DQ_IN&&retry<200)
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=200)return 1;
	else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
	{
		retry++;
		delay_us(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}
//從DS18B20讀取一個位
//回傳值:1/0
u8 DS18B20_Read_Bit(void) 	 
{
    u8 data;
	DS18B20_IO_OUT();	//SET PG11 OUTPUT
    DS18B20_DQ_OUT=0; 
	delay_us(2);
    DS18B20_DQ_OUT=1; 
	DS18B20_IO_IN();	//SET PG11 INPUT
	delay_us(12);
	if(DS18B20_DQ_IN)data=1;
    else data=0;	 
    delay_us(50);           
    return data;
}
//從DS18B20讀取一個位元組
//回傳值:讀到的資料
u8 DS18B20_Read_Byte(void)     
{        
    u8 i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }						    
    return dat;
}
//寫一個位元組到DS18B20
//dat:要寫入的位元組
void DS18B20_Write_Byte(u8 dat)     
 {             
    u8 j;
    u8 testb;
	DS18B20_IO_OUT();	//SET PG11 OUTPUT;
    for (j=1;j<=8;j++) 
	{
        testb=dat&0x01;
        dat=dat>>1;
        if (testb) 
        {
            DS18B20_DQ_OUT=0;	// Write 1
            delay_us(2);                            
            DS18B20_DQ_OUT=1;
            delay_us(60);             
        }
        else 
        {
            DS18B20_DQ_OUT=0;	// Write 0
            delay_us(60);             
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}
//開始溫度轉換
void DS18B20_Start(void) 
{   						               
    DS18B20_Rst();	   
	DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);	// skip rom
    DS18B20_Write_Byte(0x44);	// convert
} 

//初始化DS18B20的IO口 DQ 同時檢測DS的存在
//回傳1:不存在
//回傳0:存在    	 
u8 DS18B20_Init(void)
{
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);	 //使能PORTG口時鐘 
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				//PORTG.11 推挽輸出
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOG, &GPIO_InitStructure);

 	GPIO_SetBits(GPIOG,GPIO_Pin_11);    //輸出1

	DS18B20_Rst();

	return DS18B20_Check();
}  
//從ds18b20得到溫度值
//精度:0.1C
//回傳值:溫度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
	short tem;
    DS18B20_Start ();  			// ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);	// skip rom
    DS18B20_Write_Byte(0xbe);	// convert	    
    TL=DS18B20_Read_Byte(); 	// LSB   
    TH=DS18B20_Read_Byte(); 	// MSB  
	    	  
    if(TH>7)
    {
        TH=~TH;
        TL=~TL; 
        temp=0;					//溫度為負  
    }else temp=1;				//溫度為正	  	  
    tem=TH; 					//獲得高八位
    tem<<=8;    
    tem+=TL;					//獲得底八位
    tem=(float)tem*0.625;		//轉換     
	if(temp)return tem; 		//回傳溫度值
	else return -tem;    
}

參考用圖

DHT11




DS18B20





轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280559.html

標籤:其他

上一篇:單片機程式燒錄的3種方式(ISP、ICP、IAP)是什么?

下一篇:Java貪吃蛇全代碼

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more