STM32之IIC通讯-SHT30温湿度采集
一、实验目的:通过单片机普通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温湿度采集相关推荐
- STM32模拟IIC驱动sht30温湿度传感器
最近有在使用sht30这个传感器,相比于新手常用的dht11传感器,sht30更精确,自己花了半小时调好了 所以拿出来分享给大家. sht30外观 驱动不是自己写的, 是采用CSDN上的一位朋友的 , ...
- STM32物联网项目-SHT30温湿度采集(IIC通信)
SHT30温湿度采集(IIC通信) SHT30数字温湿度传感器 SHT3x湿度传感器系列包括低成本版本SHT30.标准版本SHT31,以及高端版本SHT35. SHT3x湿度传感器系列结合了多种功能和 ...
- STM32基于软件模拟IIC进行AHT21B温湿度采集
STM32基于软件模拟IIC进行AHT21B温湿度采集 一. IIC简介 1.1 IIC简介 1.2 实现方式 1.3 实现方式对比 二. AHT21B简介 2.1 简介 2.2 产品特点 2.3 外 ...
- STM32之IIC通讯升级版--SHT30温湿度读取
针对上篇文章对于程序可移植性不强的问题进行优化,基本思路是首先搭建好IIC底层驱动程序,该程序可用于任何IIC通讯设备,然后针对不同的IIC设备单独编写应用程序,本篇文章仍以SHT30为例. 一.II ...
- 模拟IIC读取SHT30温湿度传感器数据
文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...
- STM32F103使用硬件IIC驱动SHT30温湿度传感器
文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...
- nRF52笔记(8) IIC读取sht30温湿度传感器
1.平台的条件 1.1 软件平台:sdk14.2 1.2 硬件平台: nrf52832 2 说明: 只是介绍代码怎么使用,直接点 QQ: 1297311998 ,如果有什么问题,请高手不吝赐教 2.n ...
- 基于STM32温室大棚监测系统Protues仿真设计温湿度采集光照
仿真演示视频 基于stm32温室大棚控制系统仿真设计温湿度采集光照采集protues设计物联网定制_哔哩哔哩_bilibili 开发软件Keil5+Protues8.9,温湿度传感器DHT11. 部分 ...
- STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、单总线获取DHT11模块温湿度并通过IIC显示到屏幕(软件IIC)
参考:基于stm32软件IIC的oled显示温湿度 作者:ZPZ DayUp 发布时间: 2021-07-25 20:52:43 网址:https://blog.csdn.net/m0_5619768 ...
最新文章
- linux查看msf安装目录,linux系统安装msf的过程详解
- 统计csv词频_中文词频统计
- C51位运算应用技巧
- 【深度学习】论文EMO单眼识别分析
- R语言实现多线性回归模型预测时间序列数据 MLR models in R
- Curl http_code 状态码
- jQuery实现页面关键词高亮
- #考研#计算机文化知识1(局域网及网络互联)
- 做一个消息自动回复,但是回复内容可以在网页上面输入,用input接收,错了,别人有新增选项,本身就是在页面进行新增,页面维护...
- spring-第十八篇之spring AOP基于XML配置文件的管理方式
- ENSP-----ISIS协议
- 谷歌翻译函数C#代码实现
- ubuntu关机后自动重启[无法关机]的解决办法
- 网络性能监测-系统监视器
- 华为鸿蒙系统操作教程_鸿蒙OS Beta版怎么使用
- error Type referred to is not an annotation type:
- wp:涅普冬令营(2021) 监听消息
- css 里面写响应式布局,CSS3怎么做出响应式布局
- Re6:读论文 LeSICiN: A Heterogeneous Graph-based Approach for Automatic Legal Statute Identification fro
- 对于BP神经网络的一些理解
热门文章
- 当Idea的主菜单被不小心隐藏。
- 计算机控制面板有何用途,控制面板上面功能都有什么作用
- GsonFormat的安装及使用
- C/C++大文件/数据网络传输方法总结
- java入门基础(四)
- java入门基础学习(三)
- 使用TLE(双行)根数计算出轨道数据以供Cesium使用
- vue项目中使用Echarts 动态更改图表数据 , Vue 折线图、柱状图等图表动态刷新 ,
- 简单实现基于 STM32F407+ESP8266+RFID 的物联网小项目
- Exercise – SE Technical Boot Camp Hands-on Exercises