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

举报
ReCclay 发表于 2022/02/22 01:55:45 2022/02/22
1.4k+ 0 0
【摘要】 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;
     }
  }

  
 

DHT11.H

#ifndef __DHT11_H_
#define __DHT11_H_

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

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

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

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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