lijinlei 发表于 2024-12-28 12:12:19

89C52RC 单片机实现串口查询 DHT11 数据

<p><strong>串口以 HEX 方式发送 10 或 11 查询温湿度</strong></p>
<h1>硬件连接</h1>
<p><img src="data/attachment/forum/202412/28/121149ruju4qyo6r3g69u4.jpg" alt="IMG_20241228_121029.jpg" title="IMG_20241228_121029.jpg" /></p>
<h1>代码</h1>
<pre><code>
#include &lt;reg52.h&gt;
#include &lt;stdio.h&gt;

sbit DHT_data=P2^0;

unsigned int rec_dat;
unsigned char DHT11_rec_byte();
unsigned char comdata;

#define Temp_COMMAND 0x10
#define Humidity_COMMAND 0x11
//定义
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int k);
void DHT11_start();
void DHT11_receive();
void InitUART(void);
void uart_send(unsigned char dat);
void uart_send_string(unsigned char *str);
void receive_data(void);
void test_do_data(void);

//主函数
void main()
{
    InitUART();
    while(1)
    {
    }
}

//DHT11起始信号
void DHT11_start()
{
    DHT_data=1;

    DHT11_delay_us(2);

    DHT_data=0;

    DHT11_delay_ms(20);

    DHT_data=1;

    DHT11_delay_us(13);
}

//接收一个字节
unsigned char DHT11_rec_byte()
{
    unsigned char i,dat;

    for(i=0;i&lt;8;i++)
    {
            while(!DHT_data);
          DHT11_delay_us(8);
            dat&lt;&lt;=1;
            if(DHT_data==1)
            {
                dat+=1;
            }
            while(DHT_data);
    }
    return dat;
}

//接收温湿度数据
void DHT11_receive()
{
    unsigned int R_H,R_L,T_H,T_L;
    unsigned char RH,RL,TH,TL,revise;

    DHT11_start();
    DHT_data=1;
    if(DHT_data==0)
    {
      while(DHT_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=RH;
       rec_dat=RL;
       rec_dat=TH;
       rec_dat=TL;
    }

}

//延时us   --2*n+5us
void DHT11_delay_us(unsigned char n)
{
   while(--n);
}

//延时ms
void DHT11_delay_ms(unsigned int k)
{
  unsigned int i,j;
  for(i=k;i&gt;0;i--)
     for(j=110;j&gt;0;j--);
}


void InitUART(void)//使用定时器1作为串口波特率发生器
{
    SCON=0x40;                  //串口通信工作方式1
    REN=1;                      //允许接收
    TMOD=0x20;                  //定时器1的工作方式2
    TH1=0xFD; // 波特率 9600 bps
    TL1=0xFD; // 波特率 9600 bps   
    TI=1;
    TR1=1;
    ES = 1; //
 EA = 1; //
}

void uart_send(unsigned char dat)
{
   SBUF = dat;
   while(!TI);
   TI = 0;
}

void uart_send_string(unsigned char *str)
{
   while(*str)
      {
       uart_send(*str++);
 }
}

void uart_isr(void) interrupt 4
{
   if(RI)
      {
            RI = 0;
            comdata = SBUF;
            switch(comdata)
            {
                            case Temp_COMMAND:
                              DHT11_delay_ms(150);
                              DHT11_receive();
                              DHT11_delay_ms(100);
                              uart_send_string(&quot;Temp: &quot;);
                              uart_send(rec_dat/10 + '0');//shi
                              uart_send(rec_dat%10 + '0');//ge
                              uart_send('.');
                              uart_send(rec_dat + '0');
                              uart_send('C');
                              uart_send_string(&quot;\r\n&quot;);
                            break;
                            case Humidity_COMMAND:
                              DHT11_delay_ms(150);
                              DHT11_receive();
                              DHT11_delay_ms(100);
                              uart_send_string(&quot;Humidity: &quot;);
                              uart_send(rec_dat/10 + '0');//shi
                              uart_send(rec_dat%10 + '0');//ge
                              uart_send('.');
                              uart_send(rec_dat + '0');
                              uart_send('%');
                              uart_send_string(&quot;\r\n&quot;);
                            break;
                }
            }
}


</code></pre>
<h1>效果</h1>
<p><img src="data/attachment/forum/202412/28/120949vd7fu4qzh7hhgrsu.gif" alt="UART_DHT11.gif" title="UART_DHT11.gif" /></p>
页: [1]
查看完整版本: 89C52RC 单片机实现串口查询 DHT11 数据