打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
STM32 AM2305高精度温湿度传感器驱动

最近用到的温湿度传感器,AM2305驱动,单总线,上电后至少要延时2S才能读取温湿度,温度精度很高,跟DS18B20一样,数据带校验,不会出现DS18B20那样,并且时序要求不高


  1. /************************************************************************************************************* 
  2.  * 文件名:         AM2305.c 
  3.  * 功能:          STM32 AM2305高精度温湿度传感器驱动 
  4.  * 作者:          cp1300@139.com 
  5.  * 创建时间:        2014-09-20 
  6.  * 最后修改时间:  2014-09-20 
  7.  * 详细:          需要延时函数支持 
  8.  *                  注意延时精度尽可能的高 
  9.  *                  读取的时候不要长时间的被中断,因为1wire对时间要求很严格 
  10. *************************************************************************************************************/  
  11. #include "system.h"  
  12. #include "delay.h"  
  13. #include "AM2305.h"  
  14.   
  15.   
  16.   
  17.   
  18. //DS18B20使用的是GPIOE0  
  19. #define AM2305_CLK_INIT()   DeviceClockEnable(AM2305_DEV, ENABLE);                  //时钟使能  
  20. #define AM2305_IO_OUT()     GPIOx_Init(AM2305_GPIOx,AM2305_BITx,OUT_PP,SPEED_10M);  //设置AM2305 IO为输出,  
  21. #define AM2305_IO_IN()      GPIOx_Init(AM2305_GPIOx,AM2305_BITx,IN_IPU,0);          //设置AM2305 IO为上拉输入,  
  22. #define AM2305_DQ_IN()      ((AM2305_IN) ? 1 : 0)                                   //读取AM2305 IO  
  23. #define AM2305_DQ_OUT(x)    (AM2305_OUT = x)                                        //写AM2305 IO  
  24. #define AM2305_IODown()     GPIOx_Init(AM2305_GPIOx,AM2305_BITx,IN_IPT,0);          //掉电,下拉输入  
  25.   
  26. //精确us延时  
  27. #define AM2305_Delay_US(x)  delay_us(x)  
  28.   
  29. //AM2305掉电  
  30. void AM2305_PowerDown(void)  
  31. {  
  32.     AM2305_IODown();  
  33. }  
  34.   
  35.   
  36.   
  37.       
  38. /************************************************************************************************************************* 
  39. *函数         :   void AM2305_Reset(void) 
  40. *功能         :   AM2305复位 
  41. *参数         :   无 
  42. *返回         :   无 
  43. *依赖         :   底层宏定义 
  44. *作者         :   cp1300@139.com 
  45. *时间             :   2014-09-20 
  46. *最后修改时间 :   2014-09-20 
  47. *说明         :   无 
  48. *************************************************************************************************************************/  
  49. void AM2305_Reset(void)      
  50. {                   
  51.     AM2305_IO_OUT();            //SET OUTPUT  
  52.     AM2305_DQ_OUT(0);           //拉低DQ  
  53.     AM2305_Delay_US(1000);      //拉低至少800uS  
  54.     AM2305_DQ_OUT(1);           //DQ=1   
  55.     AM2305_Delay_US(30);        //主机拉高20~40us  
  56. }  
  57.   
  58.   
  59.   
  60.   
  61. /************************************************************************************************************************* 
  62. *函数         :   bool AM2305_Check(void)       
  63. *功能         :   等待AM2305的回应 
  64. *参数         :   无 
  65. *返回         :   FALSE:检测失败;TRUE:检测成功 
  66. *依赖         :   底层宏定义 
  67. *作者         :   cp1300@139.com 
  68. *时间             :   2014-09-20 
  69. *最后修改时间 :   2014-09-20 
  70. *说明         :   检测AM2305的存在 
  71. *************************************************************************************************************************/  
  72. bool AM2305_Check(void)          
  73. {     
  74.     u32 retry=0;  
  75.       
  76.     AM2305_IO_IN();//SET INPUT     
  77.     while (AM2305_DQ_IN()&&retry<100)//AM2305会拉低75~85us  
  78.     {  
  79.         retry++;  
  80.         AM2305_Delay_US(1);  
  81.     }      
  82.     if(retry>=100)  
  83.     {  
  84.         uart_printf("AM2305:retry1:%d\r\n",retry);  
  85.         return FALSE;  
  86.     }  
  87.     retry=0;  
  88.     while (!AM2305_DQ_IN()&&retry<100)//AM2305拉低后会再次拉高75~85us  
  89.     {  
  90.         retry++;  
  91.         AM2305_Delay_US(1);  
  92.     }  
  93.     if(retry>=100)  
  94.     {  
  95.         uart_printf("AM2305:retry2:%d\r\n",retry);  
  96.         return FALSE;  
  97.     }     
  98.     return TRUE;  
  99. }  
  100.   
  101.   
  102.   
  103. /************************************************************************************************************************* 
  104. *函数         :   u8 AM2305_ReadBit(void)       
  105. *功能         :   读取AM2305 1bit数据 
  106. *参数         :   无 
  107. *返回         :   数据 
  108. *依赖         :   底层宏定义 
  109. *作者         :   cp1300@139.com 
  110. *时间             :   2014-09-20 
  111. *最后修改时间 :   2014-09-20 
  112. *说明         :    
  113. *************************************************************************************************************************/  
  114. u8 AM2305_ReadBit(void)                
  115. {  
  116.     u8 retry=0;  
  117.       
  118.     while(AM2305_DQ_IN()&&retry<80)//等待变为低电平  
  119.     {  
  120.         retry++;  
  121.         AM2305_Delay_US(1);  
  122.     }  
  123. //  if(retry>=80)  
  124. //  {  
  125. //      uart_printf("AM2305:retry3:%d\r\n",retry);  
  126. //  }    
  127.     retry=0;  
  128.     while(!AM2305_DQ_IN()&&retry<60)//等待变高电平  
  129.     {  
  130.         retry++;  
  131.         AM2305_Delay_US(1);  
  132.     }  
  133. //  if(retry>=60)  
  134. //  {  
  135. //      uart_printf("AM2305:retry4:%d\r\n",retry);  
  136. //  }    
  137.   
  138.     AM2305_Delay_US(38);  
  139.     if(AM2305_DQ_IN())   
  140.         return 1;  
  141.     else return 0;        
  142. }  
  143.   
  144.   
  145.   
  146.   
  147.   
  148. /************************************************************************************************************************* 
  149. *函数         :   u8 AM2305_ReadByte(void)  
  150. *功能         :   从AM2305读取一个字节 
  151. *参数         :   无 
  152. *返回         :   读取到的数据 
  153. *依赖         :   底层宏定义 
  154. *作者         :   cp1300@139.com 
  155. *时间             :   2014-09-20 
  156. *最后修改时间 :   2014-09-20 
  157. *说明         :   无 
  158. *************************************************************************************************************************/  
  159. u8 AM2305_ReadByte(void)      
  160. {          
  161.     u8 i,dat;  
  162.     dat=0;  
  163.     for (i=0;i<8;i++)   
  164.     {  
  165.         dat<<=1;   
  166.         dat|=AM2305_ReadBit();  
  167.     }                             
  168.     return dat;  
  169. }  
  170.   
  171.   
  172.   
  173.   
  174. /************************************************************************************************************************* 
  175. *函数         :   bool AM2305_ReadData(s16 *pTemp,u16 *pHumi)    
  176. *功能         :   从AM2305读取一次数据 
  177. *参数         :   pTemp:温度指针,pHumi:湿度数据指针 
  178. *返回         :   FALSE:读取失败;TRUE:读取成功 
  179. *依赖         :   底层宏定义 
  180. *作者         :   cp1300@139.com 
  181. *时间             :   2014-09-20 
  182. *最后修改时间 :   2014-09-20 
  183. *说明         :   2014-09-29:修复负温度bug 
  184. *************************************************************************************************************************/  
  185. bool AM2305_ReadData(s16 *pTemp,u16 *pHumi)      
  186. {          
  187.     u8 buf[5];  
  188.     u8 i;  
  189.     u16 utemp;  
  190.       
  191.     AM2305_Reset();  
  192.     if(AM2305_Check()==TRUE)  
  193.     {  
  194.         for(i=0;i<5;i++)//读取40位数据  
  195.         {  
  196.             buf[i]=AM2305_ReadByte();  
  197.         }  
  198. //        
  199. //      uart_printf("\nAM2305:");  
  200. //      for(i=0;i<5;i++)//读取40位数据  
  201. //      {  
  202. //          uart_printf("0x%02X\t",buf[i]);  
  203. //      }  
  204. //      uart_printf("\n");  
  205.         if((u8)(buf[0]+buf[1]+buf[2]+buf[3])==buf[4])  
  206.         {  
  207.             *pHumi=buf[0];  
  208.             *pHumi <<= 8;  
  209.             *pHumi|=buf[1];  
  210.             utemp=buf[2];  
  211.             utemp<<=8;  
  212.             utemp|=buf[3];  
  213.             if(utemp > 0x8000)  
  214.             {  
  215.                 utemp -= 0x8000;  
  216.                 *pTemp = 0-utemp;  
  217.             }  
  218.             else  
  219.             {  
  220.                 *pTemp = utemp;  
  221.             }  
  222.             return TRUE;  
  223.         }  
  224.         else  
  225.         {  
  226.             uart_printf("AM2305数据校验失败!\r\n");  
  227.             return FALSE;  
  228.         }  
  229.     }  
  230.     else   
  231.     {  
  232.         uart_printf("AM2305检测失败!\r\n");  
  233.         return FALSE;  
  234.     }      
  235. }  
  236.   
  237.   
  238.   
  239.   
  240. /************************************************************************************************************************* 
  241. *函数         :   bool AM2305_Init(void) 
  242. *功能         :   初始化AM2305,并检测存在 
  243. *参数         :   无 
  244. *返回         :   FALSE:失败;TRUE:成功 
  245. *依赖         :   底层宏定义 
  246. *作者         :   cp1300@139.com 
  247. *时间             :   2014-09-20 
  248. *最后修改时间 :   2014-09-20 
  249. *说明         :   无 
  250. *************************************************************************************************************************/  
  251. bool AM2305_Init(void)  
  252. {  
  253.     AM2305_CLK_INIT();  
  254.     AM2305_IO_OUT();      
  255.     AM2305_Reset();  
  256.     return AM2305_Check();  
  257. }  


