养生
dht11温湿度传感器程序(DHT11温湿度传感器的使用)

来源:百问网_嵌入式Linux wiki_jz2440 新1期视频维基教程 (视频文字版)

作者:韦东山

本文字数:2379,阅读时长:4分钟

MCU通过一条数据线与DH11连接,MCU通过这条线发命令给DH11,DH11再通过这条线把数据发送给MCU。

再来先简单看一下通讯的时序:

首先MCU发送一个开始信号,这个开始信号是一个低脉冲,然后再拉高。

接着就是DH11返回的数据。

数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

MCU必须先拉低至少18ms,然后再拉高20-40us,DH11再拉低80us以响应,最后再拉高80us.

可以看到,不管是0还是1,都开始是50us的低电平,

对于1数据,之后是70us的高电平;

复制前面的第二个程序,文件名改为003_dht11_022_003,然后在sensors目录里新建dht11目录,再创建一个dht11.c文件。

bit0 : 50us低脉冲, 26-28us高脉冲

DH11的DATA引脚连接到了GPG5。

再设置输出电平或读取引脚数据:

static void dht11_data_set(int val){	if (val)		GPGDAT |= (1<<5);	else		GPGDAT &= ~(1<<5);}static int dht11_data_get(void){	if (GPGDAT & (1<<5))		return 1;	else		return 0;}

在芯片手册里介绍说,DH11传感器上电后,要等待1s,以越过不稳定状态,在此期间无需发送任何指令。

根据start时序要求,编写程序,维持一个大于18ms的低电平,然后释放引脚,即设置为输入引脚即可。

然后等待40us以上,再去读取引脚电平,判断是否被拉低,以确定DH11给了响应。

static int dht11_wait_ack(void){	udelay(60);	return dht11_data_get();}

后面的数据会有五个字节组成,这里先写出读取一个字节,每个字节要读取8位。

如果引脚电平是1,则数据是1,反之是0。

然后再直到低电平的到来,循环8次,完成一个字节数据的读取。

static int dht11_recv_byte(void){	int i;	int data = 0;		for (i = 0; i < 8; i++)	{		if (dht11_wait_for_val(1, 1000))		{			printf("dht11 wait for high data err!\n\r");			return -1;		}		udelay(40);		data <<= 1;		if (dht11_data_get() == 1)			data |= 1;				if (dht11_wait_for_val(0, 1000))		{			printf("dht11 wait for low data err!\n\r");			return -1;		}	}		return data;}

ntent="mp" data-source="innerlink" href="https://www.toutiao.com/i6852662053107302919/?group_id=6852662053107302919" rel="noopener noreferrer" target="_blank">「新品首发」STM32MP157开发板火爆预售!首批仅300套


顶一下()     踩一下()

热门推荐

发表评论
0评