2赞

15回答

3收藏

STM32F0 #16项目进程帖(二) ---- AM2301温湿度驱动程序

 

STMCU STMCU 17818 人阅读 | 15 人回复 | 2012-11-07

本帖最后由 Kite 于 2012-11-8 11:20 编辑

    AM2301,也叫DHT21,与常见的DHT11温湿度传感器属同一系列,故下面驱动程序可全面支持AM23XX、DHTXX系列温湿度传感器
     先上传几个资料,
     第一个是AM2301的说明书,里面有AM2301传感器的技术参数以及与微控制器连接的时序;
     第二个是用STM32F051控制AM2301串口输出温湿度的例程,输出效果如下:


  
      
AM2301(DHT21)规格书.pdf (437.31 KB, 下载次数: 322)

      
STM32F051 AM2301串口输出.rar (2.17 MB, 下载次数: 1022)


       最后贴一下AM2301驱动部分的程序
AM2301.h
  1. /**
  2.   ******************************************************************************
  3.   * @file    AM23xx.h
  4.   * @author  Kite
  5.   * @version NULL
  6.   * @date    4-November-2012
  7.   * @brief          The AM23xx header file.
  8.   ******************************************************************************
  9.   */

  10. #ifndef __AM23XX_H
  11. #define        __AM23XX_H

  12. /* Includes ------------------------------------------------------------------*/
  13.         #include "stm32f0xx.h"

  14. /* Definitions ---------------------------------------------------------------*/
  15.         //IO方向设置(AM2301_DATA: PB13)
  16.         #define AM23XX_IN_SET                        {GPIOB->MODER &= 0xF3FFFFFF; }
  17.         #define AM23XX_OUT_SET                        {GPIOB->MODER &= 0xF3FFFFFF; GPIOB->MODER |= 1<<26;}

  18.         //IO操作设置
  19.         #define AM23XX_OUT(x)                        (x) ? (GPIOB->BSRR |= 1<<13) : (GPIOB->BRR |= 1<<13)
  20.         #define AM23XX_IN                                (GPIOB->IDR & 1<<13)

  21. /* Exported variables --------------------------------------------------------*/
  22. //extern uint8_t AM_SensorData[5];
  23. extern uint16_t RH_value;
  24. extern uint16_t Temp_value;

  25. /* Exported functions declared ---------------------------------------------- */
  26. unsigned char AM23XX_Read(void);                                //读取温湿度
  27. unsigned char AM23XX_DataCheck(void);                        //数据校验
  28. void AM23XX_DataConvert(void);                                        //数据格式转换

  29. #endif
