打印

DHT11温湿度传感器

[复制链接]
797|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
YANG5815|  楼主 | 2016-8-30 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在玩温湿度传感器DHT11、能显示、但是显示的数据不对、大概为正常值的一半左右的样子、我翻阅资料发现像这类的单总线数据传输的模块、对于延时非常精准、我的延时程序基本跟着使用手册写的、但是就是不能正确显示、恳请各路大神指点、下面是我的程序、
#include<lcd1602.h>
#include<dht11.h>
#define uint unsigned int
#define uchar unsigned char
uchar data_byte;
uchar RH,RL,TH,TL;
float R,T;
void delay1()                                                  //8us+延时
{
        uchar i;
        for(i=0;i<1;i++);       
}
void start()
{
        io=1;
        delay1();
        io=0;
        delay(25);                         //总线拉低至少18ms、保证DHT11能检测到起始信号
        io=1;                                 //发送开始信号结束后、拉高总线20-40us
        delay1();delay1();delay1();                          //24us+
}
uchar receive_byte()
{
        uchar i,temp;
        for(i=0;i<8;i++)
        {
                while(!io);                         //等待50us的低电平开始信号结束
                delay1();delay1();delay1();                         //开始信号结束之后、延时26-28us
                temp=0;                           //时间为26us-28us表示接收的为数据'0'
                if(io==1)
                temp=1;                                   //如果26us-28us之后还为高电平则表示接收的数据为'1'
                while(io);                          //等待数据信号高电平'0'为26us-28us'1'为70us
                data_byte<<=1;                   //接收的数据为高位在前右移
                data_byte|=temp;
        }
        return data_byte;
}
void receive()
{
        uchar T_H,T_L,R_H,R_L,check,num_check,i;
        start();                   //开始信号
        io=1;                           //主机设为输入判断从机DHT11响应信号
        if(!io)                           //判断从机是否有低电平响应信号
        {
                while(!io);                  //判断从机发出 80us 的低电平响应信号是否结束
                while(!io);                  //判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
                R_H=receive_byte();                  //湿度高位
                R_L=receive_byte();
                T_H=receive_byte();                        //温度高位
                T_L=receive_byte();
                check=receive_byte();                  
                io=0;
                for(i=0;i<7;i++)                         //当最后一bit数据接完毕后从机拉低电平50us
                delay1();delay1();delay1();delay1();delay1();delay1();delay1();
                io=1;                        //总线由上拉电阻拉高进入空闲状态
                num_check=R_H+R_L+T_H+T_L;
                if(num_check==check)                        //判断读到的四个数据之和是否与校验位相同
                {
                        RH=R_H;
                        RL=R_L;
                        TH=T_H;
                        TL=T_L;
                        check=num_check;
                }
        }
}
void dhtdisplay()
{
        receive();
        lcddisplay(0x40,'R');
        lcddisplay(0x41,':');
        lcddisplay(0x42,(RH/10+0x30));
        lcddisplay(0x43,(RH%10+0x30));
        lcddisplay(0x44,0x2e);
        lcddisplay(0x45,(RL%10+0x30));
        lcddisplay(0x46,'%');
        lcddisplay(0x48,'T');
        lcddisplay(0x49,':');
        lcddisplay(0x4a,(TH/10+0x30));
        lcddisplay(0x4b,(TH%10+0x30));
        lcddisplay(0x4c,0x2e);
        lcddisplay(0x4d,(TL%10+0x30));
        lcddisplay(0x4e,0xdf);
        lcddisplay(0x4f,0x43);
}
头文件
#ifndef _dht11_h_
#define _dht11_h_

#include<reg52.h>
#include<intrins.h>

sbit io=P3^4;

void start();
uchar receive_byte();
void receive();
void dhtdisplay();

#endif

相关帖子

沙发
ky_21ic| | 2016-8-30 22:28 | 只看该作者
DHT11已经很落后了,它的升级版DHT22比它好很多。价钱也贵一些。源代码我都有。

使用特权

评论回复
板凳
llh1979| | 2016-8-30 23:28 | 只看该作者
还有一些价格不错的芯片,可以慢慢找下,你的问题最好是弄一个波形来

使用特权

评论回复
地板
ningling_21| | 2016-8-31 08:35 | 只看该作者
http://wenku.baidu.com/view/d99ca5cad5bbfd0a79567366.html

何不试试已经调试好的程序

使用特权

评论回复
5
liufabing| | 2016-8-31 20:01 | 只看该作者
前段时间用了这个,不过是汇编的,按协议做就可以了.用个逻辑分析仪吧,容易分析问题.
while(!io);                         //等待50us的低电平开始信号结束
另外像上面这种等待注意做超时处理.如果程序有中断,需要注意中断运行对延时的影响.

使用特权

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

本版积分规则

6

主题

37

帖子

0

粉丝