单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32驱动温湿度传感器SHT3X的代码,自己在用的,能用。

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include "sht3x.h"
  2. #include "mdelay.h"


  3. // SHT3x用到的IO脚
  4. #define  SCL      PBout(6)
  5. #define  SDAOUT   PBout(7)
  6. #define  SDAIN    PBin(7)


  7. // SHT3x的地址(ADDR引脚已经硬件接地)
  8. #define  SLAVEADDRESS    0x88       //  ( 0x44<<1 )


  9. // SHT3x管脚初始化
  10. void Sht3x_Init(void)
  11. {
  12.         RCC->APB2ENR |= (1<<3);   // PB口时钟使能
  13.         GPIOB->ODR |= (3<<6);     // PB6、PB7输出高电平
  14.         GPIOB->CRL &= 0x00ffffff; // PB6、PB7设为开漏输出
  15.         GPIOB->CRL |= 0x77000000;
  16. }


  17. static void SDAsetOUT(void)
  18. {
  19.         GPIOB->CRL &= 0x0fffffff; // 设置为开漏输出
  20.         GPIOB->CRL |= 0x70000000;
  21. }


  22. static void SDAsetIN(void)
  23. {
  24.         GPIOB->CRL &= 0x0fffffff; // 设置为三态输入
  25.         GPIOB->CRL |= 0x40000000;
  26. }


  27. static void I2C_Start(void)
  28. {
  29.   SDAsetOUT();

  30.   SDAOUT = 1;                // 拉高数据线
  31.   SCL = 1;                   // 拉高时钟线
  32.   udelay(5);                 // 延时
  33.   SDAOUT = 0;                // 产生下降沿
  34.   udelay(5);                 // 延时
  35.   SCL = 0;                   // 拉低时钟线
  36. }


  37. static void I2C_Stop(void)
  38. {
  39.   SDAsetOUT();

  40.   SDAOUT = 0;                // 拉低数据线
  41.   SCL = 1;                   // 拉高时钟线
  42.   udelay(5);                 // 延时
  43.   SDAOUT = 1;                // 产生上升沿
  44.   udelay(5);                 // 延时
  45. }


  46. static void I2C_SendACK(u8 ack)
  47. {
  48.   SDAsetOUT();

  49.   SDAOUT = ack;              // 写应答信号
  50.   udelay(5);
  51.   SCL = 1;                   // 拉高时钟线
  52.   udelay(5);                 // 延时
  53.   SCL = 0;                   // 拉低时钟线
  54.   SDAOUT = 1;
  55.   udelay(20);                // 延时
  56. }


  57. static u8 I2C_RecvACK(void)
  58. {
  59.   u8 temp;

  60.   SDAsetIN();

  61.   SCL = 1;                   // 拉高时钟线
  62.   udelay(5);                 // 延时
  63.   temp = SDAIN;              // 读应答信号
  64.   SCL = 0;                   // 拉低时钟线
  65.   udelay(5);                 // 延时

  66.   return temp;
  67. }


  68. static void I2C_SendByte(u8 dat)
  69. {
  70.   u8 i;

  71.   SDAsetOUT();

  72.   for ( i=0; i<8; i++ )      // 8位计数器
  73.   {
  74.     SDAOUT = ( dat&0x80 ) ? 1 : 0 ;
  75.         dat <<= 1;
  76.     SCL = 1;                 // 拉高时钟线
  77.     udelay(5);               // 延时
  78.     SCL = 0;                 // 拉低时钟线
  79.     udelay(5);               // 延时
  80.   }
  81.   I2C_RecvACK();             // 接收ACK
  82. }


  83. static u8 I2C_RecvByte(void)
  84. {
  85.   u8 i;
  86.   u8 dat = 0;

  87.   for ( i=0; i<8; i++ )      // 8位计数器
  88.   {
  89.     dat <<= 1;
  90.     SCL = 1;                 // 拉高时钟线
  91.     udelay(5);               // 延时
  92.     dat |= SDAIN;            // 读数据               
  93.     SCL = 0;                 // 拉低时钟线
  94.     udelay(5);               // 延时
  95.   }

  96.   return dat;
  97. }


  98. void SHT3X_GetTempAndHumi(u16 cmd, s16 *temp, u16 *humi)
  99. {
  100.   u8 bytes[2];
  101. //  u8 checksum;
  102.   u16 temperature,humidity;
  103.   
  104.   I2C_Start();                    // 起始信号
  105.   I2C_SendByte( SLAVEADDRESS );   // 发送设备地址+写信号
  106.   I2C_SendByte( cmd>>8 );         // 发送16BIT的命令码
  107.   I2C_SendByte( cmd&0x00ff );
  108.   //mdelay( 30 );                   // 延时等待传感器检测温湿度
  109.   mdelay(20);
  110.   
  111.   I2C_Start();
  112.   I2C_SendByte(SLAVEADDRESS+1);   // 发送设备地址+读信号
  113.   bytes[0] = I2C_RecvByte();      // 读取温度
  114.   I2C_SendACK( 0 );
  115.   bytes[1] = I2C_RecvByte();      //
  116.   I2C_SendACK( 0 );
  117.   //checksum = I2C_RecvByte();      // 读取CRC
  118.   I2C_RecvByte();                 // 读取CRC
  119.   I2C_SendACK( 0 );
  120.   temperature = bytes[0];
  121.   temperature <<= 8;
  122.   temperature |= bytes[1];
  123.   
  124.   bytes[0] = I2C_RecvByte();      // 读取湿度
  125.   I2C_SendACK( 0 );
  126.   bytes[1] = I2C_RecvByte();      //
  127.   I2C_SendACK( 0 );
  128.   //checksum = I2C_RecvByte();      // 读取CRC
  129.   I2C_RecvByte();                 // 读取CRC
  130.   I2C_SendACK( 1 );
  131.   humidity = bytes[0];
  132.   humidity <<= 8;
  133.   humidity |= bytes[1];

  134.   I2C_Stop();                     // 发送停止信号
  135.   
  136.   *temp = ((s32)temperature*1750)/65535-450;     // 将温度原始数据转换成摄氏度数据
  137.   *humi = ((u32)humidity*1000)/65535;           // 将湿度原始数据转换成相对湿度
  138. }

