标题:
STM32驱动温湿度传感器SHT3X的代码,自己在用的,能用。
[打印本页]
作者:
firstzzc
时间:
2018-7-11 17:01
标题:
STM32驱动温湿度传感器SHT3X的代码,自己在用的,能用。
0.png
(40.66 KB, 下载次数: 106)
下载附件
2018-7-11 17:32 上传
单片机源程序如下:
#include "sht3x.h"
#include "mdelay.h"
// SHT3x用到的IO脚
#define SCL PBout(6)
#define SDAOUT PBout(7)
#define SDAIN PBin(7)
// SHT3x的地址(ADDR引脚已经硬件接地)
#define SLAVEADDRESS 0x88 // ( 0x44<<1 )
// SHT3x管脚初始化
void Sht3x_Init(void)
{
RCC->APB2ENR |= (1<<3); // PB口时钟使能
GPIOB->ODR |= (3<<6); // PB6、PB7输出高电平
GPIOB->CRL &= 0x00ffffff; // PB6、PB7设为开漏输出
GPIOB->CRL |= 0x77000000;
}
static void SDAsetOUT(void)
{
GPIOB->CRL &= 0x0fffffff; // 设置为开漏输出
GPIOB->CRL |= 0x70000000;
}
static void SDAsetIN(void)
{
GPIOB->CRL &= 0x0fffffff; // 设置为三态输入
GPIOB->CRL |= 0x40000000;
}
static void I2C_Start(void)
{
SDAsetOUT();
SDAOUT = 1; // 拉高数据线
SCL = 1; // 拉高时钟线
udelay(5); // 延时
SDAOUT = 0; // 产生下降沿
udelay(5); // 延时
SCL = 0; // 拉低时钟线
}
static void I2C_Stop(void)
{
SDAsetOUT();
SDAOUT = 0; // 拉低数据线
SCL = 1; // 拉高时钟线
udelay(5); // 延时
SDAOUT = 1; // 产生上升沿
udelay(5); // 延时
}
static void I2C_SendACK(u8 ack)
{
SDAsetOUT();
SDAOUT = ack; // 写应答信号
udelay(5);
SCL = 1; // 拉高时钟线
udelay(5); // 延时
SCL = 0; // 拉低时钟线
SDAOUT = 1;
udelay(20); // 延时
}
static u8 I2C_RecvACK(void)
{
u8 temp;
SDAsetIN();
SCL = 1; // 拉高时钟线
udelay(5); // 延时
temp = SDAIN; // 读应答信号
SCL = 0; // 拉低时钟线
udelay(5); // 延时
return temp;
}
static void I2C_SendByte(u8 dat)
{
u8 i;
SDAsetOUT();
for ( i=0; i<8; i++ ) // 8位计数器
{
SDAOUT = ( dat&0x80 ) ? 1 : 0 ;
dat <<= 1;
SCL = 1; // 拉高时钟线
udelay(5); // 延时
SCL = 0; // 拉低时钟线
udelay(5); // 延时
}
I2C_RecvACK(); // 接收ACK
}
static u8 I2C_RecvByte(void)
{
u8 i;
u8 dat = 0;
for ( i=0; i<8; i++ ) // 8位计数器
{
dat <<= 1;
SCL = 1; // 拉高时钟线
udelay(5); // 延时
dat |= SDAIN; // 读数据
SCL = 0; // 拉低时钟线
udelay(5); // 延时
}
return dat;
}
void SHT3X_GetTempAndHumi(u16 cmd, s16 *temp, u16 *humi)
{
u8 bytes[2];
// u8 checksum;
u16 temperature,humidity;
I2C_Start(); // 起始信号
I2C_SendByte( SLAVEADDRESS ); // 发送设备地址+写信号
I2C_SendByte( cmd>>8 ); // 发送16BIT的命令码
I2C_SendByte( cmd&0x00ff );
//mdelay( 30 ); // 延时等待传感器检测温湿度
mdelay(20);
I2C_Start();
I2C_SendByte(SLAVEADDRESS+1); // 发送设备地址+读信号
bytes[0] = I2C_RecvByte(); // 读取温度
I2C_SendACK( 0 );
bytes[1] = I2C_RecvByte(); //
I2C_SendACK( 0 );
//checksum = I2C_RecvByte(); // 读取CRC
I2C_RecvByte(); // 读取CRC
I2C_SendACK( 0 );
temperature = bytes[0];
temperature <<= 8;
temperature |= bytes[1];
bytes[0] = I2C_RecvByte(); // 读取湿度
I2C_SendACK( 0 );
bytes[1] = I2C_RecvByte(); //
I2C_SendACK( 0 );
//checksum = I2C_RecvByte(); // 读取CRC
I2C_RecvByte(); // 读取CRC
I2C_SendACK( 1 );
humidity = bytes[0];
humidity <<= 8;
humidity |= bytes[1];
I2C_Stop(); // 发送停止信号
*temp = ((s32)temperature*1750)/65535-450; // 将温度原始数据转换成摄氏度数据
*humi = ((u32)humidity*1000)/65535; // 将湿度原始数据转换成相对湿度
}
复制代码
所有资料51hei提供下载:
sht3x.zip
(1.65 KB, 下载次数: 232)
2018-7-11 17:00 上传
点击文件名下载附件
STM32驱动SHT3X传感器
下载积分: 黑币 -5
作者:
alai318
时间:
2018-7-12 09:32
如果單獨測溫度比較簡單,用LM35直接ADC測電壓就好,濕度麻煩
作者:
alai318
时间:
2018-7-12 13:50
濕敏電阻也好像也以用ADC方式測出電壓換算.
作者:
ebingyu
时间:
2018-10-10 10:51
学习了,谢谢楼主。
作者:
jijkf
时间:
2018-10-11 20:04
你是用什么显示的
作者:
jijkf
时间:
2018-10-11 20:09
你好,你是用什么来显示的
作者:
shixuegui
时间:
2018-10-25 09:52
找了很久了,多谢分享
作者:
shixuegui
时间:
2018-10-25 09:53
你好,你是用什么来显示的啊
作者:
leihao1998810
时间:
2018-12-10 16:05
想知道你的16位命令码是什么,我照着写了,但是SHT不回应答信号
作者:
yph2101224133
时间:
2019-1-11 21:58
谢谢分享
作者:
1565446
时间:
2019-1-26 23:15
湿度一直是百分百是为何
作者:
dpj121
时间:
2019-5-29 12:10
谢谢楼主
作者:
林龙龙
时间:
2019-6-28 13:54
官方代码太复杂了
作者:
dongbaolu
时间:
2019-6-28 18:07
学习了,谢谢
作者:
dongbaolu
时间:
2019-6-28 18:08
学习了,谢谢楼主!!1
作者:
wenqian
时间:
2020-2-26 11:22
谢谢了 分享精神值得赞赏
作者:
mos1971
时间:
2020-2-29 02:05
SHT3X学习中,感谢楼主分享
作者:
526637566@qq.co
时间:
2020-5-10 22:37
谢谢分享点赞
作者:
hejin123
时间:
2020-8-18 15:31
这是属于用GPIO口模拟的IIC吗
作者:
迷失森林
时间:
2022-5-15 18:04
用什么显示的?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1