找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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