找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5752|回复: 32
收起左侧

51单片机 用LCD1602显示DHT11采集的温湿度,实物可以显示温度但是仿真显示不出来

  [复制链接]
回帖奖励 90 黑币 回复本帖可获得 30 黑币奖励! 每人限 3 次
ID:699307 发表于 2020-3-31 16:13 | 显示全部楼层 |阅读模式

显示不出温湿度

显示不出温湿度

#include <reg52.h>

#define LCD1602_DB  P0
sbit LCD1602_RS = P1^2;
sbit LCD1602_RW = P1^3;
sbit LCD1602_E  = P1^1;

/* 等待液晶准备好 */
void LcdWaitReady()
{
    unsigned char sta;

    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
        LCD1602_E = 1;
        sta = LCD1602_DB; //读取状态字
        LCD1602_E = 0;
    } while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;

    if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址
        addr = 0x00 + x;  //第一行字符地址从0x00起始
    else
        addr = 0x40 + x;  //第二行字符地址从0x40起始
    LcdWriteCmd(addr | 0x80);  //设置RAM地址
}
/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
    LcdSetCursor(x, y);   //设置起始地址
    while (*str != '\0')  //连续写入字符串数据,直到检测到结束符
    {
        LcdWriteDat(*str++);
    }
}
/* 初始化1602液晶 */
void InitLcd1602()
{
    LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口
    LcdWriteCmd(0x0C);  //显示器开,光标关闭
    LcdWriteCmd(0x06);  //文字不动,地址自动+1
    LcdWriteCmd(0x01);  //清屏
}
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^0;   
uchar rec_dat[13]="123695669999";
extern void InitLcd1602();
uchar showset[16]="12369566999999";
int wendu=0;
int shidu=0;

sbit shezhi=P2^0;
sbit jia=P2^1;
sbit jian=P2^2;
sbit beep=P3^7;

int wendul=5;
int wenduh=30;
int shidul=30;
int shiduh=60;
int change=0;
uchar key_can;         //按键值
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
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(20);   
   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);  //延时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;
        }
        /*数据分解*0-9*/
                                
//        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';
                                shidu=RH;
                                wendu=TH;
                                rec_dat[0]='H';
                                rec_dat[1]=':';
                                rec_dat[2]='0'+(RH/10);
        rec_dat[3]='0'+(RH%10);
        rec_dat[4]='R';
        rec_dat[5]='H';
        rec_dat[6]=' ';
        rec_dat[7]=' ';
                                
                                rec_dat[8]='T';
                                rec_dat[9]=':';
        rec_dat[10]='0'+(TH/10);
        rec_dat[11]='0'+(TH%10);
        rec_dat[12]='C';
    }
}


