本实验的源码工程在开发板光盘资料的:i.MX6UL终结者光盘资料\04_裸机例程源码\20_dht11目录下。我们在Ubuntu系统下使用命令“mkdir 20_dht11”建立“20_dht11”文件夹,如图 1所示:
然后使用“cd 20_dht11”命令进入到20_dht11文件夹,如图 2所示:
然后使用命令“cp -r …/19_mpu6050/* ./”将上一章例程中的所有内容拷贝到刚刚新建的“20_dht11”里面,如图 3所示:
然后在drivers目录下建立dht11文件夹,用来保存dht11的驱动文件,然后在“drivers/dht11”目录中新建dht11.h和dht11.c两个文件,然后在dht11.h文件输入下面的代码:
1 #ifndef __BSP_DHT11_H
2 #define __BSP_DHT11_H
3 #include "imx6ul.h"
4
5 /* 函数声明 */
6 void dht11_init(void);
7 void dht11_send_start_cmd(void);
8 unsigned char dht11_check_ack(void);
9 void set_dht11_io_out(void);
10 void set_dht11_io_in(void);
11 void dht11_io_out(unsigned char value);
12 unsigned char dht11_get_gpio_value(void);
13 unsigned char dht11_get_bit(void);
14 unsigned char dht11_get_byte(void);
15 #endif
dht11.h文件里面主要是声明了一些函数。然后我们打开dht11.c文件,在里面输入下面的代码:
1 #include "delay.h"
2 #include "dht11.h"
3
4 /*
5 * @description : 初始化DHT11对应的GPIO
6 * @param : 无
7 * @return : 无
8 */
9 void dht11_init(void)
10 {
11 /* 1、初始化IO复用 */
12 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER2_GPIO5_IO02, 0);/* 复用为GPIO5_IO02 */
13
14
15 /* 2、、配置GPIO1_IO03的IO属性
16 *bit 16:0 HYS关闭
17 *bit [15:14]: 10 默认100K上拉
18 *bit [13]: 0 kepper功能
19 *bit [12]: 1 pull/keeper使能
20 *bit [11]: 0 关闭开路输出
21 *bit [7:6]: 10 速度100Mhz
22 *bit [5:3]: 110 R0/6驱动能力
23 *bit [0]: 0 低转换率
24 */
25 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER2_GPIO5_IO02, 0X90B0);
26 }
27
28 /*
29 * @description : 开启一次读取DHT11操作
30 * @param : 无
31 * @return : 无
32 */
33 void dht11_send_start_cmd(void)
34 {
35 /* 初始化GPIO,GPIO5_IO02设置为输出 */
36 set_dht11_io_out();
37
38 /* GPIO5_IO02输出低电平*/
39 dht11_io_out(0);
40 delayms(20);
41 /* GPIO5_IO02输出高电平*/
42 dht11_io_out(1);
43 delayus(40);
44 }
45
46 /*
47 * @description : 判断DHT11设备是否有应答
48 * @param : 无
49 * @return : 有应答:0,无应答:1
50 */
51 unsigned char dht11_check_ack(void)
52 {
53 unsigned char retry = 0;
54
55 /* 设置GPIO5_IO02为输入模式 */
56 set_dht11_io_in();
57
58 /* DHT11会拉低40~80us */
59 while(dht11_get_gpio_value() && (retry<100))
60 {
61 retry++;
62 delayus(1);
63 }
64
65 if(retry>=100