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

#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;
}




你可能感兴趣的:(nrf51822开发指导之温湿度传感器(DHT11)驱动程序)