STM32 例程-7 STM32固件库方式 读取SHT20 温湿度

SHT20 .h文件

#ifndef SHT20_H
#define SHT20_H
#include "common.h"
#include "stdio.h"
#include "string.h"
#include "stm32f4xx.h"

#define IIC_SCL_PIN  GPIO_Pin_0
#define IIC_SDA_PIN  GPIO_Pin_1
#define SHT20_ADDRESS  0x80
#define IIC_SCL_Set()  GPIO_WriteBit(GPIOB, IIC_SCL_PIN, Bit_SET)
#define IIC_SCL_Clr()  GPIO_WriteBit(GPIOB, IIC_SCL_PIN, Bit_RESET)

#define IIC_SDA_Set()  GPIO_WriteBit(GPIOB, IIC_SDA_PIN, Bit_SET)
#define IIC_SDA_Clr()  GPIO_WriteBit(GPIOB, IIC_SDA_PIN, Bit_RESET)

#define IIC_SDA_Get()  GPIO_ReadInputDataBit(GPIOB, IIC_SDA_PIN)
#define IIC_SCL_Get()  GPIO_ReadInputDataBit(GPIOB, IIC_SCL_PIN)
#ifndef IIC_Direction_Transmitter
    #define  IIC_Direction_Transmitter      ((uint8_t)0x00)
#endif

#ifndef IIC_Direction_Receiver
    #define  IIC_Direction_Receiver         ((uint8_t)0x01)
#endif

#define  IIC_SDA_IN   0
#define  IIC_SDA_OUT  1

enum
{
    IIC_ACK,
    IIC_NACK
};

//IIC所有操作函数
void IIC_GPIOInit(void);
void IIC_SDAMode(uint8_t Mode);
void IIC_Start(void);
void IIC_Stop(void);
uint8_t IIC_WaitForAck(void);
void IIC_Ack(void);
void IIC_NAck(void);
void IIC_SendByte(uint8_t Data);
uint8_t IIC_ReadByte(unsigned char Ack);
void SHT_GPIO_Init(void);
void SHT20_Init(void);
void SHT20_read_result(void);
#endif

SHT20 .c文件

