打开APP
userphoto
未登录

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

开通VIP
STM32之SHT30温湿度传感器驱动代码

最后发布:2019-04-12 15:08:19首发:2019-04-12 15:08:19

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

第一部分:SHT30温湿度模块代码头文件(SHT30.h)

  1. #ifndef SHT30_H
  2. #define SHT30_H
  3. #include "delay.h"
  4. #include "sys.h"
  5. #include "stdio.h"
  6. #include "usart.h"
  7. #include "string.h"
  8. #include "sys.h"
  9. extern u8 humiture_buff1[20];
  10. extern u8 humiture_buff2[20];
  11. extern u8 Refresh_SHT30_Data;
  12. extern u8 send_data_fleg;
  13. extern u8 Temperature_L;
  14. extern u8 Humidity_L;
  15. extern u8 Temperature_H;
  16. extern u8 Humidity_H;
  17. void SHT30_Init(void);
  18. void IIC_ACK(void);
  19. void IIC_NACK(void);
  20. u8 IIC_wait_ACK(void);
  21. void IIC_Start(void);
  22. void IIC_Stop(void);
  23. void IIC_SendByte(u8 byte);
  24. u8 IIC_RcvByte(void);
  25. void SHT30_read_result(u8 addr);
  26. #endif

第二部分:SHT30温湿度模块代码(SHT30.c)

  1. #include "SHT30.h"
  2. #include "wifi_esp8266.h"
  3. #include "oled.h"
  4. #define write 0
  5. #define read 1
  6. //IIC总线地址接口定义
  7. #define SCL PAout(4)
  8. #define SDA_OUT PAout(5)
  9. #define SDA_IN PAin(5)
  10. #define IIC_INPUT_MODE_SET() {GPIOA->CRL&=0xFF0FFFFF;GPIOA->CRL|=0x00800000;}
  11. #define IIC_OUTPUT_MODE_SET() {GPIOA->CRL&=0xFF0FFFFF;GPIOA->CRL|=0x00300000;}
  12. float humiture[4];
  13. u8 Refresh_SHT30_Data=0;
  14. u8 humiture_buff1[20];
  15. u8 humiture_buff2[20];
  16. u8 Temperature_L=15;
  17. u8 Humidity_L=50;
  18. u8 Temperature_H=30;
  19. u8 Humidity_H=80;
  20. void SHT30_Init(void)
  21. {
  22. /*1.开时钟*/
  23. RCC->APB2ENR |= 1<<2;
  24. /*2.设置GPIO模式*/
  25. GPIOA->CRL &= 0x0000FFFF;
  26. GPIOA->CRL |= 0x33330000;
  27. /*3.设置GPIO空闲电平*/
  28. GPIOA->ODR |= 0xF<<4;
  29. //printf("SHT30_Init OK!\n");
  30. }
  31. /*主机发送ACK*/
  32. void IIC_ACK(void)
  33. {
  34. IIC_OUTPUT_MODE_SET();
  35. SCL=0;
  36. DelayUs(2);
  37. SDA_OUT=0;
  38. DelayUs(2);
  39. SCL=1;
  40. DelayUs(2);
  41. SCL=0;
  42. DelayUs(1);
  43. }
  44. /*主机不发送ACK*/
  45. void IIC_NACK(void)
  46. {
  47. IIC_OUTPUT_MODE_SET();
  48. SCL=0;
  49. DelayUs(2);
  50. SDA_OUT=1;
  51. DelayUs(2);
  52. SCL=1;
  53. DelayUs(2);
  54. SCL=0;
  55. DelayUs(1);
  56. }
  57. /*主机等待从机的ACK*/
  58. u8 IIC_wait_ACK(void)
  59. {
  60. u8 t = 200;
  61. IIC_OUTPUT_MODE_SET();
  62. SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位
  63. DelayUs(1);
  64. SCL=0;
  65. DelayUs(1);
  66. IIC_INPUT_MODE_SET();
  67. DelayUs(1);
  68. while(SDA_IN)//等待SHT30应答
  69. {
  70. t--;
  71. DelayUs(1);
  72. if(t==0)
  73. {
  74. SCL=0;
  75. return 1;
  76. }
  77. DelayUs(1);
  78. }
  79. DelayUs(1);
  80. SCL=1;
  81. DelayUs(1);
  82. SCL=0;
  83. DelayUs(1);
  84. return 0;
  85. }
  86. /*******************************************************************
  87. 功能:启动I2C总线,即发送I2C起始条件.
  88. ********************************************************************/
  89. void IIC_Start(void)
  90. {
  91. IIC_OUTPUT_MODE_SET();
  92. SDA_OUT=1;
  93. SCL=1;
  94. DelayUs(4);
  95. SDA_OUT=0;
  96. DelayUs(4);
  97. SCL=0;
  98. }
  99. /*******************************************************************
  100. 功能:结束I2C总线,即发送I2C结束条件.
  101. ********************************************************************/
  102. void IIC_Stop(void)
  103. {
  104. IIC_OUTPUT_MODE_SET();
  105. SCL=0;
  106. SDA_OUT=0;
  107. DelayUs(4);
  108. SCL=1;
  109. DelayUs(4);
  110. SDA_OUT=1;
  111. DelayUs(4);
  112. }
  113. /*******************************************************************
  114. 字节数据发送函数
  115. 函数原型: void SendByte(UCHAR c);
  116. 功能:将数据c发送出去,可以是地址,也可以是数据
  117. ********************************************************************/
  118. void IIC_SendByte(u8 byte)
  119. {
  120. u8 BitCnt;
  121. IIC_OUTPUT_MODE_SET();
  122. SCL=0;
  123. for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位
  124. {
  125. if(byte&0x80) SDA_OUT=1;//判断发送位
  126. else SDA_OUT=0;
  127. byte<<=1;
  128. DelayUs(2);
  129. SCL=1;
  130. DelayUs(2);
  131. SCL=0;
  132. DelayUs(2);
  133. }
  134. }
  135. /*******************************************************************
  136. 字节数据接收函数
  137. 函数原型: UCHAR RcvByte();
  138. 功能: 用来接收从器件传来的数据
  139. ********************************************************************/
  140. u8 IIC_RcvByte(void)
  141. {
  142. u8 retc;
  143. u8 BitCnt;
  144. retc=0;
  145. IIC_INPUT_MODE_SET();//置数据线为输入方式
  146. DelayUs(1);
  147. for(BitCnt=0;BitCnt<8;BitCnt++)
  148. {
  149. SCL=0;//置时钟线为低,准备接收数据位
  150. DelayUs(2);
  151. SCL=1;//置时钟线为高使数据线上数据有效
  152. retc=retc<<1;
  153. if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中
  154. DelayUs(1);
  155. }
  156. SCL=0;
  157. return(retc);
  158. }
  159. /*******************************************************************
  160. 温湿度获取函数
  161. 函数原型: SHT30_read_result(u8 addr);
  162. 功能: 用来接收从器件采集并合成温湿度
  163. ********************************************************************/
  164. void SHT30_read_result(u8 addr)
  165. {
  166. u16 tem,hum;
  167. u16 buff[6];
  168. float Temperature=0;
  169. float Humidity=0;
  170. IIC_Start();
  171. IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为读取位
  172. IIC_wait_ACK();
  173. IIC_SendByte(0x2C);
  174. IIC_wait_ACK();
  175. IIC_SendByte(0x06);
  176. IIC_wait_ACK();
  177. IIC_Stop();
  178. DelayMs(50);
  179. IIC_Start();
  180. IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加0作为写取位,1为读取位
  181. if(IIC_wait_ACK()==0)
  182. {
  183. buff[0]=IIC_RcvByte();
  184. IIC_ACK();
  185. buff[1]=IIC_RcvByte();
  186. IIC_ACK();
  187. buff[2]=IIC_RcvByte();
  188. IIC_ACK();
  189. buff[3]=IIC_RcvByte();
  190. IIC_ACK();
  191. buff[4]=IIC_RcvByte();
  192. IIC_ACK();
  193. buff[5]=IIC_RcvByte();
  194. IIC_NACK();
  195. IIC_Stop();
  196. }
  197. tem = ((buff[0]<<8) | buff[1]);//温度拼接
  198. hum = ((buff[3]<<8) | buff[4]);//湿度拼接
  199. /*转换实际温度*/
  200. Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)
  201. Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)
  202. if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//过滤错误数据
  203. {
  204. humiture[0]=Temperature;
  205. humiture[2]=Humidity;
  206. sprintf(humiture_buff1,"%6.2f*C %6.2f%%",Temperature,Humidity);//111.01*C 100.01%(保留2位小数)
  207. }
  208. printf("温湿度:%s\n",humiture_buff1);
  209. hum=0;
  210. tem=0;
  211. }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
我用洞洞板做的TEA5767数字调频立体声收音机
I2C总线协议(AT24c02)程序
单片机I2C驱动子程序
MSP430F149模拟IIC读写24C02程序
学51单片机-基于PCF8591的AD采样和DA输出【实际应用篇】
I2C 串行总线的组成及工作原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服