找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3134|回复: 5
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5.         
  6. sbit Data=P3^5;   
  7. uchar rec_dat[9];
  8. sbit RS=P3^0;
  9. sbit RW=P3^1;
  10. sbit E=P3^2;
  11. unsigned char str1[]={"123456"};
  12. unsigned char str2[]={"  "};
  13. int shidu=0;
  14. int wendu=0;


  15. void lcd_init();
  16. unsigned char r_status();
  17. void w_com(unsigned char com);
  18. void w_data(unsigned char dat);
  19. void delay(unsigned int k);
  20. void DL();

  21. void DHT11_delay_ms(uint z)
  22. {
  23.    uint i,j;
  24.    for(i=z;i>0;i--)
  25.       for(j=110;j>0;j--);
  26. }
  27. void DHT11_delay_us(uchar n)
  28. {
  29.     while(--n);
  30. }

  31. void DHT11_start()
  32. {
  33.    Data=1;
  34.    DHT11_delay_us(2);
  35.    Data=0;
  36.    DHT11_delay_ms(30);  
  37.    Data=1;
  38.    DHT11_delay_us(30);
  39. }
  40. void DHT11_receive()     
  41. {
  42.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  43.     DHT11_start();
  44.     if(Data==0)
  45.     {
  46.         while(Data==0);   
  47.         DHT11_delay_us(40);  
  48.         R_H=DHT11_rec_byte();   
  49.         R_L=DHT11_rec_byte();     
  50.         T_H=DHT11_rec_byte();   
  51.         T_L=DHT11_rec_byte();   
  52.         revise=DHT11_rec_byte();

  53.         DHT11_delay_us(25);   

  54.         if((R_H+R_L+T_H+T_L)==revise)   
  55.         {
  56.             RH=R_H;
  57.             RL=R_L;
  58.             TH=T_H;
  59.             TL=T_L;
  60.         }

  61.         rec_dat[0]='0'+(RH/10);
  62.         rec_dat[1]='0'+(RH%10);
  63.         rec_dat[2]='R';
  64.         rec_dat[3]='H';
  65.         rec_dat[4]=' ';
  66.         rec_dat[5]=' ';
  67.         rec_dat[6]='0'+(TH/10);
  68.         rec_dat[7]='0'+(TH%10);
  69.         rec_dat[8]='C';
  70.     }
  71. }



  72. void main()
  73. {
  74.         unsigned char i;
  75.         lcd_init();
  76.         w_com(0x01);
  77.         w_com(0x80);
  78.         for(i=0;i<14;i++)
  79.         {
  80.                 w_data(str1[i]);
  81.                 DL();
  82.         }
  83.         DHT11_delay_ms(100);   
  84. DHT11_receive();
  85.         w_com(0xc0);
  86.         for(i=0;i<10;i++)
  87.            


  88.         {               
  89.                 w_data(str2[i]);
  90.                 DL();
  91.         }
  92.         while(1);
  93. }
  94. void delay(unsigned int k)
  95. {
  96.         unsigned int i,j;
  97.         for(i=0;i>k;i++)
  98.          for(j=0;j>200;j++);
  99. }



  100. void DL()
  101. {
  102.         _nop_();
  103.         _nop_();
  104.         _nop_();
  105. }

  106. void lcd_init()
  107. {
  108.         w_com(0x38);
  109.         w_com(0x0f);
  110.         w_com(0x01);
  111.         w_com(0x06);
  112.         w_com(0x80);
  113. }
  114. unsigned char r_status()
  115. {
  116.         unsigned char s;
  117.         RS=0;
  118.         RW=1;
  119.         E=1;
  120.         DL();
  121.         s=P2;
  122.         E=0;
  123.         RW=0;
  124.         return(s);
  125. }
  126. void w_com(unsigned char com)
  127. {
  128.         unsigned char m;
  129.         do{
  130.                   m=r_status();
  131.                   m&=0x80;
  132.                   DL();
  133.           }while(m!=0);
  134.          RS=0;
  135.          P2=com;
  136.    DL();
  137.    E=1;
  138.    DL();
  139.    E=0;
  140. }               

  141. void w_data(unsigned char dat)
  142. {
  143.         unsigned char m;
  144.         do{
  145.                 m=r_status();
  146.                 m&=0x80;
  147.                 DL();
  148.           }while(m!=0);
  149.           RW=0;
  150.                 RS=1;
  151.                 P2=dat;
  152.                 DL();
  153.                 E=1;
  154.                 DL();
  155.                 E=0;
  156. }
复制代码

111111111.png (17.09 KB, 下载次数: 69)

111111111.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:739545 发表于 2020-7-2 09:05 | 只看该作者
w_data(str2[i]);一直 在写空,在while(1)中又不采集数据,自然什么都没有了
回复

使用道具 举报

板凳
ID:795043 发表于 2020-7-2 15:57 | 只看该作者
现在显示的问题解决了,但怎么在我这个新的程序的while中加入延时循环采集呀
回复

使用道具 举报

地板
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_();
}



回复

使用道具 举报

5#
ID:687261 发表于 2020-7-2 16:48 | 只看该作者
我不久前曾做过这个,想提醒一下吧,DHT11部分,需要严格按照他的时序来写,精确到微秒级us,不然就达不到提取温湿度信号的作用,其他的注意分号,大小写之类的就差不多了,如果只是采集信息的话

评分

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

查看全部评分

回复

使用道具 举报

6#
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()循环内,这样不断刷新数据。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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