找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于DHT11温湿度传感器的问题。

[复制链接]
跳转到指定楼层
楼主
ID:114626 发表于 2016-4-18 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>   
typedef unsigned char  U8;  /* defined for unsigned 8-bits integer variable 无符号8位整型变量  */      
typedef signed   char  S8;  /* defined for signed 8-bits integer variable    有符号8位整型变量  */
typedef unsigned int   U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed   int   S16; /* defined for signed 16-bits integer variable    有符号16位整型变量 */
typedef unsigned long  U32; /* defined for unsigned 32-bits integer variable  无符号32位整型变量 */  
typedef signed   long  S32; /* defined for signed 32-bits integer variable    有符号32位整型变量 */  
typedef float          F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */  
typedef double         F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */   
#define uchar unsigned char
#define uint unsigned int
#define   Data_0_time    4   // 这个宏定义是什么意思,有什么用?
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit  P2_0  = P2^0   
//----------------------------------------------//
//----------------定义区------------------    --//  
//----------------------------------------------//
U8  U8FLAG,k; //这里定义的k完全没用啊?
U8  U8count,U8temp;  
U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8  U8comdata;  
U8  outdata[5];  //定义发送的字节数  
U8  indata[5];
U8  count, count_r=0;
U8  str[5]={"RS232"};
U16 U16temp1,U16temp2;
SendData(U8 *a)
{   
  outdata[0] = a[0];   
  outdata[1] = a[1];  
  outdata[2] = a[2];  
  outdata[3] = a[3];  
  outdata[4] = a[4];  
  count = 1;   
  SBUF=outdata[0];
}          //这里用keil编译,提示missing return valve 没有返回值怎么能把数据传输给高速寄存器?
void Delay(U16 j)     
{      
  U8 i;      
  for(;j>0;j--)   
    {      
     for(i=0;i<27;i++);      
     }  
}        
void  Delay_10us(void)      
{   U8 i;         
    i--;        
    i--;        
    i--;        
    i--;         
    i--;         
    i--;      
}            
void  COM(void)      
{  U8 i;         
   for(i=0;i<8;i++)      
     {           
       U8FLAG=2;     
       while((!P2_0)&&U8FLAG++);   
       Delay_10us();      
       Delay_10us();   
       Delay_10us();
       U8temp=0;        
       if(P2_0)
       U8temp=1;                  //判断数据位是0还是1      
       U8FLAG=2;     
       while((P2_0)&&U8FLAG++);   //超时则跳出for循环     
       if(U8FLAG==1)break;        // 如果高电平高过预定0高电平值则数据位为 1         
       U8comdata<<=1;      
       U8comdata|=U8temp;              
      }  
}   
//--------------------------------  
//-----湿度读取子程序 ------------
//--------------------------------  
//----以下变量均为全局变量--------  
//----温度高8位== U8T_data_H------  
//----温度低8位== U8T_data_L------  
//----湿度高8位== U8RH_data_H-----  
//----湿度低8位== U8RH_data_L-----  
//----校验 8位 == U8checkdata-----  
//----调用相关子程序如下----------
//---- Delay();
Delay_10us();
COM();  
//--------------------------------   
void RH(void)  
{        
  P2_0=0;     
  Delay(180); //主机拉低18ms         
  P2_0=1;        
  Delay_10us();     
  Delay_10us();   
  Delay_10us();     
  Delay_10us(); //总线由上拉电阻拉高 主机延时20us   
                //主机设为输入 判断从机响应信号     
  P2_0=1;      //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行   
  if(!P2_0)   //T !  
  {   
    U8FLAG=2;      
    while((!P2_0)&&U8FLAG++);   //判断从机是否发出 80us 的低电平响应信号是否结束   
    U8FLAG=2;   
    while((P2_0)&&U8FLAG++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态           
    COM();      
    U8RH_data_H_temp=U8comdata;   
    COM();      
    U8RH_data_L_temp=U8comdata;     
    COM();     
    U8T_data_H_temp=U8comdata;   
    COM();      
    U8T_data_L_temp=U8comdata;   
    COM();      
    U8checkdata_temp=U8comdata; //数据接收状态     
    P2_0=1;   //数据校验        
    U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);      
    if(U8temp==U8checkdata_temp)   
    {      
        U8RH_data_H=U8RH_data_H_temp;     
        U8RH_data_L=U8RH_data_L_temp;     
        U8T_data_H=U8T_data_H_temp;     
        U8T_data_L=U8T_data_L_temp;     
        U8checkdata=U8checkdata_temp;     
    }
  }
}   
//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz  串口发  
//送温湿度数据,波特率 9600   
//----------------------------------------------
void main()
{  
// U8  i,j;   
//uchar str[6]={"RS232"};  /* 系统初始化 */   
  TMOD = 0x20;       //定时器T1使用工作方式2
  TH1 = 253;         
  TL1 = 253;         // 设置初值
  TR1 = 1;           // 开始计时         
  SCON = 0x50;       //工作方式1,波特率9600bps,允许接收     
  ES = 1;  
  EA = 1;            // 打开所用中断   
  TI = 0;  
  RI = 0;   
  SendData(str)     //发送到串口   
  Delay(1);         //延时100US(12M晶振)        
while(1)
   {        
   //------------------------     
   //调用温湿度读取子程序      
   RH();      
   //串口显示程序      
   //--------------------------      
   str[0]=U8RH_data_H;     
   str[1]=U8RH_data_L;     
   str[2]=U8T_data_H;     
   str[3]=U8T_data_L;     
   str[4]=U8checkdata;      
   SendData(str)       //发送到串口            
Delay(20000);        //读取模块数据周期不易小于 2S
    }
}
void RSINTR() interrupt 4 using 2
{ U8 InPut3;   
  if(TI==1) //发送中断  
  {   
   TI=0;   
     if(count!=5) //发送完5位数据   
     {      
       SBUF= outdata[count];   
       count++;
     }
   }   
   if(RI==1)  //接收中断   
{     
   InPut3=SBUF;  
   indata[count_r]=InPut3;
   count_r++;   
   RI=0;           
  if(count_r==5)//接收完5位数据   
   {   
  count_r=0;   
  str[0]=indata[0];   
  str[1]=indata[1];      
  str[2]=indata[2];     
  str[3]=indata[3];     
  str[4]=indata[4];     
  P0=0;         //数据接收完毕处理。//这里的P0是什么意思?前面完全没有定义过这一位吧?
   }   
  }  
}
希望各位能帮帮忙,最近一直在看,有的也看懂了,可以上面的红色标注的几点一直没明白,还有就只在开发板上测试时收到的数据全是0,是不是时序有问题。看好多都说这个程序能用能用,自己用的时候还是有问题啊,请各位帮帮忙。

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

使用道具 举报

沙发
ID:114626 发表于 2016-4-19 08:50 | 只看该作者
没人来啊,好冷清
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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