找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

51单片机 用LCD1602显示DHT11采集的温湿度,仿真温湿度显示不出来,求指点

查看数: 3146 | 评论数: 5 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-7-1 18:27

正文摘要:

#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int          sbit Data=P3^5;    uchar rec_dat[9]; sbit RS=P3^0 ...

回复

ID:663230 发表于 2020-8-12 17:29
void main()
{
         unsigned char i;
         lcd_init();
         DHT11_delay_ms(100);
                While(1)
{
DHT11_receive();
         write_com(0x80);
                   for(i=0;i<12;i++)
         write_dat(lcd[i]);        
         write_com(0xc0);
         for(i=0;i<9;i++)                       
         write_dat(rec_dat[i]);        
         DL();  
}  
}        
把数据采聚写在while()循环内,这样不断刷新数据。
ID:687261 发表于 2020-7-2 16:48
我不久前曾做过这个,想提醒一下吧,DHT11部分,需要严格按照他的时序来写,精确到微秒级us,不然就达不到提取温湿度信号的作用,其他的注意分号,大小写之类的就差不多了,如果只是采集信息的话

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

ID:795043 发表于 2020-7-2 15:58

RE: 51单片机 用LCD1602显示DHT11采集的温湿度,仿真温湿度显示不出来,求指点

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit Data=P3^6;
unsigned char rec_dat[9];

sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
unsigned char code lcd[]={"123456789"};



void lcd_init();
unsigned char r_status();
//void w_com(unsigned char com);
//void w_data(unsigned char dat);
void delay(unsigned int k);
void DL();

void delay(unsigned int k)
{
        unsigned int i,j;
        for(i=0;i>k;i++)
         for(j=0;j>200;j++);
}
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(30);  
   Data=1;
   DHT11_delay_us(30);
}

uchar DHT11_rec_byte()   
{
   uchar i,dat=0;
  for(i=0;i<8;i++)   
   {         
      while(!Data);   
      DHT11_delay_us(8);   
      dat<<=1;           
      if(Data==1)   
         dat+=1;
      while(Data);   
    }  
    return dat;
}

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(40);  
        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';
       
    }
}


void write_com(unsigned char com)
{
        unsigned char m;
        do{
                  m=r_status();
                  m&=0x80;
                DL();
          }while(m!=0);
         RS=0;
         P2=com;
   delay(5);
                //DL();
   E=1;
                delay(5);
   //DL();
   E=0;
}               

void write_dat(unsigned char dat)
{
        unsigned char m;
        do{
                m=r_status();
                m&=0x80;
                DL();
          }while(m!=0);
          RW=0;
                RS=1;
                P2=dat;
                delay(5);
                //DL();
                E=1;
                delay(5);
                //DL();
                E=0;
}

void lcd_init()
{
        write_com(0x38);
        write_com(0x0f);
write_com(0x01);
        write_com(0x06);
        write_com(0x80);
}
unsigned char r_status()
{
        unsigned char s;
        RS=0;
        RW=1;
        E=1;
        DL();
        s=P2;
        E=0;
        RW=0;
        return(s);
}


void main()
       
{
        //while(1);
        {
        unsigned char i;
        lcd_init();
        DHT11_delay_ms(100);   
  DHT11_receive();
        write_com(0x80);
  for(i=0;i<12;i++)
        write_dat(lcd[i]);       
        write_com(0xc0);
        for(i=0;i<9;i++)                      
        write_dat(rec_dat[i]);       
        DL();  
}       
        while(1);
}

void DL()
{
        _nop_();
        _nop_();
        _nop_();
}



ID:795043 发表于 2020-7-2 15:57
现在显示的问题解决了,但怎么在我这个新的程序的while中加入延时循环采集呀
ID:739545 发表于 2020-7-2 09:05
w_data(str2[i]);一直 在写空,在while(1)中又不采集数据,自然什么都没有了

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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