找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
回帖奖励 90 黑币 回复本帖可获得 30 黑币奖励! 每人限 3 次
跳转到指定楼层
楼主

#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);  //显示温湿度                     
   }
}



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

使用道具 举报

沙发
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试试
回复

使用道具 举报

5#
ID:362692 发表于 2020-4-2 15:14 来自触屏版 | 只看该作者
只接一个LCD试试,有没有显示,没显示可能就是LCD部分的程序问题
回复

使用道具 举报

6#
ID:304751 发表于 2020-4-4 01:47 | 只看该作者
384749736 发表于 2020-4-1 14:40
为什么我的proteus没有DHT11

用8.9试试
回复

使用道具 举报

7#
ID:745454 发表于 2020-5-7 18:23 | 只看该作者
刚好学习了谢谢楼主
回复

使用道具 举报

8#
ID:302325 发表于 2020-5-7 22:05 | 只看该作者
多半是时序问题吧
回复

使用道具 举报

9#
ID:440553 发表于 2020-5-8 00:40 | 只看该作者
while(Data==0);   //等待数据    ,可能会死循环在DTH11程序中。在这个while中写一个超时跳出等待的语句
回复

使用道具 举报

10#
ID:746593 发表于 2020-5-8 08:48 | 只看该作者
会不会是仿真哪里出错了?你检查一下仿真
回复

使用道具 举报

11#
ID:420836 发表于 2020-5-8 08:49 | 只看该作者
通常说的是真实电路有效,但模拟可能无效。非常奇怪
回复

使用道具 举报

12#
ID:739545 发表于 2020-5-8 09:03 | 只看该作者
仿真和实际有差异,参考下网上的LCD1602显示程序
回复

使用道具 举报

13#
ID:746607 发表于 2020-5-8 09:21 | 只看该作者
可以直接在keil跑片上仿真,也可以看变量值
回复

使用道具 举报

14#
ID:748033 发表于 2020-5-15 01:02 | 只看该作者
按键功能都实现不了!
回复

使用道具 举报

15#
ID:752299 发表于 2020-5-15 09:23 | 只看该作者
选择实物类的比较简单
回复

使用道具 举报

16#
ID:753788 发表于 2020-5-17 10:15 | 只看该作者
为什么我单片机烧进去程序不行啊,难过
回复

使用道具 举报

17#
ID:745454 发表于 2020-5-17 12:32 | 只看该作者
按键模块好像有问题
回复

使用道具 举报

18#
ID:755472 发表于 2020-5-20 13:22 | 只看该作者
应该是protues软件支持兼容性不好,建议用最新的版本
回复

使用道具 举报

19#
ID:780711 发表于 2020-6-16 13:28 | 只看该作者
楼主解决了吗?是时序问题吗?该怎么调呢?
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

23#
ID:595237 发表于 2020-7-7 21:48 | 只看该作者
按键仿真  电平不正常,,LCD仿真能够显示  ,有时候不显示,真的莫名其妙
回复

使用道具 举报

24#
ID:595237 发表于 2020-7-7 23:49 | 只看该作者


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

使用道具 举报

25#
ID:541982 发表于 2020-7-8 10:22 | 只看该作者
单片机要设置参数
回复

使用道具 举报

26#
ID:510861 发表于 2020-7-8 12:27 来自触屏版 | 只看该作者
我的1602就是显示不了解
回复

使用道具 举报

27#
ID:327265 发表于 2020-7-8 17:24 | 只看该作者
断点仿真看时序,直接明了
回复

使用道具 举报

28#
ID:235954 发表于 2020-7-12 07:13 | 只看该作者
时序问题,应该开在等着忙时序,数据没能读回来
回复

使用道具 举报

29#
ID:1027159 发表于 2022-5-22 16:49 | 只看该作者
楼主 我也是一样的问题  接线仿真都一样 实物可以 仿真数据在液晶上面读不了
回复

使用道具 举报

30#
ID:161164 发表于 2022-5-23 13:18 | 只看该作者
小灰灰灰灰 发表于 2022-5-22 16:49
楼主 我也是一样的问题  接线仿真都一样 实物可以 仿真数据在液晶上面读不了

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

使用道具 举报

31#
ID:1010970 发表于 2023-4-20 10:46 | 只看该作者
检查一下仿真的电路有没有连错
回复

使用道具 举报

32#
ID:1041416 发表于 2023-11-20 19:55 | 只看该作者
试了,不行啊
回复

使用道具 举报

33#
ID:1138038 发表于 2024-11-29 17:20 | 只看该作者
可不以用在DHT11控制步进电机上
回复

使用道具 举报

34#
ID:1138038 发表于 2024-11-29 17:21 | 只看该作者
实物可以显示温度但是仿真显示不出来,是不是参数设置问题
回复

使用道具 举报

35#
ID:583948 发表于 2024-12-2 09:11 | 只看该作者
可以先排除一下硬件是否一致,仿真和实物还是有差距的。其次把温湿度传感器拔了,看看能否显示。最后在主循环里只写显示函数,比如显示数字什么的。这样会很快排查到问题在哪。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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