找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 22421|回复: 30
打印 上一主题 下一主题
收起左侧

SHT30温湿度传感器STM32 IIC程序源码

  [复制链接]
跳转到指定楼层
楼主
SHT30源码 温湿度传感器IIC源码C  stm32平台



单片机源程序如下:
  1. /*******************************************************************************
  2. *Filename:       sht30_dis.c
  3. *Revised:        $Date: 06-15 15:23 $
  4. *Author:             double       
  5. *Description:    温湿度传感器驱动
  6. *******************************************************************************
  7. *************************引脚配置**********************************************
  8. *******************************************************************************
  9. *                  
  10. *            --------------------
  11. *           |                PB7 |-->   SCL
  12. *           |                PB6 |-->   SDA
  13. *            --------------------
  14. *******************************************************************************/

  15. #include "sht30_dis.h"  


  16. unsigned char TemValue = 0;
  17. unsigned char RhValue = 0;
  18. unsigned char buffer[6];


  19. //IIC所有操作函数
  20. //void IIC_Init(void);                                                           //初始化IIC的IO口                                 
  21. void SCL_L(void);
  22. void SCL_H(void);
  23. void SDA_L(void);
  24. void SDA_H(void);
  25. unsigned char SDA_Read(void);
  26. void i2c_delay(void);
  27. void i2c_noAck(void);
  28. void i2c_ack(void);
  29. void i2c_stop(void);
  30. void i2c_delay(void);
  31. unsigned char i2c_star(void);
  32. unsigned char i2c_waitAck(void);
  33. void i2c_sendByte( unsigned char byte );
  34. unsigned char i2c_readByte(void);
  35. void SHT3X_WriteCMD(unsigned int cmd);
  36. void SHT3X_ReadState(unsigned char *temp);
  37. void SHT3X_SetPeriodicMeasurement(void);
  38. void SHX3X_ReadResults(unsigned int cmd,  unsigned char *p);
  39. unsigned char SHT3X_CalcCrc(unsigned char *data, unsigned char nbrOfBytes);
  40. unsigned char SHT3X_CheckCrc(unsigned char *pdata, unsigned char nbrOfBytes, unsigned char checksum);
  41. unsigned int SHT3X_CalcTemperature(unsigned int rawValue);
  42. unsigned char SHT3X_CalcRH(unsigned int rawValue);
  43. void SHT_GetValue(void);
  44. /*******************************************************************************
  45. * @fn        sht30_dis_init
  46. *
  47. * @brief    初始化
  48. *
  49. * @return  none
  50. *
  51. ******************************************************************************/
  52. void sht30_dis_init(void){
  53.        
  54. //  SCL_OUT();
  55.        
  56.         GPIO_InitTypeDef GPIO_InitStructure;

  57. //  __HAL_RCC_GPIOB_CLK_ENABLE();
  58. //        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);

  59.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  60.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  61.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                        //推挽输出
  62.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  63.         GPIO_SetBits(GPIOB, GPIO_Pin_7);
  64.        
  65.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  66.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  67.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                        //浮空输入,或者改成上拉输入
  68.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  69.        
  70.   delay_us(250);
  71.   SHT3X_SetPeriodicMeasurement();//设置测量周期和模式
  72.        
  73.   delay_us(150);
  74.   SHT_GetValue();
  75.   delay_us(150);
  76. }

  77. void SDA_IN(void){
  78.         GPIO_InitTypeDef GPIO_InitStructure;
  79.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  80.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  81.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                        //浮空输入,或者改成上拉输入
  82.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  83.        
  84. }
  85. void SDA_OUT(void)
  86. {
  87.         GPIO_InitTypeDef GPIO_InitStructure;
  88.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  89.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  90.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                        //推挽输出
  91.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  92. }

  93. void SDA_H(void)
  94. {
  95.   SDA_OUT();
  96.   IIC_SDA_H;
  97. }
  98. void SDA_L(void)
  99. {
  100.   SDA_OUT();
  101.   IIC_SDA_L;
  102. }
  103. unsigned char SDA_Read(void)
  104. {
  105.   SDA_IN();
  106.   return READ_SDA;
  107. }
  108. void SCL_H(void)
  109. {
  110.     IIC_SCL_H;
  111. }
  112. void SCL_L(void)
  113. {
  114.     IIC_SCL_L;
  115. }


  116. void i2c_delay(void)
  117. {
  118. //  unsigned int z;
  119. //       
  120. //        for(z=0;z<10;z++);
  121.         //2M时钟,一个指令周期就行。测量速度是20ms读取完数据
  122.         __nop();
  123. }


  124. unsigned char i2c_star(void)
  125. {
  126.   SDA_H();
  127.   SCL_H();
  128.   i2c_delay();
  129.   if (!SDA_Read())
  130.     return 1;
  131.   SDA_L();
  132.   i2c_delay();
  133.   if (SDA_Read())
  134.     return 1;
  135.   SDA_L();
  136.   SCL_L();
  137.   i2c_delay();
  138.   return 0;
  139. }

  140. void i2c_stop(void)
  141. {
  142.   SCL_L();
  143.   i2c_delay();
  144.   SDA_L();
  145.   i2c_delay();
  146.   SCL_H();
  147.   i2c_delay();
  148.   SDA_H();
  149.   i2c_delay();
  150. }

  151. void i2c_ack(void)
  152. {
  153.   SCL_L();
  154.   i2c_delay();
  155.   SDA_L();
  156.   i2c_delay();
  157.   SCL_H();
  158.   i2c_delay();
  159.   SCL_L();
  160.   i2c_delay();
  161. }

  162. void i2c_noAck(void)
  163. {
  164.   SCL_L();
  165.   i2c_delay();
  166.   SDA_H();
  167.   i2c_delay();
  168.   SCL_H();
  169.   i2c_delay();
  170.   SCL_L();
  171.   i2c_delay();
  172. }

  173. unsigned char i2c_waitAck(void)
  174. {
  175.   unsigned char t = 200;
  176.   
  177.   SCL_L();
  178.   i2c_delay();
  179.   SDA_H();
  180.   i2c_delay();
  181.   //////////////////////////此处为金句,IO输入输出切换的瞬间有抖动,造成异常应答
  182.   SDA_Read();
  183.   //////////////////////////
  184.   SCL_H();
  185.   i2c_delay();   
  186.   
  187.   while( SDA_Read() )
  188.   {
  189.     t --;
  190.     i2c_delay();

  191.     if(t==0)
  192.     {
  193.        SCL_L();
  194.         return 1;
  195.     }
  196.     i2c_delay();
  197.   }
  198.   i2c_delay();
  199.   SCL_L();
  200.   i2c_delay();
  201.   return 0;
  202. }

  203. void i2c_sendByte( unsigned char byte )
  204. {
  205.   unsigned char i = 8;
  206.   while (i--) {
  207.     SCL_L();
  208.     i2c_delay();
  209.     if (byte & 0x80)
  210.         SDA_H();
  211.     else
  212.         SDA_L();
  213.     byte <<= 1;
  214.     i2c_delay();
  215.     SCL_H();
  216.     i2c_delay();
  217.   }
  218.   SCL_L();
  219.   i2c_delay();

  220. }

  221. unsigned char i2c_readByte(void)
  222. {
  223.   unsigned char i = 8;
  224.   unsigned char byte = 0;

  225.   SDA_H();
  226.   SDA_Read();
  227.   while (i--)
  228.   {
  229.     byte <<= 1;
  230.     SCL_L();
  231.     i2c_delay();
  232.     SCL_H();
  233.     i2c_delay();
  234.     if (SDA_Read())
  235.     {
  236.         byte |= 0x01;
  237.     }
  238.   }
  239.   SCL_L();
  240.   i2c_delay();

  241.   return byte;
  242. }

  243. void SHT3X_WriteCMD(unsigned int cmd)
  244. {
  245.   i2c_star();
  246.   i2c_sendByte(i2cAddWrite_8bit);
  247.   i2c_waitAck();
  248.   i2c_sendByte(cmd>>8);
  249.   i2c_waitAck();
  250.   i2c_sendByte(cmd);
  251.   i2c_waitAck();
  252.   i2c_stop();
  253. }

  254. void SHT3X_SetPeriodicMeasurement(void)
  255. {
  256.     SHT3X_WriteCMD(CMD_MEAS_PERI_2_H);
  257. }
  258. //读取SHT30寄存器状态
  259. void SHT3X_ReadState(unsigned char *temp)
  260. {
  261.     i2c_star();
  262.     i2c_sendByte(i2cAddWrite_8bit);
  263.     i2c_waitAck();
  264.     i2c_sendByte(0xf3);
  265.     i2c_waitAck();
  266.     i2c_sendByte(0X2d);
  267.     i2c_waitAck();
  268.    
  269.     i2c_star();
  270.     i2c_sendByte(i2cAddRead_8bit);
  271.     i2c_waitAck();

  272.     temp[0] = i2c_readByte();//高
  273.     i2c_ack();
  274.     temp[1] = i2c_readByte();//低
  275.     i2c_ack();
  276.     temp[2] = i2c_readByte();//校验
  277.     i2c_noAck();
  278.    
  279.     i2c_stop();
  280.    
  281. }

  282. //读取SHT30结果
  283. void SHX3X_ReadResults(unsigned int cmd,  unsigned char *p)
  284. {
  285.   i2c_star();
  286.   i2c_sendByte(i2cAddWrite_8bit);
  287.   i2c_waitAck();
  288.   i2c_sendByte(cmd>>8);
  289.   i2c_waitAck();
  290.   i2c_sendByte(cmd);
  291.   i2c_waitAck();
  292.   
  293.   i2c_star();
  294.   i2c_sendByte(i2cAddRead_8bit);
  295.    
  296.   if(i2c_waitAck()==0){     
  297.     i2c_delay();
  298.     i2c_delay();
  299.     i2c_delay();
  300.    
  301.     p[0] = i2c_readByte();//温度高
  302.     i2c_ack();
  303.     p[1] = i2c_readByte();//温度低
  304.     i2c_ack();
  305.     p[2] = i2c_readByte();//校验
  306.     i2c_ack();
  307.     p[3] = i2c_readByte();//湿度高
  308.     i2c_ack();
  309.     p[4] = i2c_readByte();//湿度低
  310.     i2c_ack();
  311.     p[5] = i2c_readByte();//校验
  312.     i2c_noAck();
  313.     i2c_stop();
  314.   }
  315. }

  316. //校验
  317. unsigned char SHT3X_CalcCrc(unsigned char *data, unsigned char nbrOfBytes)
  318. {
  319.         unsigned char bit;        // bit mask
  320.     unsigned char crc = 0xFF; // calculated checksum
  321.     unsigned char byteCtr;    // byte counter

  322.     // calculates 8-Bit checksum with given polynomial
  323.     for(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++) {
  324.         crc ^= (data[byteCtr]);
  325.         for(bit = 8; bit > 0; --bit) {
  326.             if(crc & 0x80) {
  327.                 crc = (crc << 1) ^ POLYNOMIAL;
  328.             }  else {
  329.                 crc = (crc << 1);
  330.             }
  331.         }
  332.     }
  333.         return crc;
  334. }
  335. //校验检测
  336. unsigned char SHT3X_CheckCrc(unsigned char *pdata, unsigned char nbrOfBytes, unsigned char checksum)
  337. {
  338.     unsigned char crc;
  339.         crc = SHT3X_CalcCrc(pdata, nbrOfBytes);// calculates 8-Bit checksum
  340.     if(crc != checksum)
  341.     {   
  342.         return 1;           
  343.     }
  344.     return 0;              
  345. }
  346. //计算温度
  347. unsigned int SHT3X_CalcTemperature(unsigned int rawValue)
  348. {
  349.     // calculate temperature
  350.     unsigned int temp;
  351.     temp = (175 * (float)rawValue / 65535 - 45) ; // T = -45 + 175 * rawValue / (2^16-1)
  352.     return temp;
  353. }
  354. //计算湿度
  355. unsigned char SHT3X_CalcRH(unsigned int rawValue)
  356. {
  357.     // calculate relative humidity [%RH]
  358.     unsigned char temp1 = (100 * (float)rawValue / 65535) ;  // RH = rawValue / (2^16-1) * 10

  359.     return temp1;
  360. }

  361. //读取温度---20ms即可读取完成
  362. void SHT_GetValue(void)
  363. {
  364.     unsigned char temp = 0;
  365.     unsigned int dat;
  366.     unsigned char p[3];
  367.     unsigned char cnt;
  368.     unsigned char tem_status,hum_status;
  369.     cnt = 0;
  370.     tem_status = 0;
  371.     hum_status = 0;
  372.    
  373.     while(cnt++<2){
  374.       
  375.       SHX3X_ReadResults(CMD_FETCH_DATA, buffer);//获取温度湿度

  376.       p[0] = buffer[0];
  377.       p[1] = buffer[1];
  378. ……………………

  379. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
sht30_dis.zip (3.67 KB, 下载次数: 757)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:234266 发表于 2018-4-2 15:32 | 只看该作者
根本不能用,骗分
回复

使用道具 举报

板凳
ID:185362 发表于 2018-4-28 21:20 | 只看该作者
下来试试
回复

使用道具 举报

地板
ID:34388 发表于 2018-5-3 09:04 | 只看该作者
可以去参考下,不能完全依靠
回复

使用道具 举报

5#
ID:362900 发表于 2018-7-2 10:00 | 只看该作者
谢谢分享,什么时候可以下载呢
回复

使用道具 举报

6#
ID:366882 发表于 2018-7-7 16:47 | 只看该作者
谢谢分享,什么时候可以下载呢
回复

使用道具 举报

7#
ID:366882 发表于 2018-7-7 18:37 | 只看该作者
我的可以下
回复

使用道具 举报

8#
ID:363787 发表于 2018-7-10 09:44 | 只看该作者
下来参考一下!!!
回复

使用道具 举报

9#
ID:379049 发表于 2018-7-25 17:21 | 只看该作者
可以下载下来参考一下~
回复

使用道具 举报

10#
ID:385353 发表于 2018-8-11 20:30 | 只看该作者
谢谢分享,不知道嫩不嫩用
回复

使用道具 举报

11#
ID:164507 发表于 2018-8-22 20:21 | 只看该作者
谢谢分享,什么时候可以下载呢
回复

使用道具 举报

12#
ID:390403 发表于 2018-8-27 16:42 | 只看该作者
你再好好看看数据手册  GPIO  
是PB6-->SCL  PB7-->SDA  而不是你说的 PB7 |-->   SCL    PB6 |-->   SDA
回复

使用道具 举报

13#
ID:390403 发表于 2018-8-27 16:42 | 只看该作者
你gpio 使用错误了
回复

使用道具 举报

14#
ID:394151 发表于 2018-9-7 09:01 | 只看该作者
非常好的一个程序
回复

使用道具 举报

15#
ID:331281 发表于 2018-9-21 15:53 | 只看该作者
感谢提供源码,刚好做这个项目,无线发送
回复

使用道具 举报

16#
ID:406408 发表于 2018-10-11 17:45 来自手机 | 只看该作者
学习了
回复

使用道具 举报

17#
ID:162421 发表于 2018-11-24 18:18 | 只看该作者
感谢分享,stm32自带的iic太难用了,果断抛弃了
回复

使用道具 举报

18#
ID:443825 发表于 2018-12-11 09:37 | 只看该作者
SHT35可以用这个程序调试吗?在做一个项目,用到sht35
回复

使用道具 举报

19#
ID:223999 发表于 2018-12-28 14:40 | 只看该作者
参考一下
回复

使用道具 举报

20#
ID:231727 发表于 2019-3-23 11:26 | 只看该作者
软件IIC,我喜欢
回复

使用道具 举报

21#
ID:386066 发表于 2019-3-27 11:49 | 只看该作者
读回来都是00 00啊楼主
回复

使用道具 举报

22#
ID:384274 发表于 2019-4-7 22:45 | 只看该作者
为什么我读到的温度值,用串口发回来是80多
回复

使用道具 举报

23#
ID:66915 发表于 2019-4-8 16:41 | 只看该作者
灰常给力呀
回复

使用道具 举报

24#
ID:508534 发表于 2019-4-10 10:33 | 只看该作者
感谢分享
回复

使用道具 举报

25#
ID:566558 发表于 2019-6-19 10:53 | 只看该作者
好东西!!!!
回复

使用道具 举报

26#
ID:592853 发表于 2019-7-31 09:04 | 只看该作者
在找这东西 希望能用到
回复

使用道具 举报

27#
ID:634578 发表于 2020-2-6 21:31 | 只看该作者
太好了,正好crc效验没有搞出来,可以参考一下
回复

使用道具 举报

28#
ID:634578 发表于 2020-2-6 21:35 | 只看该作者
上当了,程序根本就不齐,还差东西,SHT3X_CalcCrc()中的data[]在哪里,根本就没有定义,上当上当,大家不要下
回复

使用道具 举报

29#
ID:206350 发表于 2021-4-29 09:20 | 只看该作者
正准备用这东西,多谢分享!
回复

使用道具 举报

30#
ID:1048082 发表于 2022-10-17 21:08 | 只看该作者

正准备用这东西,多谢分享!
回复

使用道具 举报

31#
ID:635534 发表于 2023-5-2 22:04 | 只看该作者
还有一个main.h也没有
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表