您的位置:首页 > 其它

nrf51822开发指导之温湿度传感器(DHT11)驱动程序

2016-05-11 21:52 357 查看
#include "nrf_gpio.h"

#include "nrf_delay.h"

#include "DHT11.h"
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//--------------------------------

#define DHTT11_DATA_PIN       27

#define DHT11_OutSet()        do{NRF_GPIO->OUTSET = (1UL << DHTT11_DATA_PIN);}while(0)

#define DHT11_OutClear()      do{NRF_GPIO->OUTCLR = (1UL << DHTT11_DATA_PIN);}while(0)

#define DHT11_InRead          nrf_gpio_pin_read(DHTT11_DATA_PIN)

/******************************************************************

//函数名:  DHT11_PortIN

//功能:    配置DHT11数据脚为输入

//输入参数:无

//返回值:  无

******************************************************************/ 

static void DHT11_PortIN(void)

{

    nrf_gpio_cfg_input(DHTT11_DATA_PIN,NRF_GPIO_PIN_NOPULL);

}

/******************************************************************

//函数名:  DHT11_PortOUT

//功能:    配置DHT11数据脚为输出

//输入参数:无

//返回值:  无

******************************************************************/ 

static void DHT11_PortOUT(void)

{

    nrf_gpio_cfg_output(DHTT11_DATA_PIN);  

}

/******************************************************************

//函数名:  StartDHT11

//功能:    启动DHT11 开始传输数据

//输入参数:无

//返回值:  无

******************************************************************/ 

static uint8_t StartDHT11(void)

{

   uint16_t TimeOut;

    

   DHT11_PortOUT();

   //DHT11_Out = 0;

   DHT11_OutClear();

   nrf_delay_ms(18);  //触发开始,总线拉低要大于18ms

  

   //DHT11_Out = 1; //释放总线

   DHT11_OutSet();

   nrf_delay_us(30);  //wait 20-40uS 等待DHT11的低电平响应信号

         

   DHT11_PortIN();//改为输入

   nrf_delay_us(20);

   if(!DHT11_InRead)

   {

           TimeOut = 0;
    while((!DHT11_InRead)&&(TimeOut < 2000))//低电平的响应信号,80us

           {

            TimeOut++;

           }

           TimeOut = 0;
  while((DHT11_InRead)&&(TimeOut < 2000))//紧接着是80us的高电平数据准备信号

           {

            TimeOut++;

           }
  //拉低后DHT11会拉高总线80us,接着会开始传数据

  return 1;

   }
return 0;

}

/******************************************************************

//函数名:  com

//功能:    获取八位数据

//输入参数:无

//返回值:  无

******************************************************************/ 

static uint8_t com(void)

{
uint8_t i;

    uint8_t temp;

    uint16_t TimeOut;
for(i = 0;i<8;i++)
{
temp <<= 1;
//nrf_delay_us(2);//接收到响应后会出现50us的低电平表示发送数据的开始,所以这里小延时一下
TimeOut = 0;

        while((!DHT11_InRead)&&(TimeOut < 2000))//等到高电平的出现,高电平的时间表示的是数据位的0和1
{

            TimeOut++;

        }

        nrf_delay_us(25);//数据为0的信号时间为26-28us,1则为70us,这里超时检测

        nrf_delay_us(5);
if(DHT11_InRead)//如果还为高
{
temp |= 0x01;

             TimeOut = 0;

             while((DHT11_InRead)&&(TimeOut < 2000))//等到低电平的出现

            {

                TimeOut++;

            }
// nrf_delay_us(30);//这里的延时足够了,40+10+30>70了
}
else //如果变低
{
temp &= 0xfe;
}
}

    return temp;

}

/******************************************************************

//函数名:  ReadDHT11

//功能:    获取温湿度数据

//输入参数:温湿度数据输出缓存

//返回值:  0:读取成功 ; 其他值:读取失败

******************************************************************/

uint8_t ReadDHT11(uint8_t *pdata)

{

    uint8_t check;//数据缓存字节
uint8_t sum;
if(StartDHT11())
//判断是否已经响应
{
pdata[0]=com();
pdata[1]=com();
pdata[2]=com();

pdata[3]=com();
check = com();
sum = (pdata[0]+pdata[1]+pdata[2]+pdata[3]);
//sum = sum - 0x80;
}

    else

    {

       return 2; 

    }
if(check == sum)
return(0);
else
return 1;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息