DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。工程中使用的延时函数参考大神的帖子:【东芝TT_M3HQ开发板试用体验】使用系统定时器SysTick实现精确延时微秒和毫秒函数。模块的连线相当简单(模块---MCU):GND---GND,VCC---VCC3.3,DATA---PN4。现在截取两张硬件的示意图如下:


1、移植驱动文件
效果如图:


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端口电平置高 }
复制代码#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
谢谢大家的阅读,底部奉上附件:

举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
关闭
站长推荐
/4


-
返回顶部
-