⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dht11.lst

📁 DHT11采集温湿度并用LCD12864显示的源程序
💻 LST
字号:
C51 COMPILER V8.02   DHT11                                                                 04/25/2013 19:45:37 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE DHT11
OBJECT MODULE PLACED IN DHT11.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DHT11.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //STC89C52单片机的时钟频率是11.0592M 
   2          #include "DHT11.h" 
   3          #include <reg52.h> 
   4          
   5          /*读一个字节的数据*/ 
   6          static uchar ReadValue(void) 
   7          { 
   8   1              uchar count, value = 0, i; 
   9   1              status = OK; //设置标志位为正常状态
  10   1              for(i = 8; i > 0; i--) 
  11   1              {                
  12   2                      value <<= 1; //高位在先,将得到的数据依次左移,最后得到1字节的数据
  13   2                      count = 0;
  14   2                      //每一位数据前都有50us的低电平等待时间.等待50us时间结束 
  15   2                      while(dht11 == 0 && count++ < NUMBER); 
  16   2                      if(count >= NUMBER) 
  17   2                      {       
  18   3                               status = ERROR;//设定错误标志
  19   3                               return 0;//函数执行过程发生错误就退出函数 
  20   3                      }
  21   2                      //26-28us的高电平表示该位为0, 70us的高电平表示该位为1 
  22   2                      Delay_10us(); 
  23   2                      Delay_10us(); 
  24   2                      Delay_10us();
  25   2                      //延时30us后检测数据线是否为高电平 
  26   2                      if(dht11 != 0) 
  27   2                      {
  28   3                              //进入这里表明该位为1
  29   3                              value++;
  30   3                              //等待剩下的40us高电平结束
  31   3                              while(dht11 != 0 && count++ < NUMBER) 
  32   3                              {                       
  33   4                                      dht11 = 1; 
  34   4                              } 
  35   3                              if(count >= NUMBER)
  36   3                              
  37   3                               { 
  38   4                                      status = ERROR;//设定错误标志
  39   4                                      return 0; 
  40   4                              } 
  41   3                      } 
  42   2              } 
  43   1              return (value); 
  44   1      } 
  45          
  46          //读一次数据,共5个字节
  47          uchar ReadTempAndHumi(void) 
  48          { 
  49   1      
  50   1              uchar i = 0, check_value = 0,count = 0; 
  51   1              EA = 0; 
  52   1              dht11 = 0; //先拉低数据线至少18ms,发送开始信号 
  53   1              Delay_1ms(20); //延时大于18ms
  54   1              dht11 = 1; //释放数据线,用于检测低电平响应信号
  55   1              //等待20-40us,检测响应信号,响应信号为从机拉低数据线80us 
C51 COMPILER V8.02   DHT11                                                                 04/25/2013 19:45:37 PAGE 2   

  56   1              Delay_10us(); 
  57   1              Delay_10us(); 
  58   1              Delay_10us(); 
  59   1              Delay_10us(); 
  60   1              if(dht11 != 0) //检测响应信号是否存在,响应信号为低电平
  61   1              {               
  62   2                      //响应信号不存在 
  63   2                      EA = 1; 
  64   2                      return ERROR;   
  65   2               } 
  66   1              else 
  67   1              {
  68   2              
  69   2                      //有响应信号
  70   2                      while(dht11 == 0 && count++ < NUMBER); //等待响应信号结束 
  71   2                      if(count >= NUMBER) //检测计数器是否超出了设定范围
  72   2                      {       
  73   3                              dht11 = 1; 
  74   3                              EA = 1; 
  75   3                              return ERROR;//读数据出错,退出函数
  76   3                      } 
  77   2                      count = 0;
  78   2                      dht11 = 1;//释放数据线
  79   2                      //应答信号后有80us的等待时间,等待高电平结束 
  80   2                      while(dht11 != 0 && count++ < NUMBER); 
  81   2                      if(count >= NUMBER) 
  82   2                      {
  83   3                              dht11 = 1; 
  84   3                              EA = 1; 
  85   3                              return ERROR;//计数器超出检测范围,退出函数     
  86   3                      }
  87   2              
  88   2                      //读出温湿度值
  89   2                      for(i = 0; i < SIZE; i++)       
  90   2                       { 
  91   3                              value_array[i] = ReadValue();   //调用ReadValue()读数据 
  92   3                              if(status == ERROR)//若读数据出错,则退出函数
  93   3                              {
  94   4                              
  95   4                                      dht11 = 1; 
  96   4                                      EA = 1; 
  97   4                                      return ERROR;
  98   4                              }
  99   3                              //若读到的数据是校验值,则不需要加上去
 100   3                              if(i != SIZE -1) 
 101   3                              {       
 102   4                                       //若读到的数据中前4字节数据的和等于第5字节字节,则表示成功 
 103   4                                      check_value += value_array[i];
 104   4                              } 
 105   3                      }//end for
 106   2                      //检验读到的数据是否正确 
 107   2                      if(check_value == value_array[SIZE - 1]) 
 108   2                      {
 109   3                              //将温湿度值扩大十倍,以方便读出其中的每一位
 110   3                              humi_value = (value_array[0]+value_array[1]) * 10;      //前2bit数据为湿度值
 111   3                              temp_value = (value_array[2]+value_array[3]) * 10;      //后2bit为温度值 
 112   3                              dht11 = 1; 
 113   3                              EA = 1; 
 114   3                              return OK;//正确地读出dht11输出的数据 
 115   3                      } 
 116   2                      else 
 117   2                      {
C51 COMPILER V8.02   DHT11                                                                 04/25/2013 19:45:37 PAGE 3   

 118   3                              //校验数据出错
 119   3                              EA = 1; 
 120   3                              return ERROR; 
 121   3                      }
 122   2              } 
 123   1      } 
 124          
 125          //LCD显示函数
 126          void SMG_Display(uint value) 
 127          { 
 128   1              uchar ge, bai, shi; 
 129   1              ge = value%10+0x30;     //必须加上0x30,否则显示乱码
 130   1              shi = value%100/10+0x30; 
 131   1              bai = value/100+0x30; 
 132   1              
 133   1              lcd_write_data(bai);
 134   1              
 135   1              lcd_write_data(shi);
 136   1              lcd_write_data('.');
 137   1              lcd_write_data(ge);     
 138   1                      
 139   1      } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    361    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -