就是 雁凌家的模块,测好了,弄了很久吧发现是他们家的杜邦线不行,以后买模块要看杜邦线质量,还是买点好的
太耽误开发周期了
我们用的模块是四线 转三线的(dht11从四线的引脚变成三线的输出)
线路连接
dht11 有三根线连出来,vcc,gnd,还有一个负责输入和输出
所以最后一根线可以连接到没有被占用的gpio口就能获得数据
连接到板子的 pb2上面
程序编写
唤醒dht11 ->检测dht11是否存在 -> 读取数据
唤醒dht11
输出低电平 20ms 再输出 高电平 30us
//复位DHT11
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //设置为输出
DHT11_DQ_OUT=0; //拉低DQ
delay_ms(20); //拉低至少18ms
DHT11_DQ_OUT=1; //DQ=1
delay_us(30); //主机拉高20~40us
}
检测dht11
唤醒后dht11 会拉低电频40,80us 拉低后会再次拉高40~80us
读取数据
读取一位数据
dht11 会拉低电频 拉低后会再次拉高,此时就是当时数据位的值,我们进行检测
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
读取一个byte数据
就是循环读取八个位
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//读取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;
}
对所有数据进行拼装,得到温度值
从总共的40byte里拿出我们的数据,小数部分就不要了,好像是不支持
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//读取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;
}
所有代码
dht11.c
#include "dht11.h"
#include "delay.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F429开发板
//DHT11驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2016/1/16
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved
//
//复位DHT11
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //设置为输出
DHT11_DQ_OUT=0; //拉低DQ
delay_ms(20); //拉低至少18ms
DHT11_DQ_OUT=1; //DQ=1
delay_us(30); //主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN(); //设置为输入
while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
else retry=0;
while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//等待变为低电平
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//等待变高电平
{
retry++;
delay_us(1);
}
delay_us(40);//等待40us
if(DHT11_DQ_IN)return 1;
else return 0;
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//读取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;
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_2; //PB12
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化
DHT11_Rst();
return DHT11_Check();
}
dht11.h
#ifndef __DS18B20_H
#define __DS18B20_H
#include "sys.h"
//IO方向设置
#define DHT11_IO_IN() {GPIOB->MODER&=~(3<<(2*2));GPIOB->MODER|=0<<(2*2);} //PB12输入模式
#define DHT11_IO_OUT() {GPIOB->MODER&=~(3<<(2*2));GPIOB->MODER|=1<<(2*2);} //PB12输出模式
IO操作函数
#define DHT11_DQ_OUT PBout(2)//数据端口 PB12
#define DHT11_DQ_IN PBin(2) //数据端口 PB12
u8 DHT11_Init(void);//初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度
u8 DHT11_Read_Byte(void);//读出一个字节
u8 DHT11_Read_Bit(void);//读出一个位
u8 DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11
#endif
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "dht11.h"
#include "pcf8574.h"
int main(void)
{
u8 t=0;
u8 temperature;
u8 humidity;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
PCF8574_Init(); //初始化PCF8574
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");
LCD_ShowString(30,70,200,16,16,"DHT11 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2016/1/16");
PCF8574_ReadBit(BEEP_IO); //由于DHT11和PCF8574的中断引脚共用一个IO,
//所以在初始化DHT11之前要先读取一次PCF8574的任意一个IO,
//使其释放掉中断引脚所占用的IO(PB12引脚),否则初始化DS18B20会出问题
while(DHT11_Init()) //DHT11初始化
{
LCD_ShowString(30,130,200,16,16,"DHT11 Error");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,130,200,16,16,"DHT11 OK");
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(30,150,200,16,16,"Temp: C");
LCD_ShowString(30,170,200,16,16,"Humi: %");
while(1)
{
if(t%10==0)//每100ms读取一次
{
PCF8574_ReadBit(BEEP_IO); //读取一次PCF8574的任意一个IO,使其释放掉PB12引脚,
//否则读取DHT11可能会出问题
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
LCD_ShowNum(30+40,150,temperature,2,16); //显示温度
LCD_ShowNum(30+40,170,humidity,2,16); //显示湿度
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
}
}
上一篇:STM32F103C8T6+温湿度传感器DHT11实现温湿度采集
下一篇:STM32驱动dht11温湿度传感器
推荐阅读




推荐帖子
- 用于便携式工业设备的小型高效降压-升压转换器
- 几乎每一个便携式系统都需要一个3.3V电压轨。而对于那些由单节锂电池供电的系统,用户总会问到如何实现这个电源轨。将电池电压(通常情况下在3V至4.2V之间变化)升压至5V,然后将5V降压至3.3V,这会使电源经历双重转换。两次电源转换步骤的效率是这些转换步骤中每次转换的效率的乘积,所以,我所描述情况下的总体效率是比较低的。例如,如果升压转换器的效率为90%,降压转换器的效率为95%,那么总体效率只有85.5%。一定有一个耗能更低的好方法来生成这个3.3V电压。使用TPS63025降压-升压转换
-
maylove
模拟与混合信号
- 再下一城,EP868已支持STM32F全系列JTAG/SWD脱机下载
- 下表为截至2009.10.15EP868对ST的支持情况一览表,以及将补强的内容。再下一城,EP868已支持STM32F全系列JTAG/SWD脱机下载
-
探索者
stm32/stm8
- 无线数据通信协议制定
- 我们用电台做数据的传输,电台属于半双工,所以设备在一个信道上。所以当有2个以上的设备同时发送时,数据会产生碰撞,发送失败。 我们是一个主站,多个从站(140台左右)。主站下发信息,从站收到后回复ACK,表示通讯成功。从站也有主动上传的时候。原来我们用的时分复用方式,给从站分配不同的ID号。主站先发送信息,过2秒后,发送同步信号,从站收到后在自己的时间片内(通过从站ID得到)上传数据。这种方式数据传输比较可靠,但实时性上不好。所以想采用CSMA/CA的方式,检测信道,空闲后发送。 现在用的电台
-
xinxi
嵌入式系统
- 大学生电子设计竞赛指南(资源下载)
- 大学生电子设计竞赛指南: 大学生电子设计竞赛指南(资源下载)
-
sigma
电子竞赛
- 2015电设各种讨论
- 为了梦想我们选择了同样的专业,为了兴趣我们选择了同样的比赛。虽然有的是神,有的是人,有的是鬼。但可以肯定我们都是一群放弃治疗的孩子。或许为了梦醒,或许为了尊严,或许为了证明自己,但我们都来到了同一个精神病院。不放假不睡觉明知道前边有老虎就还就是想把老虎的牙隔断。有什么想说的有什么想问的来这里一起聊聊吧!!!”病友们“!!! 2015电设各种讨论
-
123liulang321
电子竞赛
- 为什么BUCK的电路效率一般比较高呢?
- 为什么BUCK的电路效率一般比较高呢?BUCk电路效率的高低是不是也取决于负载如果轻负载的情况效率是不是也不会高? 为什么BUCK的电路效率一般比较高呢?
-
小太阳yy
开关电源学习小组