11回答

2收藏

GD32 Colibri-F190R8开发板+DHT11+USART

GD32 GD32 7924 人阅读 | 11 人回复 | 2016-05-23

本帖最后由 糖悦之果飞 于 2016-5-23 17:27 编辑

1.用GD32 Colibri-F190R8开发板采集温湿度值,传感器采用的是常见的DHT11。把采集到的数据通过串口发送到PC端串口助手。传感器链接电源3.3V,数据脚接PA15。LED6(PB9)作为工作指示灯,不停的闪烁。


2.串口采用USART2,波特率115200.

3.读取DHT11 数据 dht11.c  (这个程序是根据原子哥的教学程序改的)
  1. #include "dht11.h"
  2. #include "delay.h"
  3. #include "gd32f1x0_gpio.h"
  4. //////////////////////////////////////////////////////////////////////////////////         

  5. //////////////////////////////////////////////////////////////////////////////////


  6. /*******************************************************************************************************
  7. ** 函 数 名: DHT11_Mode_IPU
  8. **------------------------------------------------------------------------------------------------------
  9. ** 函数原型:
  10. ** 函数功能: 使DHT11-DATA引脚变为输入模式
  11. ** 入口参数:
  12. ** 返 回 值:
  13. ** 作者:
  14. ********************************************************************************************************/
  15. static void DHT11_IO_IN(void)
  16. {
  17.         GPIO_InitPara GPIO_InitStructure;                                  /*定义一个GPIO_InitTypeDef类型的结构体*/                                                                                                                           
  18.           GPIO_InitStructure.GPIO_Pin         = DHT11_DQ;                               /*选择要控制的GPIOA引脚*/                        
  19.           GPIO_InitStructure.GPIO_Mode         = GPIO_MODE_IN;                                  /*设置引脚模式为输入*/   
  20.           GPIO_InitStructure.GPIO_Speed        = GPIO_SPEED_50MHZ;                         /*设置引脚速率为50MHz */         
  21.           GPIO_Init(GPIOA, &GPIO_InitStructure);                                                        /*调用库函数,初始化GPIOA*/         
  22. }
  23. //IO方向设置

  24. /*******************************************************************************************************
  25. ** 函 数 名:
  26. **------------------------------------------------------------------------------------------------------
  27. ** 函数原型:
  28. ** 函数功能: 使DHT11-DATA引脚变为输出模式
  29. ** 入口参数: NONE
  30. ** 返 回 值: NONE
  31. ** 作者:
  32. ********************************************************************************************************/
  33. static void DHT11_IO_OUT(void)
  34. {
  35.         GPIO_InitPara GPIO_InitStructure;                                  /*定义一个GPIO_InitTypeDef类型的结构体*/                                                                                                                           
  36.           GPIO_InitStructure.GPIO_Pin         = DHT11_DQ;                               /*选择要控制的GPIOA引脚*/                        
  37.           GPIO_InitStructure.GPIO_Mode         = GPIO_MODE_OUT;                       /*设置引脚模式为输出*/   
  38.           GPIO_InitStructure.GPIO_Speed        = GPIO_SPEED_50MHZ;                         /*设置引脚速率为50MHz */         
  39.           GPIO_Init(GPIOA, &GPIO_InitStructure);                                                        /*调用库函数,初始化GPIOA*/  
  40. }

  41. //复位DHT11
  42. void DHT11_Rst(void)        
  43. {                 
  44.         DHT11_IO_OUT();         //SET OUTPUT
  45.    GPIO_ResetBits(GPIOA, DHT11_DQ);//拉低DQ
  46.    delay_ms(20);            //拉低至少18ms
  47.    GPIO_SetBits(GPIOA, DHT11_DQ);          //DQ=1
  48.         delay_us(30);             //主机拉高20~40us
  49. }
  50. //等待DHT11的回应
  51. //返回1:未检测到DHT11的存在
  52. //返回0:存在
  53. uint8_t DHT11_Check(void)            
  54. {   
  55.         uint8_t retry=0;
  56.         DHT11_IO_IN();//SET INPUT         
  57.     while (GPIO_ReadInputBit(GPIOA, DHT11_DQ)&&retry<100)//DHT11会拉低40~80us
  58.         {
  59.                 retry++;
  60.                 delay_us(1);
  61.         };         
  62.         if(retry>=100)return 1;
  63.         else retry=0;
  64.     while (!GPIO_ReadInputBit(GPIOA, DHT11_DQ)&&retry<100)//DHT11拉低后会再次拉高40~80us
  65.         {
  66.                 retry++;
  67.                 delay_us(1);
  68.         };
  69.         if(retry>=100)return 1;            
  70.         return 0;
  71. }
  72. //从DHT11读取一个位
  73. //返回值:1/0
  74. uint8_t DHT11_Read_Bit(void)                          
  75. {
  76.          uint8_t retry=0;
  77.         while(GPIO_ReadInputBit(GPIOA, DHT11_DQ)&&retry<100)//等待变为低电平
  78.         {
  79.                 retry++;
  80.                 delay_us(1);
  81.         }
  82.         retry=0;
  83.         while(!GPIO_ReadInputBit(GPIOA, DHT11_DQ)&&retry<100)//等待变高电平
  84.         {
  85.                 retry++;
  86.                 delay_us(1);
  87.         }
  88.         delay_us(40);//等待40us
  89.         if(GPIO_ReadInputBit(GPIOA, DHT11_DQ))return 1;
  90.         else return 0;                  
  91. }
  92. //从DHT11读取一个字节
  93. //返回值:读到的数据
  94. uint8_t DHT11_Read_Byte(void)   
  95. {        
  96.     uint8_t i,dat;
  97.     dat=0;
  98.         for (i=0;i<8;i++)
  99.         {
  100.                    dat<<=1;
  101.             dat|=DHT11_Read_Bit();
  102.     }                                                   
  103.     return dat;
  104. }
  105. //从DHT11读取一次数据
  106. //temp:温度值(范围:0~50°)
  107. //humi:湿度值(范围:20%~90%)
  108. //返回值:0,正常;1,读取失败
  109. uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)   
  110. {        
  111.          uint8_t buf[5];
  112.         uint8_t i;
  113.         DHT11_Rst();
  114.         if(DHT11_Check()==0)
  115.         {
  116.                 for(i=0;i<5;i++)//读取40位数据
  117.                 {
  118.                         buf[i]=DHT11_Read_Byte();
  119.                 }
  120.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  121.                 {
  122.                         *humi=buf[0];
  123.                         *temp=buf[2];
  124.                 }
  125.         }else return 1;
  126.         return 0;            
  127. }
  128. //初始化DHT11的IO口 DQ 同时检测DHT11的存在
  129. //返回1:不存在
  130. //返回0:存在            
  131. uint8_t DHT11_Init(void)
  132. {         
  133.         GPIO_InitPara  GPIO_InitStructure;                                                                 /*定义一个GPIO_InitTypeDef类型的结构体*/
  134.         RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOA, ENABLE ); /*开启GPIOA的外设时钟*/
  135.         
  136.         //GPIO_InitPara GPIO_InitStructure;                                  /*定义一个GPIO_InitTypeDef类型的结构体*/                                                                                                                           
  137.           GPIO_InitStructure.GPIO_Pin         = DHT11_DQ;                               /*选择要控制的GPIOA引脚*/                        
  138.           GPIO_InitStructure.GPIO_Mode         = GPIO_MODE_OUT;           /*设置引脚模式为输出*/   
  139.           GPIO_InitStructure.GPIO_Speed        = GPIO_SPEED_50MHZ;                         /*设置引脚速率为50MHz */
  140.          
  141.           GPIO_Init(GPIOA, &GPIO_InitStructure);                                                        /*调用库函数,初始化GPIOA*/                  
  142.         GPIO_SetBits(GPIOA, DHT11_DQ);                                                                          /* 拉高GPIOA3        */
  143.         DHT11_Rst();                                                                                                                          //复位DHT11
  144.         return DHT11_Check();                                                                                                //等待DHT11的回应                           
  145.         
  146. }
