新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2020-11-30
- 在线时间
- 7 小时
|
我用原子的源码烧写可以正常显示温湿度,但我自己根据原子源码仿写的最后只输出温度0,湿度41%,而且读数据的返回值为0#include "dht11.h"
#include "delay.h"
#include "lcd.h"
/*复位函数*/
void DHT11_Reset(void)
{
DHT11_IO_OUT;
DHT11_DQ_Write(0);
delay_ms(20);
DHT11_DQ_Write(1);
delay_us(30);
}
//检查dht11的相应信号函数
//复位信号后,dht11会发送响应信号:拉低总线40~50us;然后再拉高40~50us
u8 DHT11_Check(void)
{
u8 wait_time=0;
DHT11_IO_IN; //设置PB12为输入模式
while(DHT11_DQ_Read&&wait_time<100) //等待dht11的低电平到来,超过100us后认为dht11不存在
{
wait_time++;
delay_us(1);
}
if(wait_time>=100) return 1;
else wait_time=0;
while(!DHT11_DQ_Read&&wait_time<100) //等待高电平到来
{
wait_time++;
delay_us(1);
}
if(wait_time>=100)return 1;
return 0;
}
/*初始化函数*/
u8 dht11_Init(void)
{
GPIO_InitTypeDef DHT11_InitStruct; //IO口初始化
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启IO口时钟
DHT11_InitStruct.Mode =GPIO_MODE_OUTPUT_PP;
DHT11_InitStruct.Pin =GPIO_PIN_12;
DHT11_InitStruct.Pull =GPIO_PULLUP;
DHT11_InitStruct.Speed =GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOB,&DHT11_InitStruct);
DHT11_Reset();
return DHT11_Check();
}
//从dht11读取一个bit
//0:12-14us低电平+26-28us高电平
//1:12-14us低电平+116-118us高电平
u8 DHT11_Read_bit(void)
{
u8 time_wait=0;
//DHT11_IO_IN;
while(DHT11_DQ_Read&&time_wait<100) //等待dht11的低电平到来
{
time_wait++;
delay_us(1);
}
time_wait=0;
while(!DHT11_DQ_Read&&time_wait<100) //等待高电平到来
{
time_wait++;
delay_us(1);
}
delay_us (50); //延时40us(0所持续的最长时间)
if(DHT11_DQ_Read)return 1;
else return 0;
}
//从dht11读取一个byte,DHT11从高位向MCU发送数据
u8 DHT11_Read_byte(void)
{
u8 i,dat=0;
for(i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_bit();
}
return dat;
}
//从DHT11读取湿度和温度值
//DHT11发送的数据包为5个字节:湿度整数+湿度小数+温度整数+温度小数+校验和(前四个字节相加)
u8 DHT11_Get_data(u8 *hemi, u8 *tem)
{
u8 i,buf[5];
DHT11_Reset();
if(DHT11_Check()==0)
{ printf("ok\n");
//LCD_ShowNum(30+40,210,DHT11_Check(),2,16); //显示湿度
for(i=0;i<5;i++) //读取5个字节的数据包
{
buf[i]=DHT11_Read_byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) //校验和
{
*hemi=buf[0];
*tem=buf[2];
//printf("hemi=%d tem=%d",*hemi,*tem);
}
}
else
{
printf("no\n");
return 1;
}
return 0;
}
|
|