/**************************************************************************//**
* @file dht11.c
* @brief DHT11 hardware driver
* @date 21. October 2013
*
* @note
* Copyright (C) SUNRISING-TECH Limited. All rights reserved.
*
******************************************************************************/
#include "dht11.h"
/*********************************************************************************************************
** Function name: delay_1us
** Descriptions: 延时1us
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay_1us(void)
{
uint8_t y;
for(y=0;y<21;y++);
}
/*********************************************************************************************************
** Function name: delay_20us
** Descriptions: 延时20us
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay_20us(void)
{
uint16_t y;
for(y=0;y<21*23;y++);
}
/*********************************************************************************************************
** Function name: delay_30us
** Descriptions: 延时30us
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay_30us(void)
{
uint16_t y;
for(y=0;y<21*36;y++);
}
/*********************************************************************************************************
** Function name: delay_40us
** Descriptions: 延时40us
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay_40us(void)
{
uint16_t y;
for(y=0;y<945;y++);
}
/*********************************************************************************************************
** Function name: delay_50us
** Descriptions: 延时50us
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay_50us(void)
{
uint16_t y;
for(y=0;y<1100;y++);
}
/*********************************************************************************************************
** Function name: delay_20ms
** Descriptions: 延时20ms
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay_20ms(void)
{
uint32_t y;
for(y=0;y<341500;y++);
}
/*********************************************************************************************************
** Function name: DHT11_Rst
** Descriptions: 复位DHT11(控制器发出数据传输起始信号,等待DHT11响应)
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void DHT11_Rst(void)
{
DHT11_DIR_OUT; //设为输出
DHT11_DATA_L; //拉低DQ
delay_20ms(); //拉低至少18ms
DHT11_DATA_H; //拉高DQ
delay_20us(); //主机拉高20~40us
}
/*********************************************************************************************************
** Function name: DHT11_Check
** Descriptions: 等待DHT11的响应,DHT11会先将数据线DQ拉低40~80us,然后再次将数据线DQ拉高40~80us
** input parameters: 无
** output parameters: 无
** Returned value: 1: DHT11未响应
0: DHT11成功响应
*********************************************************************************************************/
uint8_t DHT11_Check(void)
{
uint8_t retry=0;
uint32_t data_in =0;
DHT11_DIR_IN; //设为输入
data_in = LPC_GPIO0->FIOPIN; //获取端口P0的当前数据,存入变量data_in
while ((data_in & 0x04000000)&&retry<100) //DHT11会拉低数据线DQ 40~80us
{
retry++;
delay_1us();
};
if(retry>=100)return 1;
else retry=0;
data_in = LPC_GPIO0->FIOPIN;
while (!(data_in& 0x04000000)&&retry<100) //DHT11拉低后会再次拉高数据线DQ 40~80us
{
data_in = LPC_GPIO0->FIOPIN;
retry++;
delay_1us();
};
if(retry>=100)return 1;
return 0;
}
/*********************************************************************************************************
** Function name: DHT11_Read_Bit
** Descriptions: 从DHT11读取1位数据,数据位以50us低电平开始,以紧接着的高电平时间表示0或1
1:高电平时间70us
0:高电平时间26~28us
** input parameters: 无
** output parameters: 无
** Returned value: 1: 读取的1位数据为1
0: 读取的1位数据为0
*********************************************************************************************************/
uint8_t DHT11_Read_Bit(void)
{
uint8_t retry=0;
uint32_t data_in =0;
data_in = LPC_GPIO0->FIOPIN; //获取端口P0数据存入变量data_in
while((data_in& 0x04000000)&&retry<100) //判断数据线DQ:P0.26是否为低电平,为高则继续等待
{
data_in = LPC_GPIO0->FIOPIN;
retry++;
delay_1us();
}
retry=0;
while(!(data_in& 0x04000000)&&retry<100) //判断数据线DQ:P0.26是否为高电平,为低则继续等待
{
data_in = LPC_GPIO0->FIOPIN;
retry++;
delay_1us();
}
delay_40us(); //等待40us,判断DQ值为1或0
data_in = LPC_GPIO0->FIOPIN;
if((data_in& 0x04000000)) //DQ为1,则返回数据1;DQ为0,则返回数据0
return 1;
else
return 0;
}
/*********************************************************************************************************
** Function name: DHT11_Read_Byte
** Descriptions: 从DHT11读取1个字节的数据,将读取的8位数据合并成一个字节
** input parameters: 无
** output parameters: 无
** Returned value: dat:读到的1个字节数据
*********************************************************************************************************/
uint8_t DHT11_Read_Byte(void)
{
uint8_t i,dat;
dat=0;
for (i=0;i<8;i++) //合并读取的8为数据位1字节
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
/*********************************************************************************************************
** Function name: DHT11_Read_Data
** Descriptions: 从DHT11读取一次(5个字节,40位)数据,数据高位在前
数据格式:8bit湿度整数位+8bit湿度小数位+8bit温度整数位+8bit温度小数位+8bit校验和
00000000 00000000
对于DHT11来说,8bit湿度、温度小数位均为保留扩展用,读到的全为0
数据正确时有:校验和值 = 湿度整数值+湿度小数值+温度整数值+温度小数值
** input parameters: 无
** output parameters: humi:湿度值(范围:20%~90%RH,分辨率-5~+5%RH)
temp:温度值(范围:0~50°,分辨率-1~+1°)
** Returned value: 1: DHT11读到的一次数据有误
0: DHT11读到的一次数据正常
*********************************************************************************************************/
uint8_t DHT11_Read_Data(uint8_t *humi,uint8_t *temp)
{
uint8_t buf[5];
uint8_t i;
DHT11_Rst(); //复位DHT11
if(DHT11_Check()==0) //DHT11响应则继续执行,否则函数返回1
{
for(i=0;i<5;i++) //读取5个字节(40位)数据
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) //校验读到的数据是否正确
{
*humi=buf[0]; //保存湿度数据(整数值)
*temp=buf[2]; //保存温度数据(整数值)
}
}
else
return 1;
return 0;
} //读取一次数据正确则返回0
/**********
NXP公司LPC17XX系列的 DHT11驱动
5星 · 超过95%的资源 需积分: 10 177 浏览量
2013-10-23
09:44:29
上传
评论
收藏 3KB RAR 举报
erlingzhu2
- 粉丝: 0
- 资源: 5