找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2452|回复: 1
打印 上一主题 下一主题
收起左侧

关于单片机+DHT22读数问题

[复制链接]
跳转到指定楼层
楼主
ID:366929 发表于 2019-6-5 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是DHT22和nRF24L01无线组合,并且DHT22通过2片CD4067的16选一模拟通道实现32个传感器2个单总线的多点测量,问题就是,上位机读取时,数据可以正常显示,但是过一会儿后数据消失,要等几轮才能再读取到数据。(上位机缓存数据直到有新数据存入替换,但是偶尔数据存入为零),想知道有看法的人能解决一下吗。
  1. #include "AM2302.h"
  2. #include "reg52.h"
  3. #include "delay.h"
  4. #define uchar unsigned char  //无符号字符型 宏定义 变量范围0~255
  5. #define uint  unsigned int  //无符号整型 宏定义 变量范围0~65535
  6. uchar U8FLAG,U8temp;
  7. uchar COM(uchar a)
  8. {  uchar i,U8comdata=0;
  9.     switch(a){
  10.    case 0:
  11. {

  12.     for(i=0;i<8;i++)   
  13.     {
  14.      U8FLAG=2;  
  15.      while((!DHT220)&&U8FLAG++);
  16.      Delay_10us();
  17.      Delay_10us();
  18.   Delay_10us();
  19.        U8temp=0;
  20.        if(DHT220)U8temp=1;
  21.        U8FLAG=2;
  22.      while((DHT220)&&U8FLAG++);        
  23.      if(U8FLAG==1)break;
  24.       U8comdata<<=1;
  25.         U8comdata|=U8temp;
  26.      }
  27.   }
  28. break;
  29.   case 1:
  30. {
  31.     for(i=0;i<8;i++)   
  32.     {
  33.      U8FLAG=2;  
  34.      while((!DHT221)&&U8FLAG++);
  35.      Delay_10us();
  36.      Delay_10us();
  37.   Delay_10us();
  38.        U8temp=0;
  39.        if(DHT221)U8temp=1;
  40.        U8FLAG=2;
  41.      while((DHT221)&&U8FLAG++);        
  42.      if(U8FLAG==1)break;
  43.       U8comdata<<=1;
  44.         U8comdata|=U8temp;
  45.      }
  46.   }
  47. break;
  48. }
  49. return  U8comdata;
  50. }
  51. void Read_TRH(int *x,int *y,uchar i)
  52. {
  53. uint T_data=0;
  54. uint RH_data=0;
  55.   static uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  56.   static uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  57.   switch(i){
  58.   case 0:
  59.   {
  60.     DHT220=0;
  61.     Delay_ms(5);
  62.     DHT220=1;
  63.     Delay_10us();
  64.     Delay_10us();
  65.     Delay_10us();
  66.     Delay_10us();
  67.     DHT220=1;
  68.     if(!DHT220)
  69.   {   
  70.      U8FLAG=2;
  71.      while((!DHT220)&&U8FLAG++);
  72.      U8FLAG=2;
  73.      while(DHT220&&U8FLAG++);
  74.      U8RH_data_H_temp=COM(0);
  75.      U8RH_data_L_temp=COM(0);
  76.      U8T_data_H_temp=COM(0);
  77.      U8T_data_L_temp=COM(0);
  78.      U8checkdata_temp=COM(0);
  79.     DHT220=1;   
  80.    U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  81.      if(U8temp==U8checkdata_temp)
  82.      {
  83.          U8RH_data_H=U8RH_data_H_temp;
  84.          U8RH_data_L=U8RH_data_L_temp;
  85.       U8T_data_H=U8T_data_H_temp;
  86.          U8T_data_L=U8T_data_L_temp;
  87.          U8checkdata=U8checkdata_temp;
  88.      }   
  89.    RH_data=U8RH_data_H*255+U8RH_data_L;
  90.    T_data=U8T_data_H*255+U8T_data_L;
  91.   }
  92.   *x=RH_data;
  93.   *y=T_data;
  94. }break;
  95. case 1:
  96.   {
  97.    DHT221=0;
  98.     Delay_ms(5);
  99.     DHT221=1;
  100.     Delay_10us();
  101.     Delay_10us();
  102.     Delay_10us();
  103.     Delay_10us();
  104.     DHT221=1;
  105.     if(!DHT221)
  106.   {   
  107.      U8FLAG=2;
  108.      while((!DHT221)&&U8FLAG++);
  109.      U8FLAG=2;
  110.      while(DHT221&&U8FLAG++);
  111.      U8RH_data_H_temp=COM(1);
  112.      U8RH_data_L_temp=COM(1);
  113.      U8T_data_H_temp=COM(1);
  114.      U8T_data_L_temp=COM(1);
  115.      U8checkdata_temp=COM(1);
  116.     DHT221=1;
  117.    U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  118.      if(U8temp==U8checkdata_temp)
  119.      {
  120.          U8RH_data_H=U8RH_data_H_temp;
  121.          U8RH_data_L=U8RH_data_L_temp;
  122.          U8T_data_H=U8T_data_H_temp;
  123.          U8T_data_L=U8T_data_L_temp;
  124.          U8checkdata=U8checkdata_temp;
  125.      }
  126.    
  127.      RH_data=U8RH_data_H*255+U8RH_data_L;
  128.    T_data=U8T_data_H*255+U8T_data_L;
  129.   }
  130.   *x=RH_data;
  131.   *y=T_data;
  132. }break;
  133. }
  134. }

  135. 以下是主程序的各函数
  136. void dht22(uchar i)
  137. {
  138.   Read_TRH(&r,&t,i);//读取数据
  139. }
  140. int choiceCH(uchar ch)
  141. {
  142. switch(ch)
  143. {
  144.   case 0:{S0=0;S1=0;S2=0;S3=0;};break;  //channel 0
  145.   case 1:{S0=1;S1=0;S2=0;S3=0;};break;  //channel 1
  146.   case 2:{S0=0;S1=1;S2=0;S3=0;};break;  //channel 2
  147.   case 3:{S0=1;S1=1;S2=0;S3=0;};break;  //channel 3
  148.   case 4:{S0=0;S1=0;S2=1;S3=0;};break;  //channel 4
  149.   case 5:{S0=1;S1=0;S2=1;S3=0;};break;  //channel 5
  150.   case 6:{S0=0;S1=1;S2=1;S3=0;};break;  //channel 6
  151.   case 7:{S0=1;S1=1;S2=1;S3=0;};break;  //channel 7
  152.   case 8:{S0=0;S1=0;S2=0;S3=1;};break;  //channel 8
  153.   case 9:{S0=1;S1=0;S2=0;S3=1;};break;  //channel 9
  154.   case 10:{S0=0;S1=1;S2=0;S3=1;};break;  //channel 10
  155.   case 11:{S0=1;S1=1;S2=0;S3=1;};break;  //channel 11
  156.   case 12:{S0=0;S1=0;S2=1;S3=1;};break;  //channel 12
  157.   case 13:{S0=1;S1=0;S2=1;S3=1;};break;  //channel 13
  158.   case 14:{S0=0;S1=1;S2=1;S3=1;};break;  //channel 14
  159.   case 15:{S0=1;S1=1;S2=1;S3=1;};break;  //channel 15
  160. }
  161. }
  162. /******************主程序**********************/   
  163. void main()
  164. { int i,n,m;
  165. CE=0;     //2.4G无线模块IO口初始化
  166. SCK=0;
  167. CSN=1;
  168. chEN1 = 0;
  169. chEN2 = 0;
  170. TX_Mode();
  171. delay_1ms(600);
  172. while(1)
  173. {   
  174.   for(m=0;m<2;m++)
  175.      for(n=0;n<4;n++)
  176.    {
  177.    switch(4*m+n)
  178.     {
  179.      case 0: Tx_Buf[0] = 0x01; break;
  180.      case 1: Tx_Buf[0] = 0x02; break;
  181.      case 2: Tx_Buf[0] = 0x03; break;
  182.      case 3: Tx_Buf[0] = 0x04; break;
  183.      case 4: Tx_Buf[0] = 0x05; break;
  184.      case 5: Tx_Buf[0] = 0x06; break;
  185.      case 6: Tx_Buf[0] = 0x07; break;
  186.      case 7: Tx_Buf[0] = 0x08; break;
  187.     }
  188.      for(i=0;i<4;i++)
  189.      {
  190.       choiceCH(4*n+i);
  191.       delay_1ms(10);
  192.       dht22(m);
  193.       Tx_Buf[4*i+1] = t% 256;  
  194.       Tx_Buf[4*i+2] = t / 256;  
  195.       Tx_Buf[4*i+3] = r% 256;  
  196.       Tx_Buf[4*i+4] = r / 256;
  197.       delay_1ms(10);
  198.      }
  199.      led = 0;
  200.      Transmit(Tx_Buf);
  201.      delay_1ms(10);
  202.      sta=SPI_Read(READ_REG +  STATUS);
  203.      if(TX_DS)  //当前STATUS状态  发送中断应使bit5 = 1
  204.      {
  205.       SPI_RW_Reg(WRITE_REG + STATUS,sta);
  206.      }
  207.      if(MAX_RT)  //如果是发送超时
  208.      {
  209.      SPI_RW_Reg(WRITE_REG + STATUS,sta);
  210.      }
  211.      led = 1;
  212.    
  213.     delay_1ms(1500);
  214.     }
  215.   }
  216. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2019-6-5 15:47 | 只看该作者
这种问题都要分步来解决,先单独试DHT22采集长时间有无问题,再加无线,不能眉毛胡子一把抓。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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