数字温度湿度测量proteus仿真+LCD1602显示--显示小数点后一位并且添加按键矫正

原有DHT11+LCD1602显示温湿度采集代码,如下:

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^6;   
uchar rec_dat[7];   
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
void delay(uint n)
{  uint x,y; 
   for(x=n;x>0;x--) 
       for(y=110;y>0;y--); 

void write_com(uchar com)
{
        lcdrs=0;                        
        P0=com;
        delay(5);
        lcden=1;                        
        delay(5);
        lcden=0;                      
}
void write_dat(uchar dat)
{
        lcdrs=1;                         
        P0=dat;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init_lcd()
{
        lcden=0;
        lcdrw=0;
        write_com(0x38);          
        write_com(0x0c);         
        write_com(0x06);         
        write_com(0x01);
}
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]='%';
        rec_dat[3]=' ';
        rec_dat[4]=' ';
        rec_dat[5]='0'+(TH/10);
        rec_dat[6]='0'+(TH%10); 
    }
}
void main()
{
   uchar i;   
   init_lcd();   
   while(1)
   {   
       DHT11_delay_ms(100);    
       DHT11_receive();
       write_com(0x80);   
       for(i=0;i<7;i++)
       write_dat(rec_dat[i]);   
       write_dat(rec_dat[7]);
    write_dat(0xdf);
    write_dat('C');                          
   }
}

但是,LCD显示屏显示位数只显示到个位数,精度较低;并且不能够调整误差。如图所示:

接下来修改代码使其显示一位小数,因为存在时间漂移和温度漂移,所以添加4个按键Key1~Key4,可对设备进行手动校正。修改后代码如下:

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^6;   
uchar rec_dat[10];   
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;

sbit Key1=P3^0;
sbit Key2=P3^1;
sbit Key3=P3^2;
sbit Key4=P3^3;
int a=0,b=0;
void delay(uint n)
{  uint x,y; 
   for(x=n;x>0;x--) 
       for(y=110;y>0;y--); 

void write_com(uchar com)
{
        lcdrs=0;                        
        P0=com;
        delay(5);
        lcden=1;                        
        delay(5);
        lcden=0;                      
}
void write_dat(uchar dat)
{
        lcdrs=1;                         
        P0=dat;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init_lcd()
{
        lcden=0;
        lcdrw=0;
        write_com(0x38);          
        write_com(0x0c);         
        write_com(0x06);         
        write_com(0x01);
}
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+a)/10);
        rec_dat[1]='0'+((RH+a)%10);
        rec_dat[2]='.';
        rec_dat[3]='0'+1;
        rec_dat[4]='%';
        rec_dat[5]=' ';
        rec_dat[6]=' ';
        rec_dat[7]='0'+((TH+b)/10);
        rec_dat[8]='0'+((TH+b)%10);
        rec_dat[9]='.';
        rec_dat[10]='0'+2;
    }
}
void main()
{
   uchar i;      
   init_lcd();   
   while(1)
   {   
      if(Key1==0)
    {
      delay(30);
      a+=1;
    }
    if(Key2==0)
    {
      delay(30);
      a-=1;
    }
    if (Key3==0)
    {
      delay(30);
      b+=1;
    }
    if (Key4==0)
    {
      delay(30);
      b-=1;
    }
       DHT11_delay_ms(100);    
       DHT11_receive();
       write_com(0x80);   
       for(i=0;i<10;i++)
       write_dat(rec_dat[i]);   
       write_dat(rec_dat[10]);
    write_dat(0xdf);
    write_dat('C');                          
   }
}

演示视频如下:

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果 Proteus 仿真LCD1602 显示不正常,可能是以下几种情况造成的: 1. LCD1602 模型配置错误,请检查模型的设置是否正确。 2. 代码中 LCD1602 初始化部分存在错误,请检查初始化代码。 3. 代码中 LCD1602 控制部分存在错误,请检查控制代码。 4. 代码中 LCD1602 数据部分存在错误,请检查数据代码。 如果您无法找到问题所在,您可以尝试重新检查您的代码,或者在网上查找其他人遇到类似问题的解决方案。 ### 回答2: 在进行 Proteus 仿真过程中,可能会遇到 LCD1602 不显示的问题,有几个原因可能导致该问题发生。 首先,可能是 Proteus 软件本身存在问题。在这种情况下,可以尝试更新 Proteus 软件版本,也可以尝试重新安装软件。 其次,可能是电路连接出现了问题。 确认电路中的所有元件和线路都正确连接,没有错误的接线或者短路等情况。 特别是确保LCD 的VSS 引脚,对接地引脚,VDD 引脚,对 + 电源引脚的连接正确无误。 第三种情况,可能是代码中存在问题。LCD1602 的仿真需要正确的代码来初始化并控制它。例如,确保程序中使用的库文件和指令集正确无误。这包括对延时功能的要求,正确的数据指令等。尽可能保证和实际硬件的接口一致,避免错误的操作。 如果以上方法都没能解决问题,建议使用实际硬件测试,确保硬件工作正常,然后再进行仿真过程,排除其他可能的因素。确保上电、启动项是正常的。此后再进行代码的测试,调试问题。最终实现正确的 LCD1602 显示。 总之,Proteus 仿真LCD1602不显示,应该从电路连接、Proteus 软件版本、硬件工作、代码等多个方面进行排查,及早发现和解决问题,最终实现正常的 LCD1602 显示。 ### 回答3: 首先,Proteus是一款常用于电子电路仿真的软件,而LCD1602是一种常用的字符型液晶显示屏。在仿真过程中,有可能遇到LCD1602不显示的问题。以下是可能的原因和解决方法: 1. 电路连接错误:检查电路板上LCD1602的引脚是否正确连接到单片机或其他驱动器。确认是否存在接触不良或焊接问题。 2. 缺少初始化:在程序开始时,需要对LCD1602进行初始化,以确保它能够正确地显示字符。检查代码中是否正确添加了初始化代码,且参数设置是否正确。 3. 电压不稳定:检查电源电压是否稳定。如果电源电压不稳定,将影响LCD1602的正常工作,导致不显示字符或显示异常。需要检查电源电压是否满足工作要求,或加入脉冲滤波电路。 4. 软件问题:可能存在程序中的逻辑或语法错误。检查代码中是否有语法错误,或是否写入正确的逻辑,确保程序运行正常。 5. 频率错误:使用的驱动器需要特定的时钟频率。检查时钟频率是否正确,以及时钟信号是否符合驱动器的需求。如果频率错误,将导致不显示显示异常。 6. 背光电路问题:对于背光型液晶显示屏,需要在电路板上接入背光电源。检查背光电路是否正确连接,或背光电源是否稳定。 总之,如果遇到LCD1602不显示的问题,需要仔细检查连接、初始化、软件、电压、频率以及背光电路等多个方面,寻找可能的原因,逐一排除,确保电路能够正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值