DHT21温湿度传感器使用

//********************************************************//
//*******************DHT21使用范例***********************//
//单片机 : AT89S52 或 STC89C52RC ***//
/************单位:电子信息学院************************/
/***************数码管显示温湿度的数值******************/
//*************************函数头文件********************//
 #include <reg52.h>
 #include <intrins.h>
 #include <math.h>
//#include"stdio.h"

//**********************函数接口定义**********************//

 #define shuju P0 //数码管数据传输口
 sbit P_DATA=P3^2;//数据位接口
 unsigned char tab[40]={0};//高低电平接收数组
 unsigned char q[8]; //数码管值缓存变量
 unsigned char z1[5];//字节转换存储数组
 unsigned data count;//字节接收自减函数,5字节,40个位
 unsigned char i=0;//字节处理自加变量
 unsigned char  z=0;//数码管位扫描自加变量
 unsigned char  x=0;
 unsigned char shuma[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//数码管字段吗值
 unsigned char bit_con[8]={0,1,2,3,4,5,6,7};//三线八线译码器
 unsigned int iii;//函数显示自减函数
 unsigned char a,b,c,d,e ;//湿度温度数据存储变量
 //unsigned char c; //字符校验存储变量

//***************************延时函数(us)*************************//
 void  delay(unsigned int delus)//1us
  {while(delus!=0)
 { delus--;
 }
  }

 //******************延时函数(100ms)******************************//
 void delays(unsigned char h)
 {unsigned int k,l,m,c;
   for(l=0;l<h;l++)
    for(k=0;k<500;k++)
     for(m=0;m<20;m++)
      for(c=0;c<10;c++);
  }
 

//****************************显示函数**************************//
   void display()//数码管显示
   {
     for(z=0;z<8;z++)
     {
        P2=0xff; //要输入先写一
        P0=shuma[q[z]];//送值到数码管口
       if(x==8)
       {
         x=0;
       }
       P2=bit_con[x++];
       delay(200);
     }
   }

//*********************数据处理函数*****************************//
  void  data_processing()
  { a=b=0;
    c=0;
   while(i<8)   //取湿度高八位
     {if(tab[i]>50)
       { a=a<<1;
    a=a|0x0001;
    }
     else
    { a=a<<1;
    }
    i++;
   }
  while(i<16)  //取湿度第八位
  {  if(tab[i]>50)
       { b=b<<1;
    b=b|0x0001;
    }
     else
    { b=b<<1;
    }
    i++;
   } 
  
   while(i<24)//取温度高八位
 {if(tab[i]>50)
    { c=c<<1;
      c=c|0x0001;
       } 
     else
    {c=c<<1;
    }
    i++;
  }
 while(i<32) //取温度低八位
 {if(tab[i]>50)
    { d=d<<1;
      d=d|0x0001;
       } 
     else
    {d=d<<1;
    }
    i++;
 }
    while(i<40)//取校验和
 {if(tab[i]>50)
    {e=e<<1;
     e=e|0x01;
    }
 else
    {
     e=e<<1;
    }
    i++;
 }
  i=0;
  //if(a+b+c+d==e)//校验值
     q[0] =(a*256+b)/1000;
     q[1] =(a*256+b)%1000/100;
     q[2]=((a*256+b)%1000%100/10)|0x80;
     q[3] =(a*256+b)%1000%100%10;
     q[4]=(c*256+d)/1000;
     if(c|0xef==0xff)//负温度显示
      { q[4]= 0x0a;
        q[5] =(c*256+d)%1000/100;
        q[6]=((c*256+d)%1000%100/10)|0x80;
        q[7] =(c*256+d)%1000%100%10;
   }
  else  //正温度显示
      { q[4]=(c*256+d)/1000;
        q[5] =(c*256+d)%1000/100;
        q[6]=((c*256+d)%1000%100/10)|0x80;
        q[7] =(c*256+d)%1000%100%10;
   }
    }
   
 
 //********************数据接收函数******************************/
   void data_re()//数据接收函数
  {
    P_DATA=0;//主机发开始信号
    delay(80); //延时80US
    P_DATA=1;//拉高数据口,并延时等待
    while(P_DATA==1);//等待DH21输出响应
    while(P_DATA==0);//等待DH21拉高延时准备输出
    while(P_DATA==1);//如果为低则表明开始传输数据
    count=0; //字节自检函数,5字节,40个位
    while(count<40)//数据开始
    {
      while(P_DATA==0)  //0清空,去除时隙低电平
      {
       TR0=0;//关定时器
       TL0=0;//计数器值清零
       TH0=0;
      }
       TR0=1;
       while(P_DATA==1);  //1计时
       //TR0=0;
       tab[count]=TL0;
       count++;
    }
    P_DATA=1;
  }

//**********************初始化函数**********************//
 void init() //初始化函数
  {
    P_DATA=1;
    TMOD=0x09;//GATE位置一
    TH0=0;//初值重装
    TL0=0;
  }
 
//**********************主函数*************************//
  void main()
  {
  display();
  init();//调用初始化函数
  while(1)
    {
      data_re();//数据接收函数
      //display();
      data_processing();//数据处理函数
      iii=0;
     while(iii<500)
      {
      
  display();
  // delay(200);
        iii++;//显示自减函数
      }
     // _nop_();
    }
  }

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值