找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7243|回复: 17
收起左侧

单片机+DHT11读不出数据

  [复制链接]
ID:884998 发表于 2021-2-19 22:12 | 显示全部楼层 |阅读模式
写了一个DHT11温度计,用lcd1602显示,lcd1602的程序肯定是没错的,用了许多次。DHT11的函数里面用了while语句,所以现在就好像是卡在读取程序的函数里面了,这个模块我之前用别人的程序测试过也是好用的,延时函数由STC-isp提供,应该也没错。

下面是单片机代码
  1. void DHT11Start()     //发送开始信号
  2. {
  3.     DHT11data = 1;
  4.     DHT11data = 0;
  5.     Delay20ms();
  6.     DHT11data = 1;
  7.     Delay30us();
  8. }

  9. uchar DHT11GetByte()  //获得一组8bit数据
  10. {
  11.     uchar byte = 0;
  12.     uint i;
  13.     for(i=0;i<8;i++)
  14.     {
  15.         while(!DHT11data);
  16.         Delay30us();
  17.         Delay30us();
  18.         byte <<= 1;
  19.         if(DHT11data == 1)
  20.         { byte += 1; }
  21.         while(DHT11data);
  22.     }
  23.     return byte;
  24. }


  25. void DHT11GetData(uchar *dat)                         //获得所有数据
  26. {
  27.     uchar check,datbuffer[4]={0,0,0,0};
  28.   uchar datcheck[4]={0,0,0,0};    //湿度十位,湿度个位,温度十位,温度个位
  29.     uint i,num;
  30.    
  31.     DHT11Start();
  32.     if(DHT11data == 0)
  33.     {
  34.         while(DHT11data == 0);
  35.         Delay80us();
  36.    
  37.         datbuffer[0] = DHT11GetByte();
  38.         datbuffer[1] = DHT11GetByte();
  39.         datbuffer[2] = DHT11GetByte();
  40.         datbuffer[3] = DHT11GetByte();
  41.         
  42.         check = DHT11GetByte();
  43.         Delay30us();
  44.         num = datbuffer[0]+datbuffer[1]+datbuffer[2]+datbuffer[3];
  45.         if(check == num)
  46.             {
  47.                 for(i=0;i<4;i++)
  48.                 {
  49.                     datcheck[i] = datbuffer[i];
  50.                 }
  51.             }
  52.             dat[0] = (datcheck[0]/10)+'0';
  53.             dat[1] = (datcheck[1]%10)+'0';
  54.             dat[2] = (datcheck[2]/10)+'0';
  55.             dat[3] = (datcheck[3]%10)+'0';
  56.             
  57. //            dat[0] = (datbuffer[0]/10)+'0';
  58. //            dat[1] = (datbuffer[1]%10)+'0';
  59. //            dat[2] = (datbuffer[2]/10)+'0';
  60. //            dat[3] = (datbuffer[3]%10)+'0';

  61.     }
  62. }
复制代码


DHT11.zip

44.53 KB, 下载次数: 26

这是工程文件

回复

使用道具 举报

ID:871393 发表于 2021-2-19 22:28 | 显示全部楼层
DHT11 data是全局变量吗 在哪更新 不更新就会死在while里
回复

使用道具 举报

ID:884998 发表于 2021-2-19 22:59 来自手机 | 显示全部楼层
77599585 发表于 2021-2-19 22:28
DHT11data是全局变量吗 在哪更新 不更新就会死在while里

DHT11data不是个变量,是dht11的io口,前面有句我没放上来是,是:sbit DHT11data = P2^1
回复

使用道具 举报

ID:844772 发表于 2021-2-20 09:30 | 显示全部楼层
它不是IIC设备,你delay时间安排的不大对啊,比如while(DHT11data == 0);         Delay80us();前一句已经等待掉这80
回复

使用道具 举报

ID:884998 发表于 2021-2-20 16:59 | 显示全部楼层
glinfei 发表于 2021-2-20 09:30
它不是IIC设备,你delay时间安排的不大对啊,比如while(DHT11data == 0);         Delay80us();前一句已经 ...

你这么一说确实,这个地方相当于延迟了两遍,但我这个代码是参考别人的写的,他那个程序就能读出了,我的就不行,我把那个delay80删除之后还是读不出来
回复

使用道具 举报

