找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6448|回复: 4
收起左侧

DHT11温湿度测量12864显示

  [复制链接]
ID:247090 发表于 2017-12-9 19:51 | 显示全部楼层 |阅读模式
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*端口定义*/
sbit rw=P2^5;
sbit rs=P2^6;
sbit en=P2^7;
sbit psb=P3^2;
sbit dht_dat=P0^2; //用哪个I/O口自选,注意不要用P3口
uchar dht_num=0; //用于while循环中计数,超时则跳出循环
uchar code table[]={"温度:"};
uchar code table1[]={"湿度:"};
uchar code table2[]={"℃"};
uchar dht_d1=0,dht_d2=0        ;        //依次为湿度整数部分和湿度小数部
uchar dht_t1=0,dht_t2=0        ;  //依次为温度整数部分和温度小数部分
uchar dht_j=0;        //和校验,可选择是否使用,具体参照数据手
uchar i,t11,t12,d11,d12;
uchar t21,t22,d21,d22;
/*****************ms延时函数*********************************/
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
/*****************us延时函数*****************************/
void delay_10us()
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}
/*写指令函数*/
/*rs=l,rw=l,en=高脉冲,D0-D7=指令码。*/
void write_cmd(uchar cmd)
{
        rs=0;
        rw=0;
        en=0;
        P0=cmd;
        delay(5);
        en=1;
        delay(5);
        en=0;
}
/***************************写显示数据************************/
/*rs=h,rw=l,*/
void write_dat(uchar date)
{
rs=1;
rw=0;
en=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
/*****************初始化************************/
void init()
{       
        en=0;
        rw=0;
        psb=1;                  //并口方式

        write_cmd(0x30);                //基本指令操作
        delay(5);
        write_cmd(0x0c);                //显示开,关光标
        delay(5);
        write_cmd(0x06);
    delay(2);
        write_cmd(0x01);                //清除显示内容
        delay(5);
                               
                                                                                                       
}
void dht_init()
{
   delay(1000);          //DHT11上电前准备时间,大概1s
   dht_dat=1;             //         //总线准备
}
uchar read_date()        //接收一个8位数据,先高位后低位
{
        uchar i,dat;
        for(i=0;i<8;i++)   //也就是说程序是循环八次,把判断有“1”输出到dat中,然后输出一个八位的数据。
        {
                dht_num=2;
                while((dht_dat==0)&&(dht_num++)); //dht_dat 数据线由DH11拉低准备发送数据
                delay_10us();
                                delay_10us();
                delay_10us();
                                delay_10us();
                dat=dat<<1;
                if(dht_dat==1)
                {
                        dht_num=2;
                        dat=dat|0x01;  //如果来自DQ的数据是高电平1,则把1放到dat的最低位
                        while((dht_dat==1)&&(dht_num++));

                }
        }
        return dat;        
}

void get_temp()        //给DHT11一个开始信号,然后读取一次数据,共五个8位字节
{
        dht_dat=0;
        delay(25);
        dht_dat=1;        //单片机给起始脉冲信号

        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
        dht_dat=1;         //稍作延时,等待DHT11返回响应(响应为低电 平)
        if(dht_dat==0)         //有响应才接收数据,否则不作处理
        {
                dht_num=2;
                while((dht_dat==0)&&(dht_num++));
                dht_num=2;
                while((dht_dat==1)&&(dht_num++));
                dht_d1=read_date();
                dht_d2=read_date();
                dht_t1=read_date();
                dht_t2=read_date();
                dht_j=read_date(); //一次读出五个数据
        }
        dht_dat=1;        //释放总线
        delay(10);

        d11=dht_d1/10;
        d12=dht_d1%10;
        t11=dht_t1/10;
        t12=dht_t1%10;
               
                d21=dht_d2/10;
        d22=dht_d2%10;
        t21=dht_t2/10;
        t22=dht_t2%10;
                                  
}
void main()
{
        dht_init();
        init();                                    
   while(1)
   {
                get_temp();
               
       
               
               
                write_cmd(0x80);
                for(i=0;i<6;i++)
                {
                write_dat(table[i]);
                }
                write_cmd(0x83);       
                write_dat(0x30+t11);
                write_dat(0x30+t12);
                                write_cmd(0x80+4);
                                write_dat('.');                                        
                write_dat(0x30+t21);
                write_cmd(0x85);                               
                write_dat(0x30+t22);                                                      
                write_cmd(0x86);
        for(i=0;i<4;i++)
        {
         write_dat(table2[i]);                                  
        }

                write_cmd(0x90);
        for(i=0;i<6;i++)
        {
          write_dat(table1[i]);
        }
                write_cmd(0x93);
        write_dat(0x30+d11);
                write_dat(0x30+d12);
                write_cmd(0x94);
                write_dat('.');                                               
                write_dat(0x30+d21);
                write_cmd(0x95);
                write_dat(0x30+d22);
                write_cmd(0x96);
        write_dat('%');                                                                                                                                                                                                           
   }
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:323185 发表于 2018-7-14 16:07 | 显示全部楼层
正在找DHT11温湿度与12864显示,谢谢分享。
回复

使用道具 举报

ID:428518 发表于 2018-11-20 00:58 | 显示全部楼层
感谢分享,楼主好人
回复

使用道具 举报

ID:306293 发表于 2018-11-24 22:53 | 显示全部楼层
谢谢楼主 真的好用
回复

使用道具 举报

ID:318492 发表于 2019-4-18 14:04 | 显示全部楼层
一下解决一个麻烦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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