复制代码

所有资料51hei提供下载:
sht3x.zip (1.65 KB, 下载次数: 29)


评分

参与人数 1黑币 +10 收起 理由
jipinxlm + 10 很给力!

查看全部评分

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

使用道具 举报

11#
yph2101224133 发表于 2019-1-11 21:58 | 只看该作者
谢谢分享
回复

使用道具 举报

10#
leihao1998810 发表于 2018-12-10 16:05 | 只看该作者
想知道你的16位命令码是什么,我照着写了,但是SHT不回应答信号
回复

使用道具 举报

9#
shixuegui 发表于 2018-10-25 09:53 | 只看该作者

你好,你是用什么来显示的啊
回复

使用道具 举报

8#
shixuegui 发表于 2018-10-25 09:52 | 只看该作者
找了很久了,多谢分享
回复

使用道具 举报

7#
jijkf 发表于 2018-10-11 20:09 | 只看该作者
你好,你是用什么来显示的
回复

使用道具 举报

6#
无效楼层,该帖已经被删除
5#
jijkf 发表于 2018-10-11 20:04 | 只看该作者
你是用什么显示的
回复

使用道具 举报

地板
ebingyu 发表于 2018-10-10 10:51 来自手机 | 只看该作者
学习了,谢谢楼主。
回复

使用道具 举报

板凳
alai318 发表于 2018-7-12 13:50 | 只看该作者
濕敏電阻也好像也以用ADC方式測出電壓換算.
回复

使用道具 举报

沙发
alai318 发表于 2018-7-12 09:32 | 只看该作者
如果單獨測溫度比較簡單,用LM35直接ADC測電壓就好,濕度麻煩
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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