找回密码
 立即注册
查看: 201|回复: 0

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-03 00:08:48
已绑定手机
已实名认证

46

主题

161

回帖

482

积分

中级会员

积分
482
发表于 2024-12-28 12:12:19 | 显示全部楼层 |阅读模式

串口以 HEX 方式发送 10 或 11 查询温湿度

硬件连接

IMG_20241228_121029.jpg

代码


#include <reg52.h>
#include <stdio.h>

sbit DHT_data=P2^0;

unsigned int rec_dat[4];
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<8;i++)
    {
            while(!DHT_data);
          DHT11_delay_us(8);
            dat<<=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[0]=RH;
        rec_dat[1]=RL;
        rec_dat[2]=TH;
        rec_dat[3]=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>0;i--)
      for(j=110;j>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("Temp: ");
                                uart_send(rec_dat[2]/10 + '0');//shi
                                uart_send(rec_dat[2]%10 + '0');//ge
                                uart_send('.');
                                uart_send(rec_dat[3] + '0');
                                uart_send('C');
                                uart_send_string("\r\n");
                            break;
                            case Humidity_COMMAND:
                                DHT11_delay_ms(150);
                                DHT11_receive();
                                DHT11_delay_ms(100);
                                uart_send_string("Humidity: ");
                                uart_send(rec_dat[0]/10 + '0');//shi
                                uart_send(rec_dat[0]%10 + '0');//ge
                                uart_send('.');
                                uart_send(rec_dat[1] + '0');
                                uart_send('%');
                                uart_send_string("\r\n");
                            break;
                }
            }
}


效果

UART_DHT11.gif

MCU开发者和爱好者
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 03:09 , Processed in 0.104962 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表