查看: 737|回复: 12

[GD32F190方案分享] GD32 Colibri-F190R8开发板+DHT11+USART

[复制链接]

4

主题

0

好友

734

积分

举人

Rank: 4

  • TA的每日心情
    开心
    前天 10:03
  • 签到天数: 110 天

    [LV.6]常住居民II

    发表于 2016-5-23 17:19:33 |显示全部楼层
    本帖最后由 糖悦之果飞 于 2016-5-23 17:27 编辑

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


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

    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, 下载次数: 30)














    回复

    使用道具 举报

    553

    主题

    3

    好友

    1万

    积分

    翰林

    Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    擦汗
    2014-2-12 10:49
  • 签到天数: 150 天

    [LV.7]常住居民III

    发表于 2016-5-24 09:15:57 |显示全部楼层
    感谢分享!支持!
    回复

    使用道具 举报

    无效楼层,该帖已经被删除

    4

    主题

    0

    好友

    734

    积分

    举人

    Rank: 4

  • TA的每日心情
    开心
    前天 10:03
  • 签到天数: 110 天

    [LV.6]常住居民II

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

    上拉用的 5.1K 管脚 有没有 接错 我接的是PA15
    回复

    使用道具 举报

    4

    主题

    0

    好友

    734

    积分

    举人

    Rank: 4

  • TA的每日心情
    开心
    前天 10:03
  • 签到天数: 110 天

    [LV.6]常住居民II

    发表于 2016-5-27 13:38:25 |显示全部楼层
    zada小明 发表于 2016-5-24 09:15
    感谢分享!支持!

    一起学习 一起分享
    回复

    使用道具 举报

    6#
    无效楼层,该帖已经被删除

    4

    主题

    0

    好友

    734

    积分

    举人

    Rank: 4

  • TA的每日心情
    开心
    前天 10:03
  • 签到天数: 110 天

    [LV.6]常住居民II

    发表于 2016-5-30 09:40:36 |显示全部楼层
    不客气                  
    回复

    使用道具 举报

    195

    主题

    3

    好友

    9635

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2016-5-31 15:15:22 |显示全部楼层
    文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/
    回复

    使用道具 举报

    18

    主题

    3

    好友

    526

    积分

    举人

    Rank: 4

  • TA的每日心情
    慵懒
    2016-11-17 11:09
  • 签到天数: 45 天

    [LV.5]常住居民I

    发表于 2016-8-7 23:07:46 |显示全部楼层
    糖悦之果飞 发表于 2016-5-31 15:15
    文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/ ...

    经验频道和论坛不是一个频道啊?
    回复

    使用道具 举报

    195

    主题

    3

    好友

    9635

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2016-8-8 17:19:37 |显示全部楼层
    enenge 发表于 2016-8-7 23:07
    经验频道和论坛不是一个频道啊?

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

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-7 00:10 , Processed in 0.265943 second(s), 21 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部