复制代码
AM2301.c
  1. /**
  2.   ******************************************************************************
  3.   * @file    AM23xx.c
  4.   * @author  Kite
  5.   * @version NULL
  6.   * @date    4-November-2012
  7.   * @brief          The AM23xx C file.
  8.   ******************************************************************************
  9.   */

  10. /* Includes ------------------------------------------------------------------*/
  11. #include "AM23xx.h"
  12. #include "delay.h"               

  13. //delay functions
  14. void delay_am23xx_ms(uint16_t xms)
  15. {
  16.         delay_ms(xms);
  17. }

  18. /* Exported variables --------------------------------------------------------*/
  19. uint8_t AM_SensorData[5]={0x00, 0x00, 0x00, 0x00, 0x00};
  20. uint16_t RH_value;
  21. uint16_t Temp_value;

  22. /* Private functions declared ------------------------------------------------*/
  23. unsigned char AM23XX_Read_Byte(void);                //读取单字节

  24. /* Exported functions ------------------------------------------------------- */
  25.         /**
  26.           * @brief  AM23XX read data.
  27.           * @param  None
  28.           * @retval dat: The data to be read.
  29.           */
  30.         unsigned char AM23XX_Read(void)                                                //读取温湿度
  31.         {               
  32.                 unsigned char i, AM23XX_answerFlag=0;
  33.                 unsigned int cnt=0;
  34.         
  35.                 AM23XX_OUT_SET;                                        //IO设置为输出
  36.                
  37.                 AM23XX_OUT(0);                                                //主机发开始信号, 单总线拉低(至少500us)
  38.                 delay_ms(1);                                                
  39.                
  40.                 AM23XX_OUT(1);                                                //释放总线, 等待从机响应
  41.                 delay_us(30);                                //延时(20~40us)
  42.                 AM23XX_IN_SET;                                                //IO设置为输入
  43.                
  44.                 if(AM23XX_IN == 0)                                        //检测从机响应信号        
  45.                 {
  46.                         cnt = 0;
  47.                         while(! AM23XX_IN)                                //等待低电平结束(80us)
  48.                         {
  49.                                 if(++cnt >= 100000)
  50.                                         return 0;
  51.                         }
  52.                         cnt = 0;
  53.                         while(AM23XX_IN)                                //等待高电平结束
  54.                         {
  55.                                 if(++cnt >= 100000)
  56.                                         return 0;
  57.                         }
  58.                         
  59.                         for(i=0; i<5; i++)
  60.                         {
  61.                                 AM_SensorData[i] = AM23XX_Read_Byte();
  62.                         }
  63.                         AM23XX_answerFlag = 1;                        //应答标志变量置位
  64.                 }
  65.                 else
  66.                 {
  67.                         AM23XX_answerFlag = 0;
  68.                 }
  69.                
  70.                 return AM23XX_answerFlag;
  71.         }

  72.         /**
  73.           * @brief  Check the data received.
  74.           * @param  None
  75.           * @retval None
  76.           */  
  77.         unsigned char AM23XX_DataCheck(void)
  78.         {
  79.                 uint8_t data_check;
  80.                 data_check = AM_SensorData[0]+AM_SensorData[1]+AM_SensorData[2]+AM_SensorData[3];
  81.                 if(data_check == AM_SensorData[4])
  82.                         return 1;
  83.                 else
  84.                         return 0;
  85.         }

  86.         /**
  87.           * @brief  Convert the data to decimal base.
  88.           * @param  None
  89.           * @retval None
  90.           */
  91.         void AM23XX_DataConvert(void)
  92.         {
  93.                 RH_value = AM_SensorData[0]*256 + AM_SensorData[1];
  94.                 Temp_value = AM_SensorData[2]*256 + AM_SensorData[3];
  95.         }
  96.         
  97. /* Private functions -------------------------------------------------------- */
  98.         /**
  99.           * @brief  AM23XX Read single byte.
  100.           * @param  None
  101.           * @retval None
  102.           */  
  103.         unsigned char AM23XX_Read_Byte(void)
  104.         {
  105.                 unsigned char i, single_bit, dat;
  106.                 unsigned int cnt;
  107.                 AM23XX_IN_SET;                                        //IO设置为输入
  108.                
  109.                 for(i=0; i<8; i++)
  110.                 {
  111.                         while(! AM23XX_IN)                                //等待低电平结束
  112.                         {
  113.                                 if(++cnt >= 100000)
  114.                                         break;
  115.                         }
  116.                         delay_us(30);                                        //判断单位数据(26~28us为"0", 70us为"1")
  117.                         single_bit = 0;
  118.                         if(AM23XX_IN)                                        //若高电平时间超过30us,则为"1"
  119.                         {
  120.                                 single_bit = 1;
  121.                         }
  122.                         cnt = 0;
  123.                         while(AM23XX_IN)                                //等待高电平结束
  124.                         {
  125.                                 if(++cnt >= 100000)
  126.                                         break;
  127.                         }
  128.                         dat <<= 1;                                                //存储数据
  129.                         dat |= single_bit;
  130.                 }
  131.                 return dat;
  132.         }

复制代码
分享到:
回复

使用道具 举报

回答|共 15 个

倒序浏览

沙发

dwwzl

发表于 2012-11-7 17:44:20 | 只看该作者

来支持一下了!
用技术,爱生活!
板凳

swustlx86

发表于 2012-11-7 18:29:25 | 只看该作者

支持一下
地板

zhangb7309

发表于 2012-11-7 19:50:54 | 只看该作者

支持!!!                 
5#

陈克雄

发表于 2012-11-7 22:38:30 | 只看该作者

dwwzl 发表于 2012-11-7 17:44
来支持一下了!

谢谢关注
6#

陈克雄

发表于 2012-11-7 22:38:47 | 只看该作者

swustlx86 发表于 2012-11-7 18:29
支持一下

Thanks~
7#

陈克雄

发表于 2012-11-7 22:39:12 | 只看该作者

zhang7309 发表于 2012-11-7 19:50
支持!!!

哈哈,以后大家多多交流哈
8#

wangyue2725_3009096

发表于 2013-5-17 09:26:37 | 只看该作者

使用了楼主的例程,有些地方执行有问题,在读取的时候,无法读到数据,希望楼主能给予帮助
9#

陈克雄

发表于 2013-5-20 16:13:56 | 只看该作者

wangyue2725 发表于 2013-5-17 09:26
使用了楼主的例程,有些地方执行有问题,在读取的时候,无法读到数据,希望楼主能给予帮助 ...

用的什么芯片?这个是STM32F051驱动AM2301的程序,如果其他芯片的话得自己改改
10#

tyng

发表于 2014-12-9 08:43:29 | 只看该作者

支持楼主!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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