void main()
{   
   InitLcd1602();   //1602初始化
   while(1)
   {   
       DHT11_delay_ms(500);    //DHT11初始1S延时1500
       DHT11_receive();
                  
                         if(shezhi==0)
                         {
                                 DHT11_delay_ms(2);
                                 if(shezhi==0)
                                {
                                         change++;
                                  if(change>3)
                                  {
                                         change=0;
                                         
                                  }
                                       
                                  }
                          }
                                
                                if(change==0)
                                {
                                        if(jia==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jia==0)
                                    {
                                                         shidul++;
                                                        if(shidul>99)
                                                        {
                                                         shidul=99;
                                                         
                                                        }
                                       
                                    }
                             }
                                         
                                         if(jian==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jian==0)
                                    {
                                                         shidul--;
                                                        if(shidul<0)
                                                        {
                                                         shidul=0;
                                                         
                                                        }
                                       
                                    }
                             }

                                }
                                
                                if(change==1)
                                {
                                        if(jia==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jia==0)
                                    {
                                                         shiduh++;
                                                        if(shiduh>99)
                                                        {
                                                         shiduh=99;
                                                         
                                                        }
                                       
                                    }
                             }
                                         
                                         if(jian==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jian==0)
                                    {
                                                         shiduh--;
                                                        if(shiduh<0)
                                                        {
                                                         shiduh=0;
                                                         
                                                        }
                                       
                                    }
                             }

                                }
                                
                                
                                
                                if(change==2)
                                {
                                        if(jia==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jia==0)
                                    {
                                                         wendul++;
                                                        if(wendul>99)
                                                        {
                                                         wendul=99;
                                                         
                                                        }
                                       
                                    }
                             }
                                         
                                         if(jian==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jian==0)
                                    {
                                                         wendul--;
                                                        if(wendul<0)
                                                        {
                                                         wendul=0;
                                                         
                                                        }
                                       
                                    }
                             }

                                }
                                
                                if(change==3)
                                {
                                        if(jia==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jia==0)
                                    {
                                                         wenduh++;
                                                        if(wenduh>99)
                                                        {
                                                         wenduh=99;
                                                         
                                                        }
                                       
                                    }
                             }
                                         
                                         if(jian==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jian==0)
                                    {
                                                         wenduh--;
                                                        if(wenduh<0)
                                                        {
                                                         wenduh=0;
                                                         
                                                        }
                                       
                                    }
                             }

                                }
        
                    showset[0]='L';
                                showset[1]=':';
                                showset[2]='0'+(shidul/10);
        showset[3]='0'+(shidul%10);
                 
                    showset[4]='H';
                                showset[5]=':';
                                showset[6]='0'+(shiduh/10);
        showset[7]='0'+(shiduh%10);
                 
                                showset[8]='L';
                                showset[9]=':';
        showset[10]='0'+(wendul/10);
        showset[11]='0'+(wendul%10);
              showset[12]='L';
                                showset[13]=':';
        showset[14]='0'+(wenduh/10);
        showset[15]='0'+(wenduh%10);
                                
                                if((shidu< shidul )|| (shidu>shiduh))
                                {
                                        beep=0;
                                       
                                }
                                else if((wendu< wendul )|| (wendu>wenduh))
                                {
                                        beep=0;
                                }
                                else
                                {
                                        beep=1;
                                }
                  LcdShowStr(0,1,showset);  //显示温湿度设置   
                        LcdShowStr(0,0,rec_dat);  //显示温湿度                     
   }
}



回复

使用道具 举报

ID:719492 发表于 2020-4-1 14:40 | 显示全部楼层
为什么我的proteus没有DHT11
回复

使用道具 举报

ID:719492 发表于 2020-4-1 14:41 | 显示全部楼层
为什么我的Proteus没有DHT11这个传感器
回复

使用道具 举报

ID:584814 发表于 2020-4-1 19:07 | 显示全部楼层
这程序拔掉DHT11试试
回复

使用道具 举报

ID:362692 发表于 2020-4-2 15:14 来自手机 | 显示全部楼层
只接一个LCD试试,有没有显示,没显示可能就是LCD部分的程序问题
回复

使用道具 举报

ID:304751 发表于 2020-4-4 01:47 | 显示全部楼层
384749736 发表于 2020-4-1 14:40
为什么我的proteus没有DHT11

用8.9试试
回复

使用道具 举报

ID:745454 发表于 2020-5-7 18:23 | 显示全部楼层
刚好学习了谢谢楼主
回复

使用道具 举报

ID:302325 发表于 2020-5-7 22:05 | 显示全部楼层
多半是时序问题吧
回复

使用道具 举报

ID:440553 发表于 2020-5-8 00:40 | 显示全部楼层
while(Data==0);   //等待数据    ,可能会死循环在DTH11程序中。在这个while中写一个超时跳出等待的语句
回复

使用道具 举报

ID:746593 发表于 2020-5-8 08:48 | 显示全部楼层
会不会是仿真哪里出错了?你检查一下仿真
回复

使用道具 举报

ID:420836 发表于 2020-5-8 08:49 | 显示全部楼层
通常说的是真实电路有效,但模拟可能无效。非常奇怪
回复

