单片机dht11程序_dht11单片机程序 - CSDN
  • 51单片机DHT11程序

    2020-07-29 14:20:57
    程序DHT11的测量温湿度的驱动程序封装在一个DHT.h和一个DHT11.c中,只需要将该.c文件添加到工程当中,就可直接读出温湿度,改程序一通过测试,请放心下载。
  • BST-V51开发板 + Keil U3 + STC89C52 + DHT11数字温湿度传感器 + 1602显示模块 2.DHT11资料: 2.1 简介: DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 。 它应用专用的数字模块采集技术...

    1.环境:

    BST-V51开发板 + Keil U3 + STC89C52 + DHT11数字温湿度传感器 + 1602显示模块


    2.DHT11资料:

    2.1 简介:

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 。 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

    2.2 引脚:

    Pin

    名称

    注释

    1

    VDD

    供电 3-5.5 VDC

    2

    DATA

    串行数据,单总线

    3

    NC

    空脚,请悬空

    4

    GND

    接地,电源负极



    DHT11实物图

    接口说明

    2.3 串行接口

    DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分。一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据+8bit校验和

    判断是一次正确的传输的依据是:8bit校验和 =8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据

    2.4 驱动过程



    主机将DATA口拉低,至少拉低18ms作为开始信号。DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集。

    DHT11接收到主机的开始信号后, 等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

    总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。

    2.5 接收数据

    接收数据时可以先等待低电平过去,即等待数据线拉高,再延时60us,因为60us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。

    3.C代码:

    /*-----------------------------------------------
      显示模块引脚定义:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
    ------------------------------------------------*/
    #include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    #include <intrins.h>
    #include <math.h>
    #define uchar unsigned char
    #define uint unsigned int	
    sbit RS = P1^0;   //定义端口 
    sbit RW = P1^1;
    sbit EN = P2^5;
    sbit DU = P2^0;
    sbit WE = P2^1;
    
    sbit Data = P3^6;//定义数据线
    uchar rec_dat[15];   //用于显示的接收数据数组
    
    #define RS_CLR RS=0 
    #define RS_SET RS=1
    
    #define RW_CLR RW=0 
    #define RW_SET RW=1 
    
    #define EN_CLR EN=0
    #define EN_SET EN=1
    
    #define DataPort P0
    
    
    void cmg88()//关数码管,点阵函数
    {
    DU=1;  
    P0=0X00;
    DU=0;
    }
    /*------------------------------------------------
     uS延时函数,含有输入参数 unsigned char t,无返回值
     unsigned char 是定义无符号字符变量,其值的范围是
     0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
     长度如下 T=tx2+5 uS 
    ------------------------------------------------*/
    void DelayUs2x(unsigned char t)
    {   
     while(--t);
    }
    /*------------------------------------------------
     mS延时函数,含有输入参数 unsigned char t,无返回值
     unsigned char 是定义无符号字符变量,其值的范围是
     0~255 这里使用晶振12M,精确延时请使用汇编
    ------------------------------------------------*/
    void DelayMs(unsigned char t)
    {
         
     while(t--)
     {
         //大致延时1mS
         DelayUs2x(245);
    	 DelayUs2x(245);
     }
    }
    /*------------------------------------------------
                  判忙函数
    ------------------------------------------------*/
     bit LCD_Check_Busy(void) 
     { 
     DataPort= 0xFF; 
     RS_CLR; 
     RW_SET; 
     EN_CLR; 
     _nop_(); 
     EN_SET;
     return (bit)(DataPort & 0x80);
     }
    /*------------------------------------------------
                  写入命令函数
    ------------------------------------------------*/
     void LCD_Write_Com(unsigned char com) 
     {  
     while(LCD_Check_Busy()); //忙则等待
     RS_CLR; 
     RW_CLR; 
     EN_SET; 
     DataPort= com; 
     _nop_(); 
     EN_CLR;
     }
    /*------------------------------------------------
                  写入数据函数
    ------------------------------------------------*/
     void LCD_Write_Data(unsigned char Data) 
     { 
     while(LCD_Check_Busy()); //忙则等待
     RS_SET; 
     RW_CLR; 
     EN_SET; 
     DataPort= Data; 
     _nop_();
     EN_CLR;
     }
    
    /*------------------------------------------------
                    清屏函数
    ------------------------------------------------*/
     void LCD_Clear(void) 
     { 
     LCD_Write_Com(0x01); 
     DelayMs(5);
     }
    /*------------------------------------------------
                  写入字符串函数
    ------------------------------------------------*/
     void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
     {     
     if (y == 0) 
     	{     
    	 LCD_Write_Com(0x80 + x);     //表示第一行
     	}
     else 
     	{      
     	LCD_Write_Com(0xC0 + x);      //表示第二行
     	}        
     while (*s) 
     	{     
     LCD_Write_Data( *s);     
     s ++;     
     	}
     }
    /*------------------------------------------------
                  写入字符函数
    ------------------------------------------------*/
     void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
     {     
     if (y == 0) 
     	{     
     	LCD_Write_Com(0x80 + x);     
     	}    
     else 
     	{     
     	LCD_Write_Com(0xC0 + x);     
     	}        
     LCD_Write_Data( Data);  
     }
    /*------------------------------------------------
                  初始化函数
    ------------------------------------------------*/
     void LCD_Init(void) 
     {
       LCD_Write_Com(0x38);    /*显示模式设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38);  
       LCD_Write_Com(0x08);    /*显示关闭*/ 
       LCD_Write_Com(0x01);    /*显示清屏*/ 
       LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x0C);    /*显示开及光标设置*/
       }
       
    
    /*------------------------------------------------
                  DHT11延时函数
    ------------------------------------------------*/
    void DHT11_delay_us(uchar n)
    {
        while(--n);
    }
    
    void DHT11_delay_ms(uint z)
    {
       uint i,j;
       for(i=z;i>0;i--)
          for(j=110;j>0;j--);
    }
    /*------------------------------------------------
                  DHT11开始信号
    ------------------------------------------------*/
    void DHT11_start()
    {
       Data=1;
       DHT11_delay_us(2);
       Data=0;
       DHT11_delay_ms(20);   //延时18ms以上
       Data=1;
       DHT11_delay_us(30);
    }
    /*------------------------------------------------
                  接收八位二进制
    ------------------------------------------------*/
    uchar DHT11_rec_byte()      //接收一个字节
    {
       uchar i,dat=0;
      for(i=0;i<8;i++)    //从高到低依次接收8位数据
       {          
          while(!Data);   ////等待50us低电平过去
          DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 
          dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
          if(Data==1)    //数据为1时,使dat加1来接收数据1
             dat+=1;
          while(Data);  //等待数据线拉低    
        }  
        return dat;
    }
    /*------------------------------------------------
                  接收40bit数据
    ------------------------------------------------*/
    void DHT11_receive()      //接收40位的数据
    {
        uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; 
        DHT11_start();
    
        if(Data==0)
        {
    	
            while(Data==0);   //等待拉高     
    		
            DHT11_delay_us(40);  //拉高后延时80us
            R_H=DHT11_rec_byte();    //接收湿度高八位  
            R_L=DHT11_rec_byte();    //接收湿度低八位  
            T_H=DHT11_rec_byte();    //接收温度高八位  
            T_L=DHT11_rec_byte();    //接收温度低八位
            revise=DHT11_rec_byte(); //接收校正位
    			 
            DHT11_delay_us(25);    //结束
    
            if((R_H+R_L+T_H+T_L)==revise)      //校正
            {
                RH=R_H;
                RL=R_L;
                TH=T_H;
                TL=T_L;
            } 
            /*数据处理,方便显示*/
            rec_dat[0]='0'+(RH/10);
            rec_dat[1]='0'+(RH%10);
    		rec_dat[2] =' ';
    		rec_dat[3] = 'R' ;
    		rec_dat[4] = 'H';
            rec_dat[5]=' ';
            rec_dat[6]=' ';
            rec_dat[7]=' ';
            rec_dat[8]=' ';
            rec_dat[9]='0'+(TH/10);
            rec_dat[10]='0'+(TH%10);
    		rec_dat[11] =' ';
    		rec_dat[12] = 'C';
    		rec_dat[13] = ' ' ;
            rec_dat[14]=' ';
        }
    }
    
    
    /*------------------------------------------------
                        主函数
    ------------------------------------------------*/ 
    void main(void) 
    { 
    	uint i;
    	cmg88();//关数码管,点阵函数
    
    	LCD_Init(); 
    	LCD_Clear();//清屏
    	DHT11_delay_ms(1500);    //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
    	while (1) 
     	{ 
           	DHT11_receive();
    	    
    	  
    		for(i=0;i<15;i++)
    		{
    	   		LCD_Write_Char(i,1,rec_dat[i]);
    		}        
      		//LCD_Write_Char(0,0,'T');
      		//LCD_Write_Char(0,1,'H');
     	  	//LCD_Write_String(0,1,"HELLO");
     	}
    }
    
    

    4.效果




    6.参考出处:

    _Line_的博客  http://blog.csdn.net/u013151320/article/details/50389624

    51黑电子论坛:http://www.51hei.com/bbs/dpj-30362-1.html

    DHT11技术手册:https://wenku.baidu.com/view/d1aec72158fb770bf78a55e0.html

    展开全文
  • DHT11 430程序

    2020-07-23 23:32:54
    430的DHT11驱动程序 IAR工程 有 dht11.ewww dht11.c dht11.h main.c 直接调用函数可读出温湿度
  • DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。一.电路连接分析1.引脚图2.接线图DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中...

    DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。

    一.电路连接分析

    1.引脚图

    这里写图片描述

    2.接线图

    DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。单总线通常要求外接一个约 5.1kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结极,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。

    这里写图片描述

    二.数据采集分析

    1.数据总时序

    用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,幵触发一次信采集

    这里写图片描述

    2.主机发送起始信号

    单片机连接DHT11的DATA引脚的I/O口输出低电平,且低电平保持时间不能小于 18ms,然后等待 DHT11 作出应答信号。

    这里写图片描述

    3.检测从机应答信号

    DHT11 的 DATA 引脚检测到外部信号有低电平时, 等待外部信号低电平结束, 延迟后 DHT11 的 DATA引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接收数据。

    这里写图片描述

    4.接收数据
    (1)数据判定规则
    位数据“0”的格式为: 50 微秒的低电平和 26-28 微秒的高电平,位数据“1”的格式为: 50 微秒的低电平加 70微秒的高电平。

    接收数据时可以先等待低电平过去,即等待数据线拉高,再延时60us,因为60us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。

    这里写图片描述

    (2)数据格式

    一次传送 40 位数据,高位先出

    8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据+8bit 校验位。

    (3)数据校正
    判断“8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据”的结果是否等于8bit 校验位。如果等于则数据接收正确,否则应该放弃这一次的数据,重新接收。

    三.驱动程序

    #include<reg51.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit Data=P3^6;   //定义数据线
    uchar rec_dat[9];   //用于显示的接收数据数组
    
    void DHT11_delay_us(uchar n)
    {
        while(--n);
    }
    
    void DHT11_delay_ms(uint z)
    {
       uint i,j;
       for(i=z;i>0;i--)
          for(j=110;j>0;j--);
    }
    
    void DHT11_start()
    {
       Data=1;
       DHT11_delay_us(2);
       Data=0;
       DHT11_delay_ms(20);   //延时18ms以上
       Data=1;
       DHT11_delay_us(30);
    }
    
    uchar DHT11_rec_byte()      //接收一个字节
    {
       uchar i,dat=0;
      for(i=0;i<8;i++)    //从高到低依次接收8位数据
       {          
          while(!Data);   ////等待50us低电平过去
          DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 
          dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
          if(Data==1)    //数据为1时,使dat加1来接收数据1
             dat+=1;
          while(Data);  //等待数据线拉低    
        }  
        return dat;
    }
    
    void DHT11_receive()      //接收40位的数据
    {
        uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; 
        DHT11_start();
        if(Data==0)
        {
            while(Data==0);   //等待拉高     
            DHT11_delay_us(40);  //拉高后延时80us
            R_H=DHT11_rec_byte();    //接收湿度高八位  
            R_L=DHT11_rec_byte();    //接收湿度低八位  
            T_H=DHT11_rec_byte();    //接收温度高八位  
            T_L=DHT11_rec_byte();    //接收温度低八位
            revise=DHT11_rec_byte(); //接收校正位
    
            DHT11_delay_us(25);    //结束
    
            if((R_H+R_L+T_H+T_L)==revise)      //校正
            {
                RH=R_H;
                RL=R_L;
                TH=T_H;
                TL=T_L;
            } 
            /*数据处理,方便显示*/
            rec_dat[0]='0'+(RH/10);
            rec_dat[1]='0'+(RH%10);
            rec_dat[2]='R';
            rec_dat[3]='H';
            rec_dat[4]=' ';
            rec_dat[5]=' ';
            rec_dat[6]='0'+(TH/10);
            rec_dat[7]='0'+(TH%10);
            rec_dat[8]='C';
        }
    }
    
    /*这里使用lcd1602来显示采集到的数据,lcd1602驱动程序在博主的51单片机系列博文中有详细讲解*/
    void main()
    {
       uchar i;   
       lcd_init();   //lcd1602初始化
       while(1)
       {   
           DHT11_delay_ms(1500);    //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
           DHT11_receive();
           lcd_write_command(0x80);   //从lcd1602第一行第一个位置开始显示
           for(i=0;i<9;i++)
           lcd_write_data(rec_dat[i]);   //显示数据                      
       }
    }
    展开全文
  • 51单片机DHT11数码管显示程序,DHT11是一款方便使用的温湿度传感器,可以同时检测温度和湿度,使用方便,本程序是基于51单片机数码管显示的DHT11程序中重要部分都有注释,而且已测试通过请放心下载!
  • 正点原子精英开发板模块化封装,入口函数简明,易上手操作展示main.c代码,完整代码请下载点击下载代码#include "led.h" #include "...dht11.h" /***************************

    正点原子精英开发板

    模块化封装,入口函数简明,易上手操作

    展示main.c代码,完整代码请下载

    点击下载代码

    #include "led.h"
    #include "delay.h"
    #include "key.h"
    #include "sys.h"
    #include "usart.h"	 
    #include "dht11.h" 	 
     
     
    /************************************************  
     ALIENTEK精英STM32开发板     
     作者:唯恋殊雨    
     CSDN博客:https://blog.csdn.net/tichimi3375    
     OUT-PG11 
    ************************************************/  
     
     int main(void)
     {	 			    
    	u8 temperature;  	    
    	u8 humidity;    	   
    
    	delay_init();	    	 //延时函数初始化	  
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 	//串口初始化为115200
    	LED_Init();		  		//初始化与LED连接的硬件接口
     	while(DHT11_Init())	//DHT11初始化	
    	{
    		printf("DHT11 Error");
    		delay_ms(200);
    	}								   	 
    	while(1)
    	{	    	    								  
    		DHT11_Read_Data(&temperature,&humidity);	//读取温湿度值					    
    		printf("温度为:%d",temperature);	//显示温度	   		   
    		printf("湿度为:%d",humidity);		//显示湿度	 	   				   
    	 	delay_ms(200);
    	}
    }
    
    
    
    
    

    展开全文
  • 今天使用51单片机学习板调试DHT11湿度传感器,下载程序的时候把DHT11烧掉了。

    今天使用51单片机学习板调试DHT11湿度传感器,下载程序的时候把DHT11烧掉了。


    一开始我使用杜邦线把DHT11的VCC引脚接到学习板上的VCC端,GND接GND,数据端口接51单片机的P0.0。


    第一次给单片机下载程序没有什么问题,能下载成功。之后再下载程序发觉下载不了,下载窗口显示正在连接51单片机,后来听到“啪”一声,然后又闻到一股焦味,我吓得立马给单片机断电,检查是哪个元器件烧了。摸了一下DHT11湿度传感器,感觉烫烫的,应该是这个烧了。


    检查了一下开发板的电源电路,我突然意识到如果要给传感器接VCC,必须在电源VCC和传感器VCC之间接一个电阻限流,不然就会像今天这样子把DHT11传感器给烧了。


    另外,为什么程序下载不进去,我在网上查找到一下信息:


    STC单片机下载引导程序需要CPU完全断电,注意:完全断电!完全断电!完全断电!


    1、要知道电源并非只从VCC进入,其他管脚也可能有微弱电流,至于多大,并不是非得达到CPU工作的电流。
    2、说到这里,大家可能明白了一点,微弱电源就是从你已经连好的ISP下载线进入了,下载线供电能力,有个体和偶然因素,所以很多人换根线或是改改波特率就好了,会判断是下载线不兼容的假像!这个假相迷惑了数代有识青年,并当做教本教育下一代,呵呵。
    3、问题如何解决:STC串口线TXD串一个300-500欧电阻、RXD串一个IN4148,保证你从此告别STC下载烦劳。


    我认为之前为什么程序下载不进去,是第一点原因。
    第一次下载正常运行后,第二次再下载时,DHT11传感器里面有微弱的电流,这些电流传给51,导致51没有完全断电而不能下载程序。

    展开全文
  • 今天给大家介绍的是一个温湿度检测设计,基于...先来看一下整体的架构图:硬件部分由STC89C52单片机DHT11温湿度传感器、BT08蓝牙串口模块和Android手机组成。传感器将采集到的温湿度数据传送给单片机,然后单片机...
  • DHT11 51单片机代码

    2020-07-24 23:33:00
    DHT11 在51上的测试程序 以及其显示
  • DHT11的51单片机驱动

    2020-07-29 14:18:35
    经过实际测试的在51单片机正常运行的 DHT11驱动
  • DHT11程序,用1602显示

    2020-07-30 23:30:48
    基于51单片机DHT11温度传感器的1602显示,和相关的芯片资料,希望对你有用。
  • DHT11程序分析和测试

    2019-02-27 19:18:27
    本篇文章对于DHT11进行测试,并且提供程序思路 先看一下DHT11的数据 目前DHT11读出的湿度小数和温度小数都为0(和DHT11的版本有关),它采用单总线协议,但是和DS18B20的不同在于,它没有复杂的控制字节,以及...
  • 利用单片机 实现DHT11温湿度传感器的温度,和湿度值,通过单片机串口发送给PC串口终端,并显示出来
  • 基于51单片机DHT11的温湿度检测设计.zip 内含 keil单片机代码 以及proteus电路仿真
  • 基于51单片机、ESP8266WiFi模块、温湿度DHT11传感器、Android APP完成。首先先展示一下设计好的实物,接下来将从系统方案、硬件设计、软件设计这三个方面来阐述。 1、系统方案 DHT11温湿度传感器采集数据传送...
  • 前几天发了arduino读取dht11的文章【arduino读取DHT11温度、湿度数据并串口显示 】,里面DHT11的通信协议已经说明了,这里略过,贴个程序吧。测试过可用的。 晶振11.0592Mhz。 #include "reg52.h" unsigned ...
  • (STM32)DHT11程序

    2020-07-30 23:33:28
    while(DHT11_Init()) //DHT11初始化 { printf("DHT11 Error"); delay_ms(200); } while(1) { DHT11_Read_Data(&temperature;,&humidity;); //读取温湿度值 printf("温度为:%d",temperature); //显示...
  • 程序设计是基于51单片机开发的,通过DHT11传感器检测空气的温度和湿度,并通过1602液晶显示出来,同时通过串口通信,将其显示在PC机上
1 2 3 4 5 ... 20
收藏数 701
精华内容 280
关键字:

单片机dht11程序