头文件
  1. /************************************************************************************************************* 
  2.  * 文件名:         AM2305.c 
  3.  * 功能:          STM32 AM2305高精度温湿度传感器驱动 
  4.  * 作者:          cp1300@139.com 
  5.  * 创建时间:        2014-09-20 
  6.  * 最后修改时间:  2014-09-20 
  7.  * 详细:          需要延时函数支持 
  8.  *                  注意延时精度尽可能的高 
  9.  *                  读取的时候不要长时间的被中断,因为1wire对时间要求很严格 
  10. *************************************************************************************************************/  
  11. #ifndef AM2305_H_  
  12. #define AM2305_H_  
  13.   
  14. #include "system.h"  
  15.   
  16. #if(BOARD_SUPPORT)  //需要板级支持  
  17. #include "board.h"   
  18. #else   //默认支持  
  19.   
  20. //PC3  
  21. #define AM2305_OUT      PCout(3)  
  22. #define AM2305_IN       PCin(3)  
  23. //IO  
  24. #define AM2305_DEV      DEV_GPIOC  
  25. #define AM2305_GPIOx    GPIOC  
  26. #define AM2305_BITx     BIT3  
  27.   
  28. #endif  
  29.   
  30. void AM2305_PowerDown(void);        //AM2305掉电  
  31. bool AM2305_Init(void);             //AM2305 初始化  
  32. bool AM2305_ReadData(s16 *pTemp,u16 *pHumi) ;   //读取温湿度数据  
  33.   
  34.   
  35.   
  36.   
  37. #endif /*AM2305_H_*/  


读取温湿度

  1. AM2305_ReadData(&temp, &hum);  

http://blog.csdn.net/cp1300/article/details/48501497

http://blog.csdn.net/xiayufeng520/article/details/46292899

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【精品博文】stm32F4----DHT22(AM2302)数字温湿度传感器读取(六)
基于51单片机SHT11温湿度传感器检测程序(含电路图)
晨辉教你轻松学51
51单片机学习笔记:DS18B20测温程序
DS18B20的c读写程序
DS18B20在linux下跑起来 - jammy
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服