使用道具 举报

ID:739545 发表于 2020-5-8 09:03 | 显示全部楼层
仿真和实际有差异,参考下网上的LCD1602显示程序
回复

使用道具 举报

ID:746607 发表于 2020-5-8 09:21 | 显示全部楼层
可以直接在keil跑片上仿真,也可以看变量值
回复

使用道具 举报

ID:748033 发表于 2020-5-15 01:02 | 显示全部楼层
按键功能都实现不了!
回复

使用道具 举报

ID:752299 发表于 2020-5-15 09:23 | 显示全部楼层
选择实物类的比较简单
回复

使用道具 举报

ID:753788 发表于 2020-5-17 10:15 | 显示全部楼层
为什么我单片机烧进去程序不行啊,难过
回复

使用道具 举报

ID:745454 发表于 2020-5-17 12:32 | 显示全部楼层
按键模块好像有问题
回复

使用道具 举报

ID:755472 发表于 2020-5-20 13:22 | 显示全部楼层
应该是protues软件支持兼容性不好,建议用最新的版本
回复

使用道具 举报

ID:780711 发表于 2020-6-16 13:28 | 显示全部楼层
楼主解决了吗?是时序问题吗?该怎么调呢?
回复

使用道具 举报

ID:600952 发表于 2020-6-16 14:10 | 显示全部楼层
bobo233 发表于 2020-5-8 00:40
while(Data==0);   //等待数据    ,可能会死循环在DTH11程序中。在这个while中写一个超时跳出等待的语句

我同意你的观点,不知楼主解决了没有
回复

使用道具 举报

ID:600952 发表于 2020-6-16 14:13 | 显示全部楼层
唉,仿真就是这样,总会出现各种各样的问题,很让人摸不到头脑,(我发现大部分24小时必答的问题都是关于仿真的)这大概就是仿真程序需要完善的地方了
回复

使用道具 举报

ID:633896 发表于 2020-7-7 12:06 | 显示全部楼层
看看是不是时钟的问题  比如你的实物用的是11.0592Mhz 你的仿真用的是12Mhz 可能结果就不一样。传感器对延时要求是很高的、
回复

使用道具 举报

ID:595237 发表于 2020-7-7 21:48 | 显示全部楼层
按键仿真  电平不正常,,LCD仿真能够显示  ,有时候不显示,真的莫名其妙
回复

使用道具 举报

ID:595237 发表于 2020-7-7 23:49 | 显示全部楼层
1.png

可以显示,按键不灵活
回复

使用道具 举报

ID:541982 发表于 2020-7-8 10:22 | 显示全部楼层
单片机要设置参数
回复

使用道具 举报

ID:510861 发表于 2020-7-8 12:27 来自手机 | 显示全部楼层
我的1602就是显示不了解
回复

使用道具 举报

ID:327265 发表于 2020-7-8 17:24 | 显示全部楼层
断点仿真看时序,直接明了
回复

使用道具 举报

ID:235954 发表于 2020-7-12 07:13 | 显示全部楼层
时序问题,应该开在等着忙时序,数据没能读回来
回复

使用道具 举报

ID:1027159 发表于 2022-5-22 16:49 | 显示全部楼层
楼主 我也是一样的问题  接线仿真都一样 实物可以 仿真数据在液晶上面读不了
回复

使用道具 举报

ID:161164 发表于 2022-5-23 13:18 | 显示全部楼层
小灰灰灰灰 发表于 2022-5-22 16:49
楼主 我也是一样的问题  接线仿真都一样 实物可以 仿真数据在液晶上面读不了

部份版本的Protues LCD1602仿真不支援查忙 于是你的程序在while (sta & 0x80);中死循环了
回复

使用道具 举报

ID:1010970 发表于 2023-4-20 10:46 | 显示全部楼层
检查一下仿真的电路有没有连错
回复

使用道具 举报

ID:1041416 发表于 2023-11-20 19:55 | 显示全部楼层
试了,不行啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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