本帖最后由 wind_west 于 2019-9-16 20:42 编辑

   DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。工程中使用的延时函数参考大神的帖子:【东芝TT_M3HQ开发板试用体验】使用系统定时器SysTick实现精确延时微秒和毫秒函数模块的连线相当简单(模块---MCU):GND---GND,VCC---VCC3.3,DATA---PN4。现在截取两张硬件的示意图如下
图1.jpg
图4.JPG
1、移植驱动文件
    DHT11的驱动移植也比较成熟了,购买模块的时候附带了STM32的驱动文件。复制驱动文件到工程目录下,同时在MDK里面添加相关的组。相关的文件复制完成后,在MDK里面设置文件的包含路径。然后,就是在使用的文件里,添加头文件。
效果如图:
图2.jpg
图3.JPG
2、在main()中添加业务执行逻辑
    在main函数中添加执行逻辑:
int main(void)
  • {
  •     /*----------------------*/
  •     /* BSP initialize       */
  •     /*----------------------*/
  •     bsp_initialize();
  •     /*----------------------*/
  •     /* Initialize           */
  •     /*----------------------*/
  •     /*--- variable    ---*/
  •     variable_initialize();
  •     /*--- driver      ---*/
  •     if (driver_initialize() != TXZ_SUCCESS)
  •     {
  •         proc = PROC_ERROR;
  •     }
  •     /*--- application ---*/
  •     if (application_initialize() != TXZ_SUCCESS)
  •     {
  •         proc = PROC_ERROR;
  •     }
  •                
  •                 delay_init();
  •                
  •                         /*初始化DTT11的引脚*/
  •                 DHT11_GPIO_Config();
  •                 /*调用Read_DHT11读取温湿度,若成功则输出该信息*/
  •                 if( Read_DHT11(&DHT11_Data)==SUCCESS)
  •                 {
  •                         printf("\r\n读取DHT11成功!\r\n\r\n湿度为%d.%d %RH ,温度为 %d.%d℃ \r\n",\
  •                         DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);
  •                         //printf("\r\n 湿度:%d,温度:%d \r\n" ,DHT11_Data.humi_int,DHT11_Data.temp_int);
  •                 }
  •                 else
  •                 {
  •                         printf("Read DHT11 ERROR!\r\n");
  •                 }
  •                
  •                
  •     /*----------------------*/
  •     /* Main Processing      */
  •     /*----------------------*/
  •     while(proc != PROC_ERROR)
  •     {
  •     }
  •     /*>>> System Error. Please Debug. */
  •     /*----------------------*/
  •     /* Finalize             */
  •     /*----------------------*/
  •     /*--- application ---*/
  •     if (application_finalize() != TXZ_SUCCESS)
  •     {
  •         /* no processing */
  •     }
  •     /*--- driver      ---*/
  •     if (driver_finalize() != TXZ_SUCCESS)
  •     {
  •         /* no processing */
  •     }
  •     /*----------------------*/
  •     /* BSP finalize         */
  •     /*----------------------*/
  •     bsp_finalize();
  • #ifdef DEBUG
  •     assert_failed(MAIN_NULL, 0);
  • #endif
  •     return(0);
  • }
  • 复制代码
    在while(1)之前,比较重要的函有DHT11_GPIO_Config()和Read_DHT11(&DHT11_Data)
    DHT11_GPIO_Config()函数是和MCU相关的函数,先前是基于STM32写的,所以换成我们自己的MCU就适当修改一下:
    void DHT11_GPIO_Config(void)
  • {               
  •         static gpio_t port;     /*!< Port driver instance. */
  •         static gpio_t My_port_Use;     /*!< 我需要进行置位操作的port. */
  •         
  •         port.p_pn_instance = TSB_PN;
  •     /*--- Initialize ---*/
  •     if (gpio_init(&port, GPIO_PORT_N) != TXZ_SUCCESS)
  •     {
  •        // bsp_error();
  •     }
  •     /*--- Setting    ---*/
  •     /*- PJ0 -*/
  •     if (gpio_func(&port, GPIO_PORT_N, GPIO_PORT_4, (uint32_t)GPIO_PN4_OUTPUT, GPIO_PIN_INOUT) != TXZ_SUCCESS)
  •     {
  •       //  bsp_error();
  •     }
  •                
  •    gpio_write_bit(&My_port_Use,GPIO_PORT_N,GPIO_PORT_4,GPIO_Mode_DATA,GPIO_PIN_SET);//PJ5端口电平置高
  •         
  • }
  • 复制代码
        Read_DHT11(&DHT11_Data)函数的这个参数,是定义的全局变量,名字随便定义,看个人喜好。变量的作用为:DHT11_Data_TypeDef DHT11_Data;//用来保存温度值的变量。Read_DHT11()是读取数据的函数,内容不少,但是比较重要就是DHT11_DATA_IN()。因为东芝这款MCU里面的gpio_read_bit(p_obj1,  group1,  num1,  mode1, pinstate1)返回值并不是引脚电平,只是函数执行的结果值,所以需要我们简单的封装一下,得到引脚电平就OK了:
    #define  DHT11_DATA_IN()               my_read_gpio(&port_pn4, GPIO_PORT_N, GPIO_PORT_4, GPIO_Mode_DATA, &my_val)
    复制代码


    uint32_t my_read_gpio(gpio_t *p_obj1, uint32_t group1, uint32_t num1, uint32_t mode1, gpio_pinstate_t *pinstate1)
  • {
  •         uint32_t val =0;
  •         gpio_read_bit(p_obj1,  group1,  num1,  mode1, pinstate1);
  •         val =        *pinstate1;
  •         return  val;
  • }
  • 复制代码
    最后,更新底层的驱动宏定义:
    static gpio_pinstate_t my_val = GPIO_PIN_SET;
    static gpio_t port_pn4;     /*!< Port driver instance. */

    //带参宏,可以像内联函数一样使用,输出高电平或低电平
    #define DHT11_DATA_OUT(a) if (a) \
         (gpio_write_bit(&port_pn4,GPIO_PORT_N,GPIO_PORT_4,GPIO_Mode_DATA,GPIO_PIN_SET));\
         else  \
         (gpio_write_bit(&port_pn4,GPIO_PORT_N,GPIO_PORT_4,GPIO_Mode_DATA,GPIO_PIN_RESET))

    uint32_t my_read_gpio(gpio_t *p_obj1, uint32_t group1, uint32_t num1, uint32_t mode1, gpio_pinstate_t *pinstate1);
    //读取引脚的电平
    #define  DHT11_DATA_IN()               my_read_gpio(&port_pn4, GPIO_PORT_N, GPIO_PORT_4, GPIO_Mode_DATA, &my_val) //


    #define  Bit_RESET  0   
    #define  Bit_SET  1   

    谢谢大家的阅读,底部奉上附件:
    YL-47 dht11 资料.zip (5.5 MB, 下载次数: 2)
    交流单片机MCU、处理器、ARM技术、DSP,以及嵌入式系统硬件与软件的平台
    • 帖子 5185
    • 回复 5701
    举报
    内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
    请点击举报理由
    关闭 站长推荐上一条 /4 下一条
    • 返回顶部