找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2562|回复: 2
收起左侧

关于用DH11 和89c52测湿度代码

[复制链接]
ID:252122 发表于 2017-11-21 23:26 | 显示全部楼层 |阅读模式
#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar DHT11[5],RTflag=0;
uchar FLAG; //超时标志位
uchar a;
sbit dat=P2^7;
sbit RS=P2^3;
sbit RW=P2^4;
sbit EN=P2^5;
uchar table[5];
uint wd,sd;

void Delay_t(uint j)
{        
        uchar i;
        for(;j>0;j--)
                {
                        for(i=0;i<27;i++);
                }
}

void Delay_10us(void) //10us延时函数

{
        uchar i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}

void delay(uint z)//1毫秒延时函数
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void lcd_write_com(uchar com) //1602写指令
{
        RS=0;
        RW=0;
        EN=1;
        P0=com;
        delay(1);
        EN=0;
}

void lcd_init()        //1602初始化
{
        lcd_write_com(0x38);
        delay(1);
        lcd_write_com(0x08);
        delay(1);
        lcd_write_com(0x01);//1602清屏指令
        delay(1);
        lcd_write_com(0x06);
        delay(1);
        lcd_write_com(0x0C);
        delay(1);
}

void lcd_write_data(uchar date)//1602写数据
{
        RS=1;
        RW=0;
        EN=1;
        P0=date;
        delay(1);
        EN=0;
}

void write_str(uchar x,uchar y,uchar *s)//在任意地址写符号字母或数字
{
        if(y==0)
                lcd_write_com(0x80+x);
        else
                lcd_write_com(0xc0+x);
        while(*s)
        {
                lcd_write_data(*s);
                s++;
        }
}

        void write_shu(uchar x,uchar y,uchar num)//数据显示函数
{
        uchar s,g;
        if(y==0)
                lcd_write_com(0x80+x);
        else
                lcd_write_com(0xc0+x);
        s=num/10;// 数据分离显示
        lcd_write_data(0x30+s);
        g=num%10;//数据分离显示
        lcd_write_data(0x30+g);
}

uchar write_byte1() //读一个字节
{
        uchar i,comdata,temp1;
        for(i=0;i<8;i++)
        {
                FLAG=2;
                while((!dat)&&FLAG++);//判断数据位是0还是1
                Delay_10us();       
                Delay_10us();
                Delay_10us();
                temp1=0;
        if(dat)temp1=1;        // 如果高电平高过预定0高电平值则数据位为 1
                FLAG=2;
        while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1 uchar型变量 flag 溢出变为0 再自加1
        if(FLAG==1)break;        //超时则跳出for循环
        comdata<<=1;//左移一位 高位在前 低位在后
        comdata|=temp1;
        }
        return (comdata);

}

void DHT11_5() //读5个字节数据 两个字节为温度数据 两个字节为湿度数据 最后一个字节为校验

{

        uchar i,temp;
        //主机拉低18ms
        dat=0;
        Delay_t(180);
        dat=1;
        //总线由上拉电阻拉高 主机延时20us
        Delay_10us();
        Delay_10us();
        Delay_10us();
        Delay_10us();
        //主机设为输入 判断从机响应信号
        dat=1;
        //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
        if(!dat)        //T !
        {
                FLAG=2;        //超时标志位
                while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
                FLAG=2;
                while(
                (dat)&&FLAG++); //判断从机拉高80us是否结束
                for(i=0;i<5;i++)//数据接收状态
                {
                        DHT11[i]=write_byte1();
                }
                dat=1;        //释放数据总线 为下一次读取做好准备
                temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
                if(temp==DHT11[4])        //数据校验
                {
                        RTflag=1;
                }
                if(RTflag==1) //如果RTflag=1 说明读取到得数据正确
                {
                        RTflag=0;
                //        tm[0]=DATARHT[0]/10;
                //        tm[1]=DATARHT[0]%10;
                //        tm[2]=DATARHT[1]/10; //湿度
                //        tm[3]=DATARHT[2]/10;
                //        tm[4]=DATARHT[2]%10;
                //        tm[5]=DATARHT[3]/10; //温度
                write_str(0,0,"measurement ");//第一行显示湿度
                write_shu(12,0,DHT11[0]);
                write_str(14,0,"RH");
                write_str(0,1,"Temperature ");//第二行为显示温度
                write_shu(12,1,DHT11[2]);
                write_str(14,1,"^C");
                }
        }
}

void main()

{
        lcd_init(); //1602初始化
        delay(1000); //等待DHT11温湿度传感器数据稳定 开始激活DHT11
        while(1)//循环读取 并更新数据显示
        {
                delay(1000);//等待DHT11温湿度传感器数据稳定 开始激活DHT11
                write_byte1();//读一个字节
                DHT11_5(); //读数据
                delay(1000); //延时等待
        }
}

回复

使用道具 举报

ID:860754 发表于 2021-7-20 17:34 | 显示全部楼层
楼主,能留下原理图码,我好需要
回复

使用道具 举报

ID:895444 发表于 2022-3-25 11:00 | 显示全部楼层
protues没有DHT11,怎么整
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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