一、实验目的:通过单片机普通IO口,模拟IIC时序,掌握IIC通讯协议。
二、实验用到的主控芯片:STM32F103RCT6,IIC通讯引脚IIC_SDA:PC11,IIC_SCL:PC12
三、SHT30地址线接地。
四、SHT30.h

#ifndef SHT30_H
#define SHT30_H
#include "delay.h"
#include "sys.h"
#include "stdio.h"
#include "usart.h"
#include "string.h"extern u8 humiture_buff1[20];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.c

#include "SHT30.h" #define write 0
#define read  1//IIC总线接口定义
#define SCL PCout(12)
#define SDA_OUT PCout(11)
#define SDA_IN PCin(11)
#define IIC_INPUT_MODE_SET()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define IIC_OUTPUT_MODE_SET() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}float humiture[4];
u8 humiture_buff1[20];void SHT30_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 RCC_APB2PeriphClockCmd(   RCC_APB2Periph_GPIOC, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);SCL=1;SDA_OUT=1;
}   /*主机发送ACK*/
void IIC_ACK(void)
{IIC_OUTPUT_MODE_SET();SCL=0;delay_us(2); SDA_OUT=0;delay_us(2);     SCL=1;delay_us(2);                  SCL=0;                     delay_us(1);
}/*主机不发送ACK*/
void IIC_NACK(void)
{IIC_OUTPUT_MODE_SET();SCL=0;delay_us(2); SDA_OUT=1;delay_us(2);      SCL=1;delay_us(2);                   SCL=0;                     delay_us(1);
}/*主机等待从机的ACK*/
u8 IIC_wait_ACK(void)
{u8 t = 200;IIC_OUTPUT_MODE_SET();SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位 delay_us(1);SCL=0;delay_us(1); IIC_INPUT_MODE_SET();delay_us(1); while(SDA_IN)//等待SHT30应答{t--;delay_us(1); if(t==0){SCL=0;return 1;}delay_us(1); }delay_us(1);      SCL=1;delay_us(1);SCL=0;             delay_us(1);    return 0;
}
/*******************************************************************
功能:启动I2C总线,即发送I2C起始条件.
********************************************************************/
void IIC_Start(void)
{IIC_OUTPUT_MODE_SET();SDA_OUT=1;SCL=1;delay_us(4);   SDA_OUT=0;delay_us(4); SCL=0;
}/*******************************************************************
功能:结束I2C总线,即发送I2C结束条件.
********************************************************************/
void IIC_Stop(void)
{IIC_OUTPUT_MODE_SET();SCL=0;SDA_OUT=0;  delay_us(4); SCL=1;delay_us(4);SDA_OUT=1;delay_us(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;delay_us(2); SCL=1;delay_us(2);SCL=0;delay_us(2);}
}
/*******************************************************************字节数据接收函数
函数原型: UCHAR  RcvByte();
功能: 用来接收从器件传来的数据
********************************************************************/
u8 IIC_RcvByte(void)
{u8 retc;u8 BitCnt;retc=0; IIC_INPUT_MODE_SET();//置数据线为输入方式delay_us(1);                    for(BitCnt=0;BitCnt<8;BitCnt++){  SCL=0;//置时钟线为低,准备接收数据位delay_us(2);               SCL=1;//置时钟线为高使数据线上数据有效                retc=retc<<1;if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中 delay_us(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();delay_ms(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("温湿度:%s\n",humiture_buff1);hum=0;tem=0;
}

六、main.c

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "SHT30.h"int main(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2delay_init();            //延时函数初始化   uart_init(9600);       //串口初始化为9600SHT30_Init();while(1){SHT30_read_result(0x44);}
}

七、通过串口展示实验结果

走钢丝的猴于2020.12.18书


