来源:百文网_嵌入式Linux wiki_jz2440新题1视频Wiki教程(视频文字版)
作者:魏东山
本文字数:2379,阅读时间:4分钟
本课程首先介绍如何使用DH11 温湿度传感器。首先,检查芯片的手册。
MCU通过数据线连接到DH11,MCU通过该线向DH11发送命令,DH11通过该线向MCU发送数据。
因此,温湿度模块的核心是MCU发送给DH11的命令格式和DH11返回的数据格式。
让我们快速了解一下沟通的时机。
灰色区域由MCU驱动程序控制,浅色阴影区域由DH11驱动程序控制。
首先,MCU 发送一个启动信号,该信号是一个低脉冲,然后拉高。
然后DH11变低,产生响应信号,然后变高。
接下来是DH11返回的数据。
这些数据总共40 位,最高位在前。
数据格式:8bit 湿度整数数据+ 8bit 湿度小数数据+ 8bit 温度整数数据+ 8bit 温度小数数据+ 8bit 校验和
当前的小数部分将用于将来的扩展,并且将被读取为零。
如果数据传输正确,校验和数据将等于“湿度8位整数数据+湿度8位小数数据+温度8位整数数据+温度8位小数数据”的后8位。
DH11的难点在于前面提到的定时脉冲。必须满足一定的时间,例如启动信号:
MCU 必须首先拉低至少18ms,然后拉高20-40 微秒。 DH11 通过拉低80 微秒并最终拉高80 微秒进行响应。
接下来就是发送数据了,但是DH11如何提供这些数据并代表0和1呢?
可以看到0和1都是从50us的低电平开始的。
如果数据为0,则保持高电平26-28us。
1个数据之后是70us的高电平。
有了以上知识和之前的高精度延迟,你就可以开始编写你的程序了。
复制前面第二个程序,将文件重命名为003_dht11_022_003,在sensor目录下新建dht11目录,并创建dht11.c文件。
我们的目的是控制GPIO并读取DHT11数据。流程如下。
1、主机发送至少18MS的低脉冲:启动信号。 2. 启动信号变高20-40us,然后使总线变高以获得80us: 响应信号。接下来是数据,并向bit0 : 发送一个50us 低脉冲和26-28us 高脉冲。
bit1 : 50us 低脉冲,70us 高脉冲
4、数据包括40bit: 8位湿度整数数据+8位湿度小数数据+8位温度整数数据+8位温度小数数据+8位校验和。 DH11 的DATA 引脚连接到GPG5。
首先,实现基本的GPIO 操作并配置GPIO 模式以实现输出和输入引脚功能。
static void dht11_data_cfg_as_output(void){GPGCON=~(310);GPGCON |=(110);} static void dht11_data_cfg_as_input(void){GPGCON=~(310);} 接下来,设置输出电平或输入引脚数据。
static void dht11_data_set(int val){if (val)GPGDAT |=(15);elseGPGDAT=~(15);}static int dht11_data_get(void){if (GPGDAT (15))return 1;elsereturn 0;} 实现让我们再次执行DHT11读操作。
根据芯片手册,DH11传感器上电后,需要等待1秒来克服不稳定,在此期间不需要发送指令。
因此,首先创建一个跳过这种不稳定状态的初始化函数。
void dht11_init(void){dht11_data_cfg_as_output();dht11_data_set(1);mlay(2000);} 编写一个程序,根据启动时序要求,保持低电平18ms以上,然后释放引脚。可用作输入引脚。
该引脚连接有上拉电阻,因此当MCU 配置为输入时,该引脚的电平由上拉电阻决定。
static void dht11_start(void){dht11_data_set(0);mlay(20);dht11_data_cfg_as_input();} 然后等待40us以上,读取引脚电平,看引脚是否拉低,判断DH11是否响应。
static int dht11_wait_ack(void){ulay(60);return dht11_data_get();}创建一个延迟函数,用于确定何时等待响应信号结束。
static int dht11_wait_for_val(int val, int timeout_us){while (timeout_us--){if (dht11_data_get()==val)return 0; /* ok */ulay(1);}return -1;下一个数据由5 组成字节数。这里我们首先写入和读取1个字节,每个字节必须读取8位。
首先等待高电平,过滤典型延迟50us,然后延迟至少28us,然后再读取引脚上的电平。
如果引脚电平为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 等待高数据错误!\n \ r');return -1;}ulay(40);data=1;if (dht11_data_get()==1)data |=1;if (dht11_wait_for_val(0, 1000)){printf('dht11 低数据等待错误!\n\r');return -1;}}返回数据;} 《新品公告》 STM32MP157开发板现已接受预订。初期产量仅为300套。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。