#include "SHT20.h"
#include "common.h"
#include "lcd.h"
//IO方向设置
#define SDA_IN()  {GPIOB->MODER&=~(3<<(1*2));gpiob->MODER|=0<<1*2;} pb1输入模式 #define sda_out() {gpiob->MODER&=~(3<<(1*2));gpiob->MODER|=1<<1*2;} pb1输出模式 void sht_gpio_init(void) { gpio_inittypedef gpio_initstructure; rcc_ahb1periphclockcmd( rcc_ahb1periph_gpiob, enable ); 使能gpiob gpio_initstructure.gpio_pin="IIC_SCL_PIN|IIC_SDA_PIN;//PB0,PB1" gpio_initstructure.gpio_mode="GPIO_Mode_OUT;" 开漏输出 gpio_initstructure.gpio_otype="GPIO_OType_PP;" gpio_initstructure.gpio_speed="GPIO_Speed_100MHz;" gpio_init(gpiob, &gpio_initstructure); gpio_initstructure.gpio_pupd="GPIO_PuPd_UP;//&#x4E0A;&#x62C9;" iic_scl_set(); iic_sda_set(); } iic_delay(uint16_t time) uint8_t i; while(time --) for(i="0;" i < 10; ++); iic_sdamode(uint8_t mode){ if(mode){ sda_out(); }else{ sda_in(); 产生iic起始信号 iic_start(void) iic_sdamode(iic_sda_out); iic_delay(4); iic_sda_clr(); iic_scl_clr(); 产生iic停止信号 iic_stop(void) 等待应答信号到来 返回值:1,接收应答失败 0,接收应答成功 iic_waitforack(void) retry="0;" iic_delay(1); iic_sdamode(iic_sda_in); iic_sda_set();iic_delay(1); iic_scl_set();iic_delay(1); while(iic_sda_get()) if(++> 250)
        {
            IIC_Stop();
            return 1;
        }
    }
    IIC_SCL_Clr();

    return 0;
}
//&#x4EA7;&#x751F;ACK&#x5E94;&#x7B54;
void IIC_Ack(void)
{
    IIC_SCL_Clr();
    IIC_SDAMode(IIC_SDA_OUT);
    IIC_SDA_Clr();
    iic_delay(2);
    IIC_SCL_Set();
    iic_delay(2);
    IIC_SCL_Clr();
}
//&#x4EA7;&#x751F;&#x975E;ACK&#x5E94;&#x7B54;
void IIC_NAck(void)
{
    IIC_SCL_Clr();
    IIC_SDAMode(IIC_SDA_OUT);
    IIC_SDA_Set();
    iic_delay(2);
    IIC_SCL_Set();
    iic_delay(2);
    IIC_SCL_Clr();
}
//IIC&#x53D1;&#x9001;&#x4E00;&#x4E2A;&#x5B57;&#x8282;
//&#x8FD4;&#x56DE;&#x4ECE;&#x673A;&#x6709;&#x65E0;&#x5E94;&#x7B54;
//1&#xFF0C;&#x6709;&#x5E94;&#x7B54;
//0&#xFF0C;&#x65E0;&#x5E94;&#x7B54;
void IIC_SendByte(uint8_t Data)
{
  uint8_t i;
    IIC_SDAMode(IIC_SDA_OUT);
    IIC_SCL_Clr();
    for(i = 0; i < 8; i ++)
    {
        if(Data & 0x80)
            IIC_SDA_Set();
        else
            IIC_SDA_Clr();
        Data <<= 175 1; iic_delay(1); iic_scl_set(); iic_delay(2); iic_scl_clr(); } 读1个字节,ack="1&#x65F6;&#xFF0C;&#x53D1;&#x9001;ACK&#xFF0C;ack=0&#xFF0C;&#x53D1;&#x9001;nACK" uint8_t iic_readbyte(unsigned char ack) { i, recdat="0;" iic_sdamode(iic_sda_in); for(i="0;" i < 8; ++) iic_delay(55); <<="1;" if(iic_sda_get()) |="0x01;" else &="~0x01;" iic_delay(5); if(ack) iic_ack(); iic_nack(); return recdat; void sht20_init(void) sht_gpio_init(); iic_delay(50); 0x2130 表示周期模式 周期1s iic_start(); iic_sendbyte(0x88); iic_waitforack(); iic_sendbyte(0x21); iic_sendbyte(0x30); iic_stop(); iic_delay(5000); ******************************************************************* 温湿度获取函数 函数原型: sht20_read_result(uint8_t addr); 功能: 用来接收从器件采集并合成温湿度 ******************************************************************** sht20_read_result(void) uint16_t temp_humi_buffer[6],temp,humi; float temperature,humidity; 写命令给sht20,这个命令是访问sht20转换结果的寄存器的 iic_sendbyte(0x80); iic_sendbyte(0xf3); delay_ms(100); iic_sendbyte(0x81); temp_humi_buffer[0]="IIC_ReadByte(1);" temp_humi_buffer[1]="IIC_ReadByte(1);" temp_humi_buffer[2]="IIC_ReadByte(1);" temp="((temp_humi_buffer[0]<<8)" temp_humi_buffer[1]); 温度拼接 iic_sendbyte(0xf5); humi="((temp_humi_buffer[0]<<8)" 湿度拼接 *转换实际温度* temperature="(175.0f*(float)temp/65535.0f" -45.0f); t="-45" + * tem (2^16-1) humidity="(100.0f*(float)humi/65535.0f);//" rh="hum*100" if((temperature>=-40)&&(temperature<=125)&&(humidity>=0)&&(humidity<=100)) 过滤错误 { u8 str[256]; memset(str,0x00,256); sprintf((char*)str,"temp&hum:%6.2f*c %6.2f%%",temperature,humidity); lcd_displaystring(10,250,16,str); printf("温湿度:%6.2f*c }else{ printf("温湿度故障"); } delay_ms(1000); < code></=100))></=125)&&(humidity></=></1*2;}></(1*2));gpiob-></1*2;}></(1*2));gpiob->

调用方法
SHT20_Init(); //SHT20初始化
SHT20_read_result();

本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。
另外建了几个QQ技术群:
2、全栈技术群:616945527,加群口令abc123
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600

闲置域名WWW.EXAI.CN (超级人工智能)出售。

Original: https://www.cnblogs.com/zhaogaojian/p/16095748.html
Author: zhaogaojian
Title: STM32 例程-7 STM32固件库方式 读取SHT20 温湿度

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/554444/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球