#include "dht11.h"
static GPIO_InitTypeDef GPIO_InitStructure;
void dht11_pin_mode(GPIOMode_TypeDef pin_mode)
{
if(pin_mode == GPIO_Mode_Out_PP)
{
/* 配置PG9為輸出模式,讓這根引腳具有輸出高低電平的功能 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //第15號引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //輸出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引腳的速度最大為100MHz
}
else
{
/* 配置PG9為輸入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //第15號引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引腳的速度最大為100MHz
}
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//dht11初始化函數
void dht11_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//關閉jtag,使能SWD,可以用SWD模式調試
dht11_pin_mode(GPIO_Mode_Out_PP);
PAout(15)=1;
}
//dht11開始信號發送函數
int32_t dht11_start(void)
{
uint32_t t=0;
dht11_pin_mode(GPIO_Mode_Out_PP);
PAout(15)=0;
delay_ms(18);
PAout(15)=1;
delay_us(30);
dht11_pin_mode(GPIO_Mode_IPD);
t=0;
while(PAin(15))
{
delay_us(1);
t++;
if(t>1000)
return -1;
}
t=0;
while(PAin(15)==0)
{
delay_us(1);
t++;
if(t>150)
return -2;
}
t=0;
while(PAin(15))
{
delay_us(1);
t++;
if(t>150)
return -3;
}
return 0;
}
//dht11讀取數據函數
uint8_t dht11_read_byte(void)
{
uint32_t i=0;
uint8_t d=0;
for(i=0; i<8; i++)
{
while(PAin(15)==0);
delay_us(40);
if(PAin(15))
{
d|=1<<(7-i);
while(PAin(15));
}
}
return d;
}
//讀取dht11數據保存在pbuf中
int32_t dht11_read_data(uint8_t *pbuf)
{
int32_t rt=-1;
uint32_t i=0;
uint8_t check_sum=0;
rt = dht11_start();
if(rt < 0)
return rt;
for(i=0 ; i<5; i++)
{
pbuf[i]=dht11_read_byte();
}
check_sum = pbuf[0]+pbuf[1]+pbuf[2]+pbuf[3];
if(check_sum != pbuf[4])
return -4;
delay_us(100);
return 0;
} |