自己使用正点原子mini STM32f103rtc6板根据DS18B20实验改的DHT11温湿度实验

 

mini板的STM32F103RTC6中没有DHT11温湿度的实验例程,最近刚好用到这部分,所以根据DS18B20的实验改了一下,将它改成了温湿度的实验。
首先DHT11的接法是跟DS18B20的接法是一样的,DATA引脚接在PA0
然后最后烧录的结果如图;
最后把工程上传给各位,请参考

 

#include "dht11.h"
#include "delay.h"

void DHT11_Rst(void)	   
{                 
	DHT11_IO_OUT(); 	
    DHT11_DQ_OUT=0; 	
    delay_ms(20);    	
    DHT11_DQ_OUT=1; 	
	delay_us(30);     	
}

u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//SET INPUT	 
    while (DHT11_DQ_IN&&retry<100)
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=100)return 1;
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)
	{
		retry++;
		delay_us(1);
	};
	if(retry>=100)return 1;	    
	return 0;
}

u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)
	{
		retry++;
		delay_us(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)
	{
		retry++;
		delay_us(1);
	}
	delay_us(40);//µÈ´ý40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}

u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}

u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//¶ÁÈ¡40λÊý¾Ý
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
	}else return 1;
	return 0;	    
}
   	 
u8 DHT11_Init(void)
{	 
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);	
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_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);					
			    
	DHT11_Rst();  
	return DHT11_Check();
} 







 

#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h"   


#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}
									   
#define	DHT11_DQ_OUT PAout(0)
#define	DHT11_DQ_IN  PAin(0) 

u8 DHT11_Init(void);//³õʼ»¯DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);
u8 DHT11_Read_Byte(void);
u8 DHT11_Read_Bit(void);
u8 DHT11_Check(void);
void DHT11_Rst(void);
#endif
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "ds18b20.h"  
#include "dht11.h"

  int main(void)
 {
	u8 t=0;			    
	u8 temperature;  	    
	u8 humidity;    	   

	SystemInit();
	delay_init();	     

	uart_init(9600);
 	LED_Init();

	LCD_Init();
  
 	POINT_COLOR=RED;
	LCD_ShowString(60,50,200,16,16,"Mini STM32");	
	LCD_ShowString(60,70,200,16,16,"DHT11 TEST");	
	LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(60,200,200,16,16,"modified by Leon");
	LCD_ShowString(60,110,200,16,16,"2018/7/22");	  
 	while(DHT11_Init())	//DHT11³õʼ»¯	
	{
		LCD_ShowString(60,130,200,16,16,"DHT11 Error");
		delay_ms(200);
		LCD_Fill(60,130,239,130+16,WHITE);
 		delay_ms(200);
	}								   
	LCD_ShowString(60,130,200,16,16,"DHT11 OK");
	POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É« 
 	LCD_ShowString(60,150,200,16,16,"Temp:   . C");	 
 	LCD_ShowString(60,170,200,16,16,"Humi:  %");	 
	while(1)
	{	    	    
 		if(t%10==0)//
		{									  
			DHT11_Read_Data(&temperature,&humidity);				    
			LCD_ShowNum(60+40,150,temperature,2,16);		  
			LCD_ShowNum(60+40,170,humidity,2,16);			
		}				   
	 	delay_ms(10);
		t++;
		if(t==20)
		{
			t=0;
			LED0=!LED0;
		}
	}
}

 

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值