STC89C52单片机利用DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度

文章目录

  • 前言
  • 一、项目要求
  • 二、各模块简介
  • 1.DHT11温湿度模块简介
  • 1.1DHT11温湿度模块外观
  • 1.2DHT11温湿度模块使用方法简介
  • 1.2.1DHT11温湿度模块工作的过程
  • 1.2.2DHT11模块DATA引脚上40bit数据说明
  • 1.2.3DHT11模块工作的时序图
  • 1.2.4DHT11模块传输数据的时序图
  • 2.HC-08蓝牙模块简介
  • 2.1HC-08蓝牙模块外观
  • 2.2HC-08蓝牙模块使用方法简介
  • 2.3HC-08蓝牙模块的AT指令表及部分说明
  • 三、项目实现的代码
  • 1.HC-08蓝牙模块传输数据部分代码
  • 1.1串口初始化代码
  • 1.1数据传输代码
  • 2.DHT11温湿度模块部分代码
  • 2.1DHT11模块激活代码
  • 2.2从DHT11模块得到数据代码
  • 3.main函数部分代码
  • 四、结果
  • 五、总结

  • 前言

    下面将介绍如何利用STC89C52单片机和DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度。以及各模块的使用方法。

    一、项目要求

    利用DHT11温湿度模块测量温湿度,利用HC-08蓝牙模块将数据传到手机上。

    二、各模块简介

    1.DHT11温湿度模块简介

    1.1DHT11温湿度模块外观

    DHT11温湿度模块外观

    1.2DHT11温湿度模块使用方法简介

    1.2.1DHT11温湿度模块工作的过程

    用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主
    机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。

    1.2.2DHT11模块DATA引脚上40bit数据说明

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

    1.2.3DHT11模块工作的时序图

    说明:
    1.DATA引脚拉高
    2.DATA引脚拉低(至少18ms)
    3.DATA引脚拉高(20~40us)
    4.如果在后面的80us内检测到DATA引脚被拉低,则说明模块存在
    5.再检测DATA引脚是否被拉高
    6.再检测DATA引脚,看其是否被拉低,如果拉低,则准备开始传输数据
    DHT11模块工作时序图

    1.2.4DHT11模块传输数据的时序图

    模块给单片机传输的数据只能是0和1。我们可以通过0,1时序图的不同从而判断模块给单片机传输的数据是0还是1.
    0的时序图
    说明·:
    1.不断检测DATA引脚是否被拉高
    2.检测到被拉高后,进行延时35us
    3.检测DATA引脚是否为低电平,如果是,则传输的数据为0,否则,为1。如果为1,则需要进行等待至引脚为低电平
    数据0的时序图
    1的时序图
    数据1的时序图

    2.HC-08蓝牙模块简介

    2.1HC-08蓝牙模块外观

    HC--8蓝牙模块

    2.2HC-08蓝牙模块使用方法简介

    1.使用相关的AT指令,更改模块的波特率等指标.
    2.将蓝牙模块RXD与单片机的TXD相连,TXD与单片机的RXD相连.

    2.3HC-08蓝牙模块的AT指令表及部分说明

    说明:
    1.在模块未连线状态下可以进行AT指令状态操作,连线后进入串口透传模式
    2.模块启动大约需要150ms,所以最好在模块上电200ms后进行AT指令操作
    3。AT指令操作成功会一律返回OK(有些指令此外)
    蓝牙模块指令集

    三、项目实现的代码

    1.HC-08蓝牙模块传输数据部分代码

    1.1串口初始化代码

    void Uart_Init()//串口中断初始化函数
    {
    	AUXR = 0X01;//隔离电离辐射
    	SCON = 0X50;//串口工作方式1,允许接收
    	TMOD &= 0X0F;
    	TMOD |= 0X20;//定时器1工作方式2
    	TH1  = 0XFD;
    	TL1  = 0XFD;//波特率为9600
    	TR1  = 1;//定时器1开始计时
    }
    
    

    1.1数据传输代码

    void Send_Byte(char cmdata)//发送一个Byte函数
    {
    	SBUF = cmdata;
    	while(!TI);//一个Byte发送完成
    	TI = 0;
    }
    
    void Send_Data(char* p)
    {
    	while(*p != '\0'){
    		Send_Byte(*p);
    		p++;
    	}
    }
    

    2.DHT11温湿度模块部分代码

    2.1DHT11模块激活代码

    void Dht11_Start() //使DHT11模块工作函数
    {
    	//>1.DATA引脚拉高
    	DATA = 1;
    	//>2.DATA引脚拉低(至少18ms)
    	DATA = 0;
    	Delay20ms();
    	//>3.DATA引脚拉高(20~40us)
    	DATA = 1;
    	//>4.如果在后面的80us内检测到DATA引脚被拉低,则说明模块存在
    	while(DATA);
    	//>5.再检测DATA引脚是否被拉高
    	while(!DATA);
    	//>6.再检测DATA引脚,看其是否被拉低,如果拉低,则准备开始传输数据
    	while(DATA);
    }
    

    2.2从DHT11模块得到数据代码

    void Get_Data_From_Dht11() //从DHT11模块得到数据
    {
    	int i,j;
    	char flag;
    	char temp;
    	Dht11_Start();//每传输完一次数据都要重新激活模块
    	
    	for(i=0;i<5;i++){
    		for(j=0;j<8;j++){
    			//>1.不断检测DATA引脚是否被拉高
    			while(!DATA);
    			//>2.检测到被拉高后,进行延时35us
    			Delay35us();
    			//>3.检测DATA引脚是否为低电平,如果是,则传输的数据为0,否则,为1.当为1时要等待至引脚为低电平
    			if(DATA == 1){
    				flag = 1;
    				while(DATA);
    			}else{
    				flag = 0;
    			}
    			temp = temp << 1;
    			temp |= flag;
    		}
    		dhtdata[i] = temp;
    	}
    }
    
    void Build_Data()
    {	
    	hum[0] = ':';
    	hum[1] = dhtdata[0]/10 + 0x30;
    	hum[2] = dhtdata[0]%10 + 0x30;//湿度整数部分
    	hum[3] = '.';
    	hum[4] = dhtdata[1]/10 + 0x30;
    	hum[5] = dhtdata[1]%10 + 0x30;//湿度小数部分
    	hum[6] = '%';
    	hum[7] = '\0';
    	
    	tem[0] = ':';
    	tem[1] = dhtdata[2]/10 + 0x30;
    	tem[2] = dhtdata[2]%10 + 0x30;//温度整数部分
    	tem[3] = '.';
    	tem[4] = dhtdata[3]/10 + 0x30;
    	tem[5] = dhtdata[3]%10 + 0x30;//温度小数部分
    	tem[6] = 'C';
    	tem[7] = '\0';
    }
    
    

    3.main函数部分代码

    void main()
    {
    	Uart_Init();//串口中断初始化函数
    	Delay1000ms();
    	Delay1000ms();//给模块上电时间
    	while(1){
    		Get_Data_From_Dht11();
    		Build_Data();
    		Send_Data("湿度");
    		Send_Data(hum);
    		Send_Data("\r\n");//换行
    		Send_Data("温度");
    		Send_Data(tem);
    		Send_Data("\r\n");//换行
    		Delay1000ms();
    	}
    }
    

    四、结果

    结果

    五、总结

    1.看时序图时要注意
    2.DHT11模块需要上电时间

    物联沃分享整理
    物联沃-IOTWORD物联网 » STC89C52单片机利用DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度

    发表回复