打印
[51单片机]

请大神帮忙看看问题在哪,基于单片机的温湿度检测

[复制链接]
977|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
scx2006114|  楼主 | 2015-12-28 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码;
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Data  P0    //数据端口
/*****1602管脚定义*****/
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
unsigned char flag;//DHT11函数用到
/****************************/
sbit  DHT=P3^7;
uchar  WEN1[]="wen:16.00-28.00";         //温度第一行数据
uchar  WEN2[]="      00.00   ";   //温度第二行数据
uchar  SHI1[]="shi:30.00-70.00";         //湿度第一行数据
uchar  SHI2[]="      00.00  ";   //湿度第二行数据
unsigned char shiZ,shiX,wenZ,wenX,check;
unsigned char tr_shiZ,tr_shiX,tr_wenZ,tr_wenX;

/*********延时*******************************/
void delay_1ms(uint x)
  {
    uchar i;
    while(x--)
    for(i=0;i<120;i++);
  }
void delay_10us()
  {
                unsigned char i;
                i--;
                i--;
                i--;
                i--;
                i--;
                i--;
  }
/*******1602显示*******************************************/
/**********写命令**********/
void lcd_write_com(uchar c)          
  {
    delay_1ms(5);//操作前短暂延时,保证信号稳定
    E=0;
    RS=0;
    RW=0;
    _nop_();
    E=1;
    Data=c;
    E=0;
  }
/**********写数据*************/
void lcd_write_dat(uchar c)                 
  {
    delay_1ms(5);  //操作前短暂延时,保证信号稳定
    E=0;
    RS=1;
    RW=0;
    _nop_();
    E=1;
    Data=c;
    E=0;
    RS=0;
  }
/**********LCD初始化********/
void lcd_init()          
  {
    delay_1ms(15);
    lcd_write_com(0x38); //display mode
    lcd_write_com(0x38); //display mode
    lcd_write_com(0x38); //display mode
    lcd_write_com(0x06); //显示光标移动位置
    lcd_write_com(0x0c); //显示开及光标设置
    lcd_write_com(0x01); //显示清屏
  }
/*********显示单个字符**********/
void ShowChar(uchar pos,uchar c)  
  {
    unsigned char p;
     if (pos>=0x10)
       p=pos+0xb0; //是第二行则命令代码高4位为0xc
     else
       p=pos+0x80; //是第二行则命令代码高4位为0x8
    lcd_write_com(p);//写命令
    lcd_write_dat(c);   //写数据
  }
/*********显示字符串**********/
void ShowString (uchar line,char *ptr)          
  {
    unsigned char l,*p;
    p=ptr;
    l=line<<4;
     while((*p)!='\0')
       {
          ShowChar(l++,*(p));
                                                p++;
        }
  }
/*********温度显示函数***********/
void WENdisp(void)          
  {
                ShowString(0,WEN1);
                _nop_();   
                ShowString(1,WEN2);
  }
/*********湿度显示函数***********/
void SHIdisp(void)          
  {
    ShowString(0,SHI1);
    _nop_();
    ShowString(1,SHI2);
  }

/*************************传感器函数************************/
/**************DHT测试**************/
/******温湿度读取函数*******/
char DHTread_data()
  {
                unsigned char i,num,temp;
                num=0;
                for(i=0;i<8;i++)
                          {
                                flag=2;
                                while((!DHT)&&flag++);
                                delay_10us();
                                delay_10us();
                                delay_10us();
                                if(DHT==1)
                                          {
                                                temp=1;
                                                flag=2;
                                                while(DHT&&flag++);                               
                                          }
                                else
                                        temp=0;
                                        num<<=1;
                                        num|=temp;
                          }
                return(num);
  }
/********初始化及采集程序*********/
void DHTread_init()
  {
    DHT=0;                  //主机使DHT11低电平并延时至少18ms
    delay_1ms(21);
    DHT=1;                  //主机置DHT11高电平20~40us,并等待从机相应
    delay_10us();
    delay_10us();
    delay_10us();
    DHT=1;
    if(!DHT)  //从机发出相应信号
      {
                                flag=2;
                                while((!DHT)&&flag++);
                                flag=2;
                                while(DHT&&flag++);        //开始采集数据
                                tr_shiZ=DHTread_data();//采集湿度整数部分
                                tr_shiX=DHTread_data();//采集湿度小数部分
                                tr_wenZ=DHTread_data();//采集温度整数部分
                                tr_wenX=DHTread_data();//采集温度小数部分
                                check=DHTread_data();        //采集校验位
                                DHT=1;
      }                                  
  }
/*********显示测试结果*********/
void DHT11()
  {
           unsigned char temp;
            {
                       DHTread_init();
                       temp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX;
                             if(check==temp)
                               {
                                         shiZ=tr_shiZ;
                             shiX=tr_shiX;
                             wenZ=tr_wenZ;
                             wenX=tr_wenX;
                    }
           WEN2[6]='0'+wenZ/10;
           WEN2[7]='0'+wenZ%10;       
           WEN2[9]='0'+wenX/10;
           WEN2[10]='0'+wenX%10;
           SHI2[6]='0'+shiZ/10;
           SHI2[7]='0'+shiZ%10;
           SHI2[9]='0'+shiX/10;
           SHI2[10]='0'+shiX%10;
            }
  }

void main()
  {
       lcd_init();
       DHTread_init();
       delay_1ms(50);
       while(1)
       {
           
           DHT11();
           WENdisp();
           SHIdisp();
       }
  }       

电路原理图:P0口接LCD1602的D0~D7,RS接P2^6 ,RW接P2^5,E接P2^7,仿真上能显示出
但实物图LCD1602上只显示方块,最小系统没有问题
接上传感器DHT11也没有反应,请大神帮忙修改下,谢谢!

相关帖子

沙发
gaoxueyan| | 2015-12-28 11:22 | 只看该作者
可能与液晶有关,液晶分字符型和点阵型的,两个显示操作是有区别的

使用特权

评论回复
板凳
scx2006114|  楼主 | 2015-12-28 12:39 | 只看该作者
gaoxueyan 发表于 2015-12-28 11:22
可能与液晶有关,液晶分字符型和点阵型的,两个显示操作是有区别的

使用的是1602A字符型液晶

使用特权

评论回复
地板
gaoxueyan| | 2015-12-29 11:37 | 只看该作者
就是调用自字符,不是打点

使用特权

评论回复
5
ningling_21| | 2015-12-29 11:43 | 只看该作者
很明显是LCD的驱动程序有问题,建议先调通1602显示程序,网上的例程一大把

使用特权

评论回复
6
qq4988| | 2015-12-29 11:58 | 只看该作者
需要调整一下1602的时序,加延时或者去延时什么的

使用特权

评论回复
7
scx2006114|  楼主 | 2015-12-30 13:22 | 只看该作者
gaoxueyan 发表于 2015-12-29 11:37
就是调用自字符,不是打点

哦哦,谢谢了!

使用特权

评论回复
8
scx2006114|  楼主 | 2015-12-30 13:23 | 只看该作者
ningling_21 发表于 2015-12-29 11:43
很明显是LCD的驱动程序有问题,建议先调通1602显示程序,网上的例程一大把

好的,谢谢了!

使用特权

评论回复
9
scx2006114|  楼主 | 2015-12-30 13:25 | 只看该作者
qq4988 发表于 2015-12-29 11:58
需要调整一下1602的时序,加延时或者去延时什么的

嗯嗯,我再具体分析下,谢谢了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

17

帖子

1

粉丝