复制代码
4.由于才接触32位单片机,对串口中断不是很明白,程序还有些BUG,程序仅作参考。同时希望有那位大神,拿去改改,重新分享给大家学习。

DHT11_f190-V1.2.0.zip (6.52 MB, 下载次数: 41)















分享到:
回复

使用道具 举报

回答|共 11 个

倒序浏览

沙发

zada小明

发表于 2016-5-24 09:15:57 | 只看该作者

感谢分享!支持!
板凳

chen_hang

发表于 2016-5-27 13:37:33 | 只看该作者

本帖最后由 chen_hang 于 2016-5-27 13:40 编辑
jinglixixi 发表于 2016-5-27 13:07
DHT11的上拉电阻是多大,已将它移到LCD5110来显示,但所提供的代码没采到数据,只显示零值。 ...

上拉用的 5.1K 管脚 有没有 接错 我接的是PA15
地板

chen_hang

发表于 2016-5-27 13:38:25 | 只看该作者

zada小明 发表于 2016-5-24 09:15
感谢分享!支持!

一起学习 一起分享
5#

chen_hang

发表于 2016-5-30 09:40:36 | 只看该作者

不客气                  
6#

糖悦之果飞

发表于 2016-5-31 15:15:22 | 只看该作者

文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/
7#

enenge

发表于 2016-8-7 23:07:46 | 只看该作者

糖悦之果飞 发表于 2016-5-31 15:15
文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/ ...

经验频道和论坛不是一个频道啊?
8#

糖悦之果飞

发表于 2016-8-8 17:19:37 | 只看该作者

enenge 发表于 2016-8-7 23:07
经验频道和论坛不是一个频道啊?

不是的呢,直接复制过去即可
9#

enenge

发表于 2016-8-9 11:23:18 | 只看该作者

糖悦之果飞 发表于 2016-8-8 17:19
不是的呢,直接复制过去即可

好的                              
10#

jackten

发表于 2016-12-3 14:30:15 | 只看该作者

谢谢分享            
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条