青春无限 · 2022年09月18日 · 江苏

【MM32F5270开发板试用】DHT11温湿度监测

1.DHT11传感器

DHT11是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11功耗很低,5V电源电压下,工作平均最大电流0.5mA。DHT11的供电电压为3-5.5V,电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。DATA引脚并联一个5K以上的上拉电阻,增强信号的抗干扰额能力。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。

2. 液晶显示屏

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。

3. 设计过程

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

4.代码部分

主程序:

Initialize\_LCD();  
  
PutString(0,0,"humi:");  
  
// DHT11\_receive();  
  
while(1)  
  
{  
  
if(P32==0)  
  
{    
  
 P24=1;    
  
     P22=0;  
  
}  
  
else{  
  
  P24=0;    
  
      P22=0;  
  
}  
  
delay\_ms(750);  
  
DHT11\_receive();  
  
    Write\_CMD(0x80);  
  
for(i=0;i<7;i++)  
  
  WriteChar(0,5+i,rec\_dat\[i\]);  
  
    PutString(1,0,"temp:");  
  
for(i=7;i<13;i++)  
  
  WriteChar(1,i-2,rec\_dat\[i\]);  
  
if( rec\_dat\[7\]<'2'&&rec\_dat\[0\]<'6')  
  
P17 = 0;  //LED7  
  
else if( rec\_dat\[7\]<'2'&&rec\_dat\[0\]>='6')  
  
P16 = 0;  //LED8  
  
else if( rec\_dat\[7\]>='2'&&rec\_dat\[0\]<'6')  
  
  P47 = 0;  //LED9  
  
else if (rec\_dat\[7\]>='2'&&rec\_dat\[0\]>='6')  
  
   {  
  
        P27 = 1;  
  
    P17 = 0; //LED7  
  
      P16 = 0; //LED8  
  
      P47 = 0; //LED9  
  
      P46 = 0; //LED10  
  
      delay\_ms(250);  
  
        P17 = 0;  
  
        delay\_ms(250);  
  
        delay\_ms(250);  
  
        P17 = 1;  
  
        P16 = 0;  
  
        delay\_ms(250);  
  
        delay\_ms(250);  
  
        P16 = 1;  
  
        P47 = 0;  
  
        delay\_ms(250);  
  
        delay\_ms(250);  
  
        P47 = 1;  
  
        P46 = 0;  
  
        delay\_ms(250);  
  
        delay\_ms(250);  
  
        P46 = 1;  
  
 }  

字符显示子函数:

void PutString(u8 row, u8 column, u8 \*puts)  
  
{  
  
Write\_CMD((((row & 1) << 6) + column) | 0x80);  
  
for ( ;  \*puts != 0;  puts++) //Óöµ½Í£Ö¹·û0½áÊø  
  
{  
  
Write\_DIS\_Data(\*puts);  
  
if(++column >= LineLength) break;  
  
}  
  
}  
  
   
  
void WriteChar(u8 row, u8 column, u8 dat)  
  
{  
  
Write\_CMD((((row & 1) << 6) + column) | 0x80);  
  
Write\_DIS\_Data(dat);  
  
}  

DHT11数据采集与处理:

void DHT11\_receive()        
  
{  
  
    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(245);  //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(135);      
  
        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\]=(RH / 10 +'0');  
  
        rec\_dat\[1\]=(RH % 10 +'0');  
  
  rec\_dat\[2\]='.';  
  
  rec\_dat\[3\]=(RL / 10 +'0');  
  
        rec\_dat\[4\]=(RL % 10 +'0');  
  
        rec\_dat\[5\]='R';  
  
        rec\_dat\[6\]='H';  
  
        rec\_dat\[7\]=(TH / 10 +'0');  
  
        rec\_dat\[8\]=(TH % 10 +'0');  
  
  rec\_dat\[9\]='.';  
  
  rec\_dat\[11\]=(TL / 10 +'0');  
  
        rec\_dat\[10\]=(TL % 10 +'0');  
  
        rec\_dat\[12\]='C';  
  
    }  
  
}  

5.实现功能

显示温湿度到字符屏上面。
image.png

推荐阅读
关注数
0
文章数
1
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息