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

2019-08-14来源: eefocus关键字:STM32  SHT30  温湿度传感器  驱动代码

SHT30温湿度串口显示

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


#ifndef SHT30_H

#define SHT30_H

#include "delay.h"

#include "sys.h"

#include "stdio.h"

#include "usart.h"

#include "string.h"

#include "sys.h"

 

extern u8 humiture_buff1[20];

extern u8 humiture_buff2[20];

extern u8 Refresh_SHT30_Data;

extern u8 send_data_fleg;

extern u8 Temperature_L;

extern u8 Humidity_L;

extern u8 Temperature_H;

extern u8 Humidity_H;

 

void SHT30_Init(void);

void IIC_ACK(void);

void IIC_NACK(void);

u8 IIC_wait_ACK(void);

void IIC_Start(void);

void IIC_Stop(void);

void IIC_SendByte(u8 byte);

u8 IIC_RcvByte(void);

void SHT30_read_result(u8 addr);

 

#endif

 

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


#include "SHT30.h"

#include "wifi_esp8266.h"

#include "oled.h"

 

#define write 0

#define read  1

//IIC总线地址接口定义

#define SCL PAout(4)

#define SDA_OUT PAout(5)

#define SDA_IN PAin(5)

#define IIC_INPUT_MODE_SET()  {GPIOA->CRL&=0xFF0FFFFF;GPIOA->CRL|=0x00800000;}

#define IIC_OUTPUT_MODE_SET() {GPIOA->CRL&=0xFF0FFFFF;GPIOA->CRL|=0x00300000;}

 

float humiture[4];

u8 Refresh_SHT30_Data=0;

u8 humiture_buff1[20];

u8 humiture_buff2[20];

 

u8 Temperature_L=15;

u8 Humidity_L=50;

u8 Temperature_H=30;

u8 Humidity_H=80;

 

void SHT30_Init(void)

{

  /*1.开时钟*/

  RCC->APB2ENR |= 1<<2;

  /*2.设置GPIO模式*/

  GPIOA->CRL &= 0x0000FFFF;

  GPIOA->CRL |= 0x33330000;

  /*3.设置GPIO空闲电平*/

  GPIOA->ODR |= 0xF<<4;

  //printf("SHT30_Init OK!n");

}

 /*主机发送ACK*/

void IIC_ACK(void)

{

  IIC_OUTPUT_MODE_SET();

  SCL=0;

  DelayUs(2); 

  SDA_OUT=0;

  DelayUs(2);     

  SCL=1;

  DelayUs(2);                  

  SCL=0;                     

  DelayUs(1);    

}

 /*主机不发送ACK*/

void IIC_NACK(void)

{

  IIC_OUTPUT_MODE_SET();

  SCL=0;

  DelayUs(2); 

  SDA_OUT=1;

  DelayUs(2);      

  SCL=1;

  DelayUs(2);                   

  SCL=0;                     

  DelayUs(1);    

}

 /*主机等待从机的ACK*/

u8 IIC_wait_ACK(void)

{

    u8 t = 200;

    IIC_OUTPUT_MODE_SET();

    SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位 

    DelayUs(1);

    SCL=0;

    DelayUs(1); 

    IIC_INPUT_MODE_SET();

    DelayUs(1); 

    while(SDA_IN)//等待SHT30应答

    {

t--;

DelayUs(1); 

if(t==0)

{

  SCL=0;

  return 1;

}

DelayUs(1); 

    }

    DelayUs(1);      

    SCL=1;

    DelayUs(1);

    SCL=0;             

    DelayUs(1);    

    return 0;

}

/*******************************************************************

功能:启动I2C总线,即发送I2C起始条件.  

********************************************************************/

void IIC_Start(void)

{

  IIC_OUTPUT_MODE_SET();

  SDA_OUT=1;

  SCL=1;

  DelayUs(4);

  SDA_OUT=0;

  DelayUs(4); 

  SCL=0;

}

 