STM32之IIC通讯-SHT30温湿度采集相关推荐

  1. STM32模拟IIC驱动sht30温湿度传感器

    最近有在使用sht30这个传感器,相比于新手常用的dht11传感器,sht30更精确,自己花了半小时调好了 所以拿出来分享给大家. sht30外观 驱动不是自己写的, 是采用CSDN上的一位朋友的 , ...

  2. STM32物联网项目-SHT30温湿度采集(IIC通信)

    SHT30温湿度采集(IIC通信) SHT30数字温湿度传感器 SHT3x湿度传感器系列包括低成本版本SHT30.标准版本SHT31,以及高端版本SHT35. SHT3x湿度传感器系列结合了多种功能和 ...

  3. STM32基于软件模拟IIC进行AHT21B温湿度采集

    STM32基于软件模拟IIC进行AHT21B温湿度采集 一. IIC简介 1.1 IIC简介 1.2 实现方式 1.3 实现方式对比 二. AHT21B简介 2.1 简介 2.2 产品特点 2.3 外 ...

  4. STM32之IIC通讯升级版--SHT30温湿度读取

    针对上篇文章对于程序可移植性不强的问题进行优化,基本思路是首先搭建好IIC底层驱动程序,该程序可用于任何IIC通讯设备,然后针对不同的IIC设备单独编写应用程序,本篇文章仍以SHT30为例. 一.II ...

  5. 模拟IIC读取SHT30温湿度传感器数据

    文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...

  6. STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...

  7. nRF52笔记(8) IIC读取sht30温湿度传感器

    1.平台的条件 1.1 软件平台:sdk14.2 1.2 硬件平台: nrf52832 2 说明: 只是介绍代码怎么使用,直接点 QQ: 1297311998 ,如果有什么问题,请高手不吝赐教 2.n ...

  8. 基于STM32温室大棚监测系统Protues仿真设计温湿度采集光照

    仿真演示视频 基于stm32温室大棚控制系统仿真设计温湿度采集光照采集protues设计物联网定制_哔哩哔哩_bilibili 开发软件Keil5+Protues8.9,温湿度传感器DHT11. 部分 ...

  9. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、单总线获取DHT11模块温湿度并通过IIC显示到屏幕(软件IIC)

    参考:基于stm32软件IIC的oled显示温湿度 作者:ZPZ DayUp 发布时间: 2021-07-25 20:52:43 网址:https://blog.csdn.net/m0_5619768 ...

最新文章

  1. linux查看msf安装目录,linux系统安装msf的过程详解
  2. 统计csv词频_中文词频统计
  3. C51位运算应用技巧
  4. 【深度学习】论文EMO单眼识别分析
  5. R语言实现多线性回归模型预测时间序列数据 MLR models in R
  6. Curl http_code 状态码
  7. jQuery实现页面关键词高亮
  8. #考研#计算机文化知识1(局域网及网络互联)
  9. 做一个消息自动回复,但是回复内容可以在网页上面输入,用input接收,错了,别人有新增选项,本身就是在页面进行新增,页面维护...
  10. spring-第十八篇之spring AOP基于XML配置文件的管理方式
  11. ENSP-----ISIS协议
  12. 谷歌翻译函数C#代码实现
  13. ubuntu关机后自动重启[无法关机]的解决办法
  14. 网络性能监测-系统监视器
  15. 华为鸿蒙系统操作教程_鸿蒙OS Beta版怎么使用
  16. error Type referred to is not an annotation type:
  17. wp:涅普冬令营(2021) 监听消息
  18. css 里面写响应式布局,CSS3怎么做出响应式布局
  19. Re6:读论文 LeSICiN: A Heterogeneous Graph-based Approach for Automatic Legal Statute Identification fro
  20. 对于BP神经网络的一些理解

热门文章

  1. 当Idea的主菜单被不小心隐藏。
  2. 计算机控制面板有何用途,控制面板上面功能都有什么作用
  3. GsonFormat的安装及使用
  4. C/C++大文件/数据网络传输方法总结
  5. java入门基础(四)
  6. java入门基础学习(三)
  7. 使用TLE(双行)根数计算出轨道数据以供Cesium使用
  8. vue项目中使用Echarts 动态更改图表数据 , Vue 折线图、柱状图等图表动态刷新 ,
  9. 简单实现基于 STM32F407+ESP8266+RFID 的物联网小项目
  10. Exercise – SE Technical Boot Camp Hands-on Exercises