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