/*******************************************************************

功能:结束I2C总线,即发送I2C结束条件.  

********************************************************************/

void IIC_Stop(void)

{

IIC_OUTPUT_MODE_SET();

SCL=0;

SDA_OUT=0;  

DelayUs(4);

SCL=1;

DelayUs(4);

SDA_OUT=1;

DelayUs(4);

}

 

/*******************************************************************

字节数据发送函数               

函数原型: void  SendByte(UCHAR c);

功能:将数据c发送出去,可以是地址,也可以是数据

********************************************************************/

void  IIC_SendByte(u8 byte)

{

u8  BitCnt;

IIC_OUTPUT_MODE_SET();

SCL=0;

for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位

{

if(byte&0x80) SDA_OUT=1;//判断发送位

else SDA_OUT=0; 

byte<<=1;

DelayUs(2); 

SCL=1;

DelayUs(2);

SCL=0;

DelayUs(2);

}

}

/*******************************************************************

 字节数据接收函数               

函数原型: UCHAR  RcvByte();

功能: 用来接收从器件传来的数据  

********************************************************************/    

u8 IIC_RcvByte(void)

{

  u8 retc;

  u8 BitCnt;

  retc=0; 

  IIC_INPUT_MODE_SET();//置数据线为输入方式

  DelayUs(1);                    

  for(BitCnt=0;BitCnt<8;BitCnt++)

  {  

SCL=0;//置时钟线为低,准备接收数据位

DelayUs(2);               

SCL=1;//置时钟线为高使数据线上数据有效                

retc=retc<<1;

if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中 

DelayUs(1);

  }

  SCL=0;    

  return(retc);

}

/*******************************************************************

 温湿度获取函数               

函数原型: SHT30_read_result(u8 addr);

功能: 用来接收从器件采集并合成温湿度

********************************************************************/ 

void SHT30_read_result(u8 addr)

{

u16 tem,hum;

u16 buff[6];

float Temperature=0;

float Humidity=0;

IIC_Start();

IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为读取位

IIC_wait_ACK();

IIC_SendByte(0x2C);

IIC_wait_ACK();

IIC_SendByte(0x06);

IIC_wait_ACK();

IIC_Stop();

DelayMs(50);

IIC_Start();

IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加0作为写取位,1为读取位

if(IIC_wait_ACK()==0)

{

buff[0]=IIC_RcvByte();

IIC_ACK();

buff[1]=IIC_RcvByte();

IIC_ACK();

buff[2]=IIC_RcvByte();

IIC_ACK();

buff[3]=IIC_RcvByte();

IIC_ACK();

buff[4]=IIC_RcvByte();

IIC_ACK();

buff[5]=IIC_RcvByte();

IIC_NACK();

IIC_Stop();

}

tem = ((buff[0]<<8) | buff[1]);//温度拼接

hum = ((buff[3]<<8) | buff[4]);//湿度拼接

/*转换实际温度*/

Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)

Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)

if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//过滤错误数据

{

humiture[0]=Temperature;

humiture[2]=Humidity;

sprintf(humiture_buff1,"%6.2f*C %6.2f%%",Temperature,Humidity);//111.01*C 100.01%(保留2位小数)

}

printf("温湿度:%sn",humiture_buff1);

hum=0;

tem=0;

}

关键字:STM32  SHT30  温湿度传感器  驱动代码

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471064.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32-DHT11(温湿度传感器)之学习笔记
下一篇:STM32 DTH11温湿度模块读写代码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32CAN波特率计算小程序(QT源码)

软件:Qt Creator开发环境:Window7用qt做得一个计算波特率的小程序,在实际的应用中我们设置波特率的时候是通过以下参数来定的:CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;CAN_InitStructure.CAN_Prescaler=5;波特率计算小程序的截图:   根据所需的的采样点、波特率以及错误率得到以上外设初始化所需的参数。据网上资料,采样点的设置有以下规律:75%   
发表于 2019-08-20
stm32CAN波特率计算小程序(QT源码)