ID:884998 发表于 2021-2-20 17:35 | 显示全部楼层
  1.     void DHT11_start()                 // 主机控制DHT11开始工作
  2.     {
  3. //       DATA=1;                                 // 主线空闲状态
  4. //       _nop_();
  5. //       _nop_();
  6.        DATA=0;                                 // 主机发送开始工作信号
  7.        Delay20ms();   //延时18ms以上
  8.        DATA=1;                                 // 拉高并延时等待DHT11响应
  9.        Delay30us();
  10.     }
  11.     /*********************************************************************************************
  12.     函数名:DHT11读数据函数
  13.     调  用:? = DHT11_rec_byte();
  14.     参  数:无
  15.     返回值:
  16.     结  果:读DHT11数据并保存到dat
  17.     备  注:
  18.     **********************************************************************************************/

  19.     uchar DHT11_rec_byte()      //接收一个字节
  20.     {
  21.        uchar i,dat=0;
  22.       for(i=0;i<8;i++)    //从高到低依次接收8位数据
  23.        {         
  24.           while(!DATA);   ////等待50us低电平过去
  25.           Delay30us();
  26.               Delay30us();     //延时60us,如果还为高则数据为1,否则为0
  27.           dat<<=1;           //左移位使正确接收8位数据,数据为0时直接移位
  28.           if(DATA==1)    //数据为1时,使dat加1来接收数据1
  29.              dat+=1;
  30.           while(DATA);  //等待数据线拉低   
  31.         }  
  32.         return dat;
  33.     }

  34.     /*********************************************************************************************
  35.     函数名:接收DHT11的40位的数据并校验
  36.     调  用:? = DHT11_receive();
  37.     参  数:无
  38.     返回值:无
  39.     结  果:结果保存到dat_r[i]中
  40.     备  注:
  41.     **********************************************************************************************/
  42.     void DHT11_receive()      //接收40位的数据
  43.     {
  44.         uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  45.         DHT11_start();                 // 主机控制DHT11开始工作
  46.         if(DATA==0)
  47.         {
  48.             while(DATA==0);   //等待拉高     
  49.             Delay30us();
  50.                     Delay30us();
  51.                     Delay30us();  //拉高后延时80us
  52.             R_H=DHT11_rec_byte();    //接收湿度高八位  
  53.             R_L=DHT11_rec_byte();    //接收湿度低八位  
  54.             T_H=DHT11_rec_byte();    //接收温度高八位  
  55.             T_L=DHT11_rec_byte();    //接收温度低八位
  56.             revise=DHT11_rec_byte(); //接收校正位

  57. //            Delay30us();    //结束

  58.             if((R_H+R_L+T_H+T_L)==revise)      //校正
  59.             {
  60.                 RH=R_H;
  61.                 RL=R_L;
  62.                 TH=T_H;
  63.                 TL=T_L;
  64.             }
  65.             /*数据处理,方便显示*/
  66.             dat_r[0]='0'+(RH/10);
  67.             dat_r[1]='0'+(RH%10);
  68.             dat_r[2]='0'+(TH/10);
  69.             dat_r[3]='0'+(TH%10);

  70.         }
  71.     }
复制代码


这是我测试时用的代码,我实在找不出和我写的有啥区别,可是我的程序就是读不出数据,dat_r是个全局变量
回复

使用道具 举报

ID:112099 发表于 2021-2-21 08:40 | 显示全部楼层
楼主有试过仿真看是卡死在哪里?你用的是什么单片机?IO口设置对吗?
回复

使用道具 举报

ID:155507 发表于 2021-2-21 09:34 | 显示全部楼层
MirrAKe 发表于 2021-2-20 17:35
这是我测试时用的代码,我实在找不出和我写的有啥区别,可是我的程序就是读不出数据,dat_r是个全局变 ...

求助之前,自己先别急,静下心来,仔细检查代码有没有错误;程序处理逻辑有没有问题。必要的话,各变量随着处理流程的值变化,列成清单。

建议你先画个流程,先在流程图上走通,再与程序!

对于控制一些对时序要求比较高的外部器件,可以根据MCU时钟频率,用单片机助手之类的工具计算延时很方便。

DHT11温湿度传感器中文资料分析
http://www.51hei.com/bbs/dpj-30362-1.html
回复

使用道具 举报

ID:844772 发表于 2021-2-22 17:09 | 显示全部楼层
//       DATA=1;                                 // 主线空闲状态
//       _nop_();
//       _nop_();
这几句也需要的
回复

使用道具 举报

ID:887027 发表于 2021-2-28 14:30 | 显示全部楼层
一个是dht11是不是不同,现在dht11好像有两种,最好你有在用的dht11的datasheet。第二你接个逻辑分析仪上去,看看dht11的信号时序。
回复

使用道具 举报

ID:390243 发表于 2021-3-16 21:51 | 显示全部楼层
请问楼主解决了吗?我也遇到和你一样的问题了。。
回复

使用道具 举报

ID:889832 发表于 2021-3-17 15:50 | 显示全部楼层
细节决定成败,加油相信你,反正我的  dht11  可以
回复

使用道具 举报

ID:884998 发表于 2021-3-20 11:04 | 显示全部楼层
LOGLOG6 发表于 2021-3-16 21:51
请问楼主解决了吗?我也遇到和你一样的问题了。。

当时时解决了,按照人家的例程完全照搬就好使,甚至for循环中的i 从unsigned char变成unsigned int都会读不出来,至于为什么,我不知道,后来还有个奇怪的事,当天晚上改完好用,第二天早上,就读不出来了,然后一直到现在,我也再没读出过正确数据
回复

使用道具 举报

ID:915884 发表于 2021-5-11 14:45 | 显示全部楼层
MirrAKe 发表于 2021-3-20 11:04
当时时解决了,按照人家的例程完全照搬就好使,甚至for循环中的i 从unsigned char变成unsigned int都会读 ...

我也是这样,楼主后续有跟进吗,我测试了一下我是卡在while(Data); 这句上了,一删掉就能显示,不过数据不对,好像一直无法拉低数据线
回复

使用道具 举报

ID:915884 发表于 2021-5-12 13:20 | 显示全部楼层
dellte 发表于 2021-5-11 14:45
我也是这样,楼主后续有跟进吗,我测试了一下我是卡在while(Data); 这句上了,一删掉就能显示,不过数据 ...

解决了,加了个上拉电阻就能读到数据了
回复

使用道具 举报

ID:1082926 发表于 2023-6-9 00:00 | 显示全部楼层
dellte 发表于 2021-5-11 14:45
我也是这样,楼主后续有跟进吗,我测试了一下我是卡在while(Data); 这句上了,一删掉就能显示,不过数据 ...

请问后来解决了吗,我也是卡在while循环里面了
回复

使用道具 举报

ID:1004455 发表于 2023-6-9 17:02 | 显示全部楼层
IO口要设置一下
回复

使用道具 举报

ID:1101718 发表于 2024-7-12 15:34 | 显示全部楼层
dellte 发表于 2021-5-12 13:20
解决了,加了个上拉电阻就能读到数据了

IIC好像需要上拉电阻才可以稳定通讯
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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