ESP32 单总线驱动DHT11(6)

ESP32使用 DHT11 传感器 通过 IO4 读出当前的温度和湿度。
起始信号
主机拉低总线不能小于 18ms(最大不得超过 30ms),然后微处理器的 I/O 设置为输入状态,由 于上拉电阻,主机的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作出回答信号,
从机响应信号
DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA 引脚处于输出状态,输出 83 微秒的低电平作为应答信号,紧接着输出 87 微秒的高电平通知外设准 备接收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等 待 87 微秒的高电平后的数据接收,

static  void InputInitial(void)//设置端口为输入
{
gpio_pad_select_gpio(DHT11_PIN); gpio_set_direction(DHT11_PIN, GPIO_MODE_INPUT);
}

static  void  OutputHigh(void)//输出 1
{
gpio_pad_select_gpio(DHT11_PIN); gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT); gpio_set_level(DHT11_PIN, 1);
}

static  void  OutputLow(void)//输出 0
{
gpio_pad_select_gpio(DHT11_PIN); gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT); gpio_set_level(DHT11_PIN, 0);
}
位数据 0 和位数据 1 的区别是:数据 1 的高电平时间比数据 0 的时间长,根据这个特 点,读取一个字节的代码如下:

```c
//读取一个字节数据
static void COM(void)	// 温湿写入
{
uchar i; for(i=0;i<8;i++)
{
ucharFLAG=2;

//等待 IO 口变低,变低后,通过延时去判断是 0 还是 1 while((getData()==0)&&ucharFLAG++) ets_delay_us(10); ets_delay_us(35);//延时 35us
uchartemp=0;

//如果这个位是 1,35us 后,还是 1,否则为 0 if(getData()==1)  uchartemp=1; ucharFLAG=2;

//等待 IO 口变高,变高后,表示可以读取下一位 while((getData()==1)&&ucharFLAG++) ets_delay_us(10); if(ucharFLAG==1)break;
ucharcomdata<<=1; ucharcomdata|=uchartemp;
}
}

按下开发板的复位键,让程序运行起来,观察显示屏的显示。
在这里插入图片描述
最后推荐一款开发套件,可以手淘扫码查看。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bytechip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值