stm32之ADC应用实例(单通道、多通道、基于DMA)

硬件:STM32F103VCT6开发工具:Keil uVision4下载调试工具:ARM仿真器网上资料很多,这里做一个详细的整合。(也不是很详细,但很通俗)。所用的芯片内嵌3个12位的模拟/数字转换器(ADC),每个ADC共用多达16个外部通道,2个内部通道。3个:代表ADC1、ADC2、ADC3(下图是芯片固件库的截图)12位:也叫ADC分辨率、采样精度。先来看看二进制的12位可表示0-4095个数,也就是说转换器通过采集转换所得到的最大值是4095,如:“111111111111”=4095,那么我们怎么通过转换器转换出来的值得到实际的电压值呢?如果我们要转换的电压范围是0v-3.3v的话,转换器就会把0v-3.3v平均
发表于 2019-08-20
stm32之ADC应用实例(单通道、多通道、基于DMA)

stm32之TIM-基本定时器应用实例(详细)

开发环境:Window 7开发工具:Keil uVision4硬件:STM32F103VCT6定时器最基本的功能就是定时处理事情。比如定时发送USART数据、定时采集AD数据、定时检测IO口电位、还可以通过IO口输出波形等。可以实现非常丰富的功能。STM32系列的定时器分为基本定时器、通用定时器、高级控制定时器。后者包括前者的全部功能。所以先掌握基本定时器可以更好理解后面功能繁多的定时器。通常地,STM32高级定时器TIM1、TIM8,通用定时器TIM2、TIM3、TIM4、TIM5,基本定时器TIM6、TIM7。有用过STM32的话都知道,STM32所有的外设初始化都是使用标准库里的初始化结构体和初始化函数,下面先说一下
发表于 2019-08-20
stm32之TIM-基本定时器应用实例(详细)

stm32之TIM-高级定时器应用实例一(详细)

硬件:stm32f103c8t6开发工具:Keil uVision4下载调试工具:ARM仿真器        如果第一次接触定时器,可以先看基本定时器。本篇内容较多,如果想直接动手操作,可以跳到后面的实验代码。        stm32标准库对定时器外设建立了4个初始化结构体,定时器分为基本定时器、通用定时器、高级定时器,针对不用的定时器要使用不同初始化结构体。下面是4个初始化结构体的适用分类:TIM_TimeBaseInitTypeDef  (基本定时器、通用定时器、高级定时器)TIM_OCInitTypeDef   
发表于 2019-08-20
stm32之TIM-高级定时器应用实例一(详细)

stm32之iap实现应用(基于串口,上位机,详细源码)

除了用烧录器读写外,还可以在芯片运行时,对自身的内部flash进行读写。如果flash储存了程序后还有剩余的空间,那么可以把它用来保存程序运行时产生需要掉电保存的数据;也可以在芯片运行时将另一个编译后的二进制程序文件写到剩余的flash,然后进行跳转到新的程序上面运行。这也是iap的实现原理。1.先介绍怎么利用stm库对flash进行操作所有flash操作相关的函数接口在stm32f10x_flash.h里面。读flash里面的数据直接根据地址读出来就行了。往写flash里面写数据,需要解锁,擦除,写入数据,上锁;擦除后存储单元都变成1,因为储存单元不能由0变1,所以在写入之前一定要先擦除,不然会写入失败。操作代码如下:#define
发表于 2019-08-20
stm32之iap实现应用(基于串口,上位机,详细源码)

stm32之USB应用实例(官方例程资料下载使用)

开发环境:Window 7开发工具:Keil uVision5硬件:stc32f103c8t6stm32系列芯片很多都拥有一个USB2.0全速的通讯接口,下面介绍怎么使用st官方的usb应用例程。首先从官网下载源码:https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.html需要登录才能下载,如果没有账号,注册一个也很快的。下载解压,打开
发表于 2019-08-20
stm32之USB应用实例(官方例程资料下载使用)

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved