3888|0

1

帖子

2

TA的资源

一粒金砂(初级)

楼主
 

这是我写的用cc2530驱动DHT11程序,各位大神看看问题在哪 [复制链接]


液晶上温湿度都只显示“I5”,奇怪


#include "DHT11.h"
#include "includes.h"


///////////////////////////////////////////////函数定义////////////////////////////////////////////

/*注意在得到的温度值是负数的时候是用补码表示的,由于处于测试阶段室温为正,暂时没有对其进行处理
DHT11为排针下面的器件,其DATA引脚连接至P1.0,使用时对应连接CC2530相同引脚。
*/


#define  DHT       P1_0    //dht11的dq位连接到了P1.0脚
#define  SET_OUT   P1DIR|=0x01//设置为输出口
#define  SET_IN    P1DIR&=0xfe//设置为输入口
uint8 tdata[4]={0x00,0x00,0x00,0x00};
uint8 sbuf=0,check=0;

/*----------------------------精确延时------------------------------------*/
void delay_us(uint32 n)
{
  uint16 i=0;
  while(n--)
  {
     i =16;//16MHZ
     while(i--);
   }
}
void delay_ms(uint32 n)
{
    while(n--)
    {
     delay_us(1000);        
    }

}
/****************************初始化及采集程序*************************************/
unsigned int StartDHT11(void)
{
  SET_OUT;
  DHT=0;
  delay_ms(20);//触发开始,主机使DHT11低电平并延时至少18ms
  DHT=1; //释放总线
  delay_us(40);  //wait 20-40uS 等待DHT11的低电平响应信号
  SET_IN;
  delay_us(20);
  if(!DHT) //从机发出相应信号
  {
    do{} while((!DHT));//低电平的响应信号,80us
    do{} while(DHT);//紧接着是80us的高电平数据准备信号。开始采集数据
   
    return 1;

  }
  else{ return 0;}
}

/***********************************温湿度读取函数**********************************/

void com(void)
{
    uint16 i;
   
   
    for(i = 0;i<8;i++)
    {
        sbuf <<= 1;//接收到的数据左移一位
        //接收到响应后会出现50us的低电平表示发送数据的开始
        do{} while(!DHT);//等到高电平的出现,高电平的时间表示的是数据位的0和1
        delay_us(50);//数据为0的信号时间为26-28us,1则为70us,这里超时检测
      
        if(DHT)//如果还为高
        {
             sbuf |= 0x01;
             //while(DHT11_In && ++Flag);//等待它变为低电平信号 ,这里不能一直都等,因为数据传送完了会拉高总线的
             delay_us(20);//这里的延时足够了,40+10+30>70了
        }
        else //如果变低
        {
            sbuf &= 0xfe;
        }
    }
}
void ReadDHT11(void)
{
  do{} while(!StartDHT11());    //判断是否已经响应
   
        com();
        tdata[0]=sbuf; //湿度整数部分(高8位)
        com();
        tdata[1]=sbuf; //湿度小数部分(低8位)
        com();
        tdata[2]=sbuf; //温度整数部分(高8位)
        com();
        tdata[3]=sbuf; //温度整数部分(低8位)
        com();
        check = sbuf;
   

}
此帖出自51单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表