DHT11 底层代码记录 --STC15系列

举报
ReCclay 发表于 2022/02/22 01:55:45 2022/02/22
【摘要】 DHT11.C #include "stc15f2k60s2.h" // 单片机STC15F2K60S2头文件,可以不再加入reg51.h #include <intrins.h&gt...

DHT11.C

#include "stc15f2k60s2.h"       // 单片机STC15F2K60S2头文件,可以不再加入reg51.h
#include <intrins.h>            // 加入此头文件后,可使用_nop_库函数
#include "uart.h"               // 串口1初始化、字符与字符串发送程序
#include <stdio.h>
#include "delay.h"              // 延时程序头文件 

sbit  Sensor_SDA   = P3^7 ;

unsigned char  FLAG=0,temp=0;
//unsigned char  *displaytemp,*displayhum;
unsigned char str[5]={0x00,0x00,0x00,0x00,0x00};
void Clear_Data (void);

unsigned char COM(void)//读取高低电平
{
     unsigned char i,U8comdata ;      
     for(i=0;i<8;i++)      
     {      
        FLAG=2; 
        while((!Sensor_SDA )&&FLAG++);
        DelayUS(30);
        temp=0;
        if(Sensor_SDA )temp=1;
        FLAG=2;
        while((Sensor_SDA )&&FLAG++);
        //超时则跳出for循环          
        if(FLAG==1)break;
        //判断数据位是0还是1               
        // 如果高电平高过预定0高电平值则数据位为 1         
        U8comdata<<=1;
        U8comdata|=temp;        //0
      }//rof
      return  U8comdata ;
}



void RH(void)//温湿度读取
{
     unsigned char  checkdata_temp;
      //主机拉低18ms 
     Sensor_SDA =0;
       DelayMS(18);
       Sensor_SDA =1;
     //总线由上拉电阻拉高 主机延时20us
       DelayUS(40);
     //主机设为输入 判断从机响应信号 
       Sensor_SDA =1;
     //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行     
       if(!Sensor_SDA )      //T !    
       {
           FLAG=2;
         //判断从机是否发出 80us 的低电平响应信号是否结束    
           while((!Sensor_SDA )&&FLAG++);
           FLAG=2;
         //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
           while((Sensor_SDA )&&FLAG++);
         //数据接收状态        

          str[0]= COM();
          str[1]= COM();
          str[2]= COM();
          str[3]= COM();
          str[4]= COM();             

          Sensor_SDA =1;
         //数据校验 
          checkdata_temp= str[4];
           temp=(str[0]+str[1]+str[2]+str[3]);
           if(temp==checkdata_temp)
               {     
               }
       }
}


void RH_Report()//温湿度输出
{
    unsigned char a[3],b[3]; 
    unsigned int tmp,hum;
    char message[20];
    RH();    //调用温湿度读取子程序 

    hum = str[0];
    tmp = str[2];
    a[1] = '0'+hum%10;
    a[0] = '0'+hum/10%10;
//  displayhum=a;             
    b[1] = '0'+tmp%10;
    b[0] = '0'+tmp/10%10;
//  displaytemp=b;
    sprintf(message,"Temp:%2s,Hum:%2s OK\r\n",b,a);    
    SendString(message);    

}
void Clear_Data (void)
  {
    int i;
    for(i=0;i<5;i++)
    {
       str[i] = 0x00;
     }
  }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104

DHT11.H

#ifndef __DHT11_H_
#define __DHT11_H_

//void TH_Report(void); 
void RH_Report(void) ;
void Clear_Data (void);
#endif


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/78301797

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。