标题:
SHT30温湿度传感器STM32 IIC程序源码
[打印本页]
作者:
zhaosj
时间:
2018-2-2 10:17
标题:
SHT30温湿度传感器STM32 IIC程序源码
SHT30源码 温湿度传感器IIC源码C stm32平台
0.png
(3.96 KB, 下载次数: 129)
下载附件
2018-2-2 16:21 上传
单片机源程序如下:
/*******************************************************************************
*Filename: sht30_dis.c
*Revised: $Date: 06-15 15:23 $
*Author: double
*Description: 温湿度传感器驱动
*******************************************************************************
*************************引脚配置**********************************************
*******************************************************************************
*
* --------------------
* | PB7 |--> SCL
* | PB6 |--> SDA
* --------------------
*******************************************************************************/
#include "sht30_dis.h"
unsigned char TemValue = 0;
unsigned char RhValue = 0;
unsigned char buffer[6];
//IIC所有操作函数
//void IIC_Init(void); //初始化IIC的IO口
void SCL_L(void);
void SCL_H(void);
void SDA_L(void);
void SDA_H(void);
unsigned char SDA_Read(void);
void i2c_delay(void);
void i2c_noAck(void);
void i2c_ack(void);
void i2c_stop(void);
void i2c_delay(void);
unsigned char i2c_star(void);
unsigned char i2c_waitAck(void);
void i2c_sendByte( unsigned char byte );
unsigned char i2c_readByte(void);
void SHT3X_WriteCMD(unsigned int cmd);
void SHT3X_ReadState(unsigned char *temp);
void SHT3X_SetPeriodicMeasurement(void);
void SHX3X_ReadResults(unsigned int cmd, unsigned char *p);
unsigned char SHT3X_CalcCrc(unsigned char *data, unsigned char nbrOfBytes);
unsigned char SHT3X_CheckCrc(unsigned char *pdata, unsigned char nbrOfBytes, unsigned char checksum);
unsigned int SHT3X_CalcTemperature(unsigned int rawValue);
unsigned char SHT3X_CalcRH(unsigned int rawValue);
void SHT_GetValue(void);
/*******************************************************************************
* @fn sht30_dis_init
*
* @brief 初始化
*
* @return none
*
******************************************************************************/
void sht30_dis_init(void){
// SCL_OUT();
GPIO_InitTypeDef GPIO_InitStructure;
// __HAL_RCC_GPIOB_CLK_ENABLE();
// HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_7);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空输入,或者改成上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
delay_us(250);
SHT3X_SetPeriodicMeasurement();//设置测量周期和模式
delay_us(150);
SHT_GetValue();
delay_us(150);
}
void SDA_IN(void){
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空输入,或者改成上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_H(void)
{
SDA_OUT();
IIC_SDA_H;
}
void SDA_L(void)
{
SDA_OUT();
IIC_SDA_L;
}
unsigned char SDA_Read(void)
{
SDA_IN();
return READ_SDA;
}
void SCL_H(void)
{
IIC_SCL_H;
}
void SCL_L(void)
{
IIC_SCL_L;
}
void i2c_delay(void)
{
// unsigned int z;
//
// for(z=0;z<10;z++);
//2M时钟,一个指令周期就行。测量速度是20ms读取完数据
__nop();
}
unsigned char i2c_star(void)
{
SDA_H();
SCL_H();
i2c_delay();
if (!SDA_Read())
return 1;
SDA_L();
i2c_delay();
if (SDA_Read())
return 1;
SDA_L();
SCL_L();
i2c_delay();
return 0;
}
void i2c_stop(void)
{
SCL_L();
i2c_delay();
SDA_L();
i2c_delay();
SCL_H();
i2c_delay();
SDA_H();
i2c_delay();
}
void i2c_ack(void)
{
SCL_L();
i2c_delay();
SDA_L();
i2c_delay();
SCL_H();
i2c_delay();
SCL_L();
i2c_delay();
}
void i2c_noAck(void)
{
SCL_L();
i2c_delay();
SDA_H();
i2c_delay();
SCL_H();
i2c_delay();
SCL_L();
i2c_delay();
}
unsigned char i2c_waitAck(void)
{
unsigned char t = 200;
SCL_L();
i2c_delay();
SDA_H();
i2c_delay();
//////////////////////////此处为金句,IO输入输出切换的瞬间有抖动,造成异常应答
SDA_Read();
//////////////////////////
SCL_H();
i2c_delay();
while( SDA_Read() )
{
t --;
i2c_delay();
if(t==0)
{
SCL_L();
return 1;
}
i2c_delay();
}
i2c_delay();
SCL_L();
i2c_delay();
return 0;
}
void i2c_sendByte( unsigned char byte )
{
unsigned char i = 8;
while (i--) {
SCL_L();
i2c_delay();
if (byte & 0x80)
SDA_H();
else
SDA_L();
byte <<= 1;
i2c_delay();
SCL_H();
i2c_delay();
}
SCL_L();
i2c_delay();
}
unsigned char i2c_readByte(void)
{
unsigned char i = 8;
unsigned char byte = 0;
SDA_H();
SDA_Read();
while (i--)
{
byte <<= 1;
SCL_L();
i2c_delay();
SCL_H();
i2c_delay();
if (SDA_Read())
{
byte |= 0x01;
}
}
SCL_L();
i2c_delay();
return byte;
}
void SHT3X_WriteCMD(unsigned int cmd)
{
i2c_star();
i2c_sendByte(i2cAddWrite_8bit);
i2c_waitAck();
i2c_sendByte(cmd>>8);
i2c_waitAck();
i2c_sendByte(cmd);
i2c_waitAck();
i2c_stop();
}
void SHT3X_SetPeriodicMeasurement(void)
{
SHT3X_WriteCMD(CMD_MEAS_PERI_2_H);
}
//读取SHT30寄存器状态
void SHT3X_ReadState(unsigned char *temp)
{
i2c_star();
i2c_sendByte(i2cAddWrite_8bit);
i2c_waitAck();
i2c_sendByte(0xf3);
i2c_waitAck();
i2c_sendByte(0X2d);
i2c_waitAck();
i2c_star();
i2c_sendByte(i2cAddRead_8bit);
i2c_waitAck();
temp[0] = i2c_readByte();//高
i2c_ack();
temp[1] = i2c_readByte();//低
i2c_ack();
temp[2] = i2c_readByte();//校验
i2c_noAck();
i2c_stop();
}
//读取SHT30结果
void SHX3X_ReadResults(unsigned int cmd, unsigned char *p)
{
i2c_star();
i2c_sendByte(i2cAddWrite_8bit);
i2c_waitAck();
i2c_sendByte(cmd>>8);
i2c_waitAck();
i2c_sendByte(cmd);
i2c_waitAck();
i2c_star();
i2c_sendByte(i2cAddRead_8bit);
if(i2c_waitAck()==0){
i2c_delay();
i2c_delay();
i2c_delay();
p[0] = i2c_readByte();//温度高
i2c_ack();
p[1] = i2c_readByte();//温度低
i2c_ack();
p[2] = i2c_readByte();//校验
i2c_ack();
p[3] = i2c_readByte();//湿度高
i2c_ack();
p[4] = i2c_readByte();//湿度低
i2c_ack();
p[5] = i2c_readByte();//校验
i2c_noAck();
i2c_stop();
}
}
//校验
unsigned char SHT3X_CalcCrc(unsigned char *data, unsigned char nbrOfBytes)
{
unsigned char bit; // bit mask
unsigned char crc = 0xFF; // calculated checksum
unsigned char byteCtr; // byte counter
// calculates 8-Bit checksum with given polynomial
for(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++) {
crc ^= (data[byteCtr]);
for(bit = 8; bit > 0; --bit) {
if(crc & 0x80) {
crc = (crc << 1) ^ POLYNOMIAL;
} else {
crc = (crc << 1);
}
}
}
return crc;
}
//校验检测
unsigned char SHT3X_CheckCrc(unsigned char *pdata, unsigned char nbrOfBytes, unsigned char checksum)
{
unsigned char crc;
crc = SHT3X_CalcCrc(pdata, nbrOfBytes);// calculates 8-Bit checksum
if(crc != checksum)
{
return 1;
}
return 0;
}
//计算温度
unsigned int SHT3X_CalcTemperature(unsigned int rawValue)
{
// calculate temperature
unsigned int temp;
temp = (175 * (float)rawValue / 65535 - 45) ; // T = -45 + 175 * rawValue / (2^16-1)
return temp;
}
//计算湿度
unsigned char SHT3X_CalcRH(unsigned int rawValue)
{
// calculate relative humidity [%RH]
unsigned char temp1 = (100 * (float)rawValue / 65535) ; // RH = rawValue / (2^16-1) * 10
return temp1;
}
//读取温度---20ms即可读取完成
void SHT_GetValue(void)
{
unsigned char temp = 0;
unsigned int dat;
unsigned char p[3];
unsigned char cnt;
unsigned char tem_status,hum_status;
cnt = 0;
tem_status = 0;
hum_status = 0;
while(cnt++<2){
SHX3X_ReadResults(CMD_FETCH_DATA, buffer);//获取温度湿度
p[0] = buffer[0];
p[1] = buffer[1];
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
sht30_dis.zip
(3.67 KB, 下载次数: 758)
2018-2-2 10:17 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
zhangshoubu
时间:
2018-4-2 15:32
根本不能用,骗分
作者:
~IOT夙愿
时间:
2018-4-28 21:20
下来试试
作者:
aaron96031
时间:
2018-5-3 09:04
可以去参考下,不能完全依靠
作者:
heyangfengyue
时间:
2018-7-2 10:00
谢谢分享,什么时候可以下载呢
作者:
wuanxian
时间:
2018-7-7 16:47
谢谢分享,什么时候可以下载呢
作者:
wuanxian
时间:
2018-7-7 18:37
我的可以下
作者:
jiaximodo
时间:
2018-7-10 09:44
下来参考一下!!!
作者:
hhk001
时间:
2018-7-25 17:21
可以下载下来参考一下~
作者:
dinghx
时间:
2018-8-11 20:30
谢谢分享,不知道嫩不嫩用
作者:
xxianhua
时间:
2018-8-22 20:21
谢谢分享,什么时候可以下载呢
作者:
qzz1314521
时间:
2018-8-27 16:42
你再好好看看数据手册 GPIO
是PB6-->SCL PB7-->SDA 而不是你说的 PB7 |--> SCL PB6 |--> SDA
作者:
qzz1314521
时间:
2018-8-27 16:42
你gpio 使用错误了
作者:
jxsunyao
时间:
2018-9-7 09:01
非常好的一个程序
作者:
liu281469315
时间:
2018-9-21 15:53
感谢提供源码,刚好做这个项目,无线发送
作者:
ebingyu
时间:
2018-10-11 17:45
学习了
作者:
遇见1111111
时间:
2018-11-24 18:18
感谢分享,stm32自带的iic太难用了,果断抛弃了
作者:
kingbaobo
时间:
2018-12-11 09:37
SHT35可以用这个程序调试吗?在做一个项目,用到sht35
作者:
pm1981
时间:
2018-12-28 14:40
参考一下
作者:
yuri_su
时间:
2019-3-23 11:26
软件IIC,我喜欢
作者:
yo_mmmmm
时间:
2019-3-27 11:49
读回来都是00 00啊楼主
作者:
zzt223
时间:
2019-4-7 22:45
为什么我读到的温度值,用串口发回来是80多
作者:
hpdell
时间:
2019-4-8 16:41
灰常给力呀
作者:
nb1123
时间:
2019-4-10 10:33
感谢分享
作者:
yanglq0822
时间:
2019-6-19 10:53
好东西!!!!
作者:
hollandcy
时间:
2019-7-31 09:04
在找这东西 希望能用到
作者:
pwtpwt
时间:
2020-2-6 21:31
太好了,正好crc效验没有搞出来,可以参考一下
作者:
pwtpwt
时间:
2020-2-6 21:35
上当了,程序根本就不齐,还差东西,SHT3X_CalcCrc()中的data[]在哪里,根本就没有定义,上当上当,大家不要下
作者:
guolh
时间:
2021-4-29 09:20
正准备用这东西,多谢分享!
作者:
lkmtdkjpl
时间:
2022-10-17 21:08
正准备用这东西,多谢分享!
作者:
烟浮世间
时间:
2023-5-2 22:04
还有一个main.h也没有
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1