51单片机对SHT30的驱动,读取温湿度

一、SHT30简介

SHT30温湿度传感器是一种数字式温湿度传感器,由Sensirion公司开发和生产。它具有高精度、快速响应和稳定性强的特点,被广泛用于气象观测、室内环境监测、智能家居和工业自动化等领域。

以下是SHT30温湿度传感器的主要特点:

  1. 高精度:SHT30具有高精度的温度测量范围,可达到±0.3°C,并且在较广的温度范围内保持较低的测量误差。

  2. 快速响应:该传感器具有快速的响应时间,可以在很短的时间内提供准确的温湿度读数。

  3. 低功耗:SHT30采用超低功耗设计,使其适用于电池供电的设备和便携式应用。

  4. 数字输出:传感器通过I2C接口进行数字信号输出,可以直接与微控制器或其他数字设备连接。

  5. 高抗干扰性:SHT30采用了先进的信号处理技术和抗干扰设计,能够有效地抵抗外界干扰,提供可靠的测量结果。

  6. 多种封装形式:SHT30可供选择不同的封装形式,如DIP、SMD和TO-39等,以满足不同应用场景的需求。

总之,SHT30温湿度传感器是一款性能优异的数字式温湿度传感器,适用于各种环境监测和控制应用。它的高精度、快速响应和稳定性强使得它成为许多领域中首选的温湿度传感器之一。

二、资料链接

下载链接:https://pan.baidu.com/s/1UKDi0A6putMa2bqbqg09Gg                    提取码:5sl8

三、驱动工程

1、SHT30

SHT30.h

#ifndef __SHT30_H__
#define __SHT30_H__#include <DELAY.H>
#include <I2C.H>#define  uchar  unsigned char 
#define  uint   unsigned intextern uchar read_sht_data[7];//struct data_process
//{
extern	uint SHT30_temperature;
extern	uint SHT30_humidity;
//};extern void sht30_init(void);
extern void read_sht30(uchar *p,uchar number);
extern void sht30_data_process(void);
extern int  crc8_compute(uchar *check_data, uchar num_of_data);
extern int  sht30_crc8_check(uchar *p,uchar num_of_data,uchar CrcData);
extern void sht30_display(void);#endif

SHT30.c

#include <SHT30.H>uchar read_sht_data[7];//数据读取缓存uint SHT30_temperature;
uint SHT30_humidity;/*****SHT30初始化*******/
void sht30_init(void)
{	I2C_Start();                //启动总线I2C_WriteAbyte(0x88);      //发送从器件写地址 I2C_Check_ACK();            //器件应答检测	此函数已设F0=SDAI2C_WriteAbyte(0x20);       //low Repeatability,0.5mpsI2C_Check_ACK();            //器件应答检测	此函数已设F0=SDA ;I2C_WriteAbyte(0x32);       //low Repeatability,0.5mpsI2C_Check_ACK();            //器件应答检测	此函数已设F0=SDA ;I2C_Stop();Delay_ms(150);              //延时测量数据,为下一步读取做准备
}/*****SHT30读数据*******/
void read_sht30(uchar *p,uchar number)
{I2C_Start();                //启动总线I2C_WriteAbyte(0x88);      //发送从器件写地址 I2C_Check_ACK();            //器件应答检测	此函数已设F0=SDAI2C_WriteAbyte(0xe0);       //数据获取命令I2C_Check_ACK();            //器件应答检测	此函数已设F0=SDA ;I2C_WriteAbyte(0x00);       //数据获取命令I2C_Check_ACK();            //器件应答检测	此函数已设F0=SDA ;I2C_Start();                //启动总线I2C_WriteAbyte(0x89);      //发送从器件读地址 I2C_Check_ACK();            //器件应答检测	此函数已设F0=SDAdo{*p=I2C_ReadAbyte();	 //开始逐个读出字节p++;if(number!=1)S_ACK();			 //应答}while(--number);       //直至读完数据S_NOACK();             //总线非应答I2C_Stop();			
}/**********CRC数据校验**********/
int  crc8_compute(uchar *check_data, uchar num_of_data)
{uchar i;        // bit maskuchar crc = 0xFF; // calculated checksumuchar byteCtr;    // byte counter// calculates 8-Bit checksum with given polynomialfor(byteCtr = 0; byteCtr < num_of_data; byteCtr++) {crc ^= (check_data[byteCtr]);//异或赋值,crc=crc^(check_data[byteCtr])//crc校验,最高位是1就^0x31for(i = 8; i > 0; --i) {if(crc & 0x80) {crc = (crc << 1) ^ 0x31;}  else {crc = (crc << 1);}}}return crc;
}/********CRC数据校验缓冲***************/
int sht30_crc8_check(uchar *p,uchar num_of_data,uchar CrcData)
{uchar crc;crc = crc8_compute(p, num_of_data);// calculates 8-Bit checksumif(crc != CrcData) {   return 1;           }
return 0;
}/*****SHT30温度数据处理*******/
void sht30_data_process(void)
{uchar temporary[3];           //用于暂时存放总线读出的温湿度值uint  Data_convert;           //用于数据转换uchar crc_result;             //用于CRC校验结果存放,为判断数据准确性做准备read_sht30(read_sht_data,6);  //读出数据放入缓存数组等待处理>>T高八位>>T低八位>>温度T的CRC校验位>>H高八位>>H低八位>>湿度H的CRC校验位temporary[0]=read_sht_data[0];//温度数据高八位temporary[1]=read_sht_data[1];//温度数据低八位temporary[2]=read_sht_data[2];//温度数据CRC校验位crc_result=sht30_crc8_check(temporary,2,temporary[2]);	 //crc校验,crc校验要是不成功就返回1,//同时不会更新温度值if(crc_result==0)  {Data_convert=(uint)(temporary[0] << 8) | temporary[1];  //把2个8位数据拼接为一个16位的数据//温度转换,将16位温度数据转化为10进制的温度数据,//这里保留了一位小数,SHT30_temperature这是一个全局变量,//计算温度值(uchar强制转换,数据在超过八位范围后会丢失)SHT30_temperature = (uint)((175.0 * (float)(0x7fff&Data_convert) / 65535.0 - 45.0) *10.0); }temporary[0]=read_sht_data[3];//湿度数据高八位temporary[1]=read_sht_data[4];//湿度数据低八位temporary[2]=read_sht_data[5];//湿度数据CRC校验位//crc校验crc_result=sht30_crc8_check(temporary,2,temporary[2]);   //crc校验,crc校验要是不成功就返回1,//同时不会更新湿度值if(crc_result==0){Data_convert=(uint)(temporary[0] << 8) | temporary[1];//湿度转换,将16位湿度数据转化为10进制的湿度数据,//这里保留了一位小数,SHT30_humidity这是一个全局变量,//计算湿度值(uchar强制转换,数据在超过八位范围后会丢失)SHT30_humidity = (uint)((100.0 * (float)(0x7fff&Data_convert) / 65535.0) *10.0); }	
}/***********SHT30温湿度显示函数************/
//void sht30_display(void)
//{	
//	uchar tempe[5];
//	uchar humid[6];
//	
//	sht30_data_process();//读取sht30数据并处理得到温湿度值
//	
//	tempe[0] = (uchar)((SHT30_temperature/100)%10)+48;//温度十位
//	tempe[1] = (uchar)((SHT30_temperature/10)%10)+48;//温度个位
//	tempe[2] = '.';
//	tempe[3] = (uchar)((SHT30_temperature/1)%10)+48;//温度小数位
//	OLED_P16x16Ch(42, 4, 1);//摄氏度符号
//	
//	humid[0] = (uchar)((SHT30_humidity/100)%10)+48;//湿度十位
//	humid[1] = (uchar)((SHT30_humidity/10)%10)+48;//湿度个位
//	humid[2] = '.';
//	humid[3] = (uchar)((SHT30_humidity/1)%10)+48;//湿度小数位
//	humid[4] = '%';
//	
//	OLED_P8x16Str(10, 4, tempe); //OLED显示温度值
//	
//	OLED_P8x16Str(10, 6, humid); //OLED显示湿度值	
//}

2、IIC

I2C.h

#ifndef __I2C_H_
#define __I2C_H_#define  uchar  unsigned char 
#define  uint   unsigned int #include <STC15.H>
#include <DELAY.H>#define slaw1 0xA2   //PCF8563写命令字
#define slar1 0xA3   //PCF8563读命令字
#define slaw2 0x78   //0.96寸OLED写命令字
#define slar2 0x79   //0.96寸OLED读命令字
#define slaw3 0x88   //SHT30写命令字
#define slar3 0x89   //SHT30读命令字sbit SCL  =P1^4;    //I2C时钟线
sbit SDA  =P1^3;    //I2C数据线extern void I2C_Start(void);
extern void I2C_Stop(void);
extern void S_ACK(void);
extern void S_NOACK(void);
extern void I2C_Check_ACK(void);
extern void I2C_WriteAbyte(uchar dat);
extern uchar I2C_ReadAbyte(void);
extern void WriteNbyte(uchar sla_w,uchar addr,uchar *p,uchar number);
extern void ReadNbyte(uchar sla_w,uchar addr,uchar sla_r,uchar *p,uchar number);#endif

I2C.c

#include <I2C.H>/*******I2C总线启动函数*************/
void I2C_Start(void)
{SDA=1;Delay_us(1);SCL=1;Delay_us(1);SDA=0;Delay_us(1);SCL=0;Delay_us(1);
}/*******I2C总线停止函数*************/
void I2C_Stop(void)
{SDA=0;Delay_us(1);SCL=1;Delay_us(1);SDA=1;Delay_us(1);
}/********I2C总线应答函数***********/
void S_ACK(void)
{SDA=0;Delay_us(1);SCL=1;Delay_us(1);SCL=0;Delay_us(1);
}/*******I2C总线非应答函数*************/
void S_NOACK(void)
{SDA=1;Delay_us(1);SCL=1;Delay_us(1);SCL=0;Delay_us(1);
}/*********I2C总线应答检查函数*********/
void I2C_Check_ACK(void)
{uchar i;SDA=1;Delay_us(1);SCL=1;Delay_us(1);F0=SDA;			             //F0为用户标志位,单片机内置寄存器,相当于一个全局变量,其值可由用户自己定义while((F0==1)&&(i<255)) i++; //若SDA被拉低,即收到应答信号,则退出while循环,若i=255,则按超时处理,同样退出循环SCL=0;Delay_us(1);
}/********I2C总线单字节写函数************/
void I2C_WriteAbyte(uchar dat)
{uchar i;i=8;do{if(dat&0x80){SDA=1;}else{SDA=0;}dat<<=1;Delay_us(1);SCL=1;Delay_us(1);SCL=0;Delay_us(1);}while(--i);
}/*********I2C总线单字节读函数*************/
uchar I2C_ReadAbyte(void)
{uchar i,dat;i=8;SDA=1;Delay_us(1);do{ SCL=1;Delay_us(1);dat<<=1;if(SDA)dat++;SCL=0;Delay_us(1);}while(--i);return(dat);
}/***********I2C总线N字节写函数**************/
//void WriteNbyte(uchar sla_w,uchar addr,uchar *p,uchar number)
//{
//    I2C_Start();                //启动总线
//	I2C_WriteAbyte(sla_w);      //发送从器件地址 
//	I2C_Check_ACK();            //器件应答检测	此函数已设F0=SDA
//	I2C_WriteAbyte(addr);       //发送从器件相关寄存器地址
//	I2C_Check_ACK();            //器件应答检测	此函数已设F0=SDA 
//	    do
//		{
//		  I2C_WriteAbyte(*p);   //开始逐个写入字节
//		  p++;
//		  I2C_Check_ACK();
//		  if(F0)
//		    break;
//		}
//	  while(--number);         //直至写完数据
//	I2C_Stop();
//}//I2C总线N字节读函数//
//void ReadNbyte(uchar sla_w,uchar addr,uchar sla_r,uchar *p,uchar number)	 //I2C器件写地址,器件相关寄存器地址,I2C器件读地址,第一位数据地址,数据宽度
//{
//    I2C_Start();				//启动总线
//	I2C_WriteAbyte(sla_w);      //发送从器件地址
//	I2C_Check_ACK();			//器件应答检测	此函数已设F0=SDA
//	I2C_WriteAbyte(addr);		//发送从器件相关寄存器地址
//	I2C_Check_ACK();			//器件应答检测
//	I2C_Start();			    //重新通信
//    I2C_WriteAbyte(sla_r);	    //发送从器件地址和读信号
//	I2C_Check_ACK();		    //器件应答检测 
//		  do
//		  {
//		    *p=I2C_ReadAbyte();	 //开始逐个读出字节
//			p++;
//			if(number!=1)
//			  S_ACK();			 //应答
//		  }
//		  while(--number);       //直至读完数据
//		  S_NOACK();             //总线非应答
//	I2C_Stop();
//}

四、完整代码工程

链接:https://pan.baidu.com/s/1bhFkaj2A1zoSOECTt-Ik0Q?pwd=zxf1 
提取码:zxf1 
--来自百度网盘超级会员V3的分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单句子成分、阅读技巧

四、段落的主旨题&#xff1a;问这一段讲了什么&#xff08;一般都在段落的第一句话或最后一句话&#xff09; 词汇题的答案一般都在生词的上一句或者下一句 做题步骤&#xff1a; 1、先标段落 2、看题&#xff0c;划出关键词 3、去原文定位&#xff0c;标注中文意思 4、第一遍…

Dart编程基础 - 一种新的编程语言

Dart编程基础 – 一种新的编程语言 Dart Programming Essentials - A New Type of Programming Language By JacksonML Dart is a client-optimized language for fast apps on any platform From dart.dev 在1999年之前&#xff0c;和我一样对计算机技术感兴趣的伙伴们&…

1094. 拼车(差分堆排序)

Problem: 1094. 拼车 文章目录 题目思路Review 差分数组定义区间加法减法更新差分数组&#xff1a;为啥这样更新 思路1 Code思路2 Code 题目 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整…

高级前端面试中的三个 “送命题” !!!

原型与原型链 说到原型&#xff0c;就不得不提一下构造函数&#xff0c;首先我们看下面一个简单的例子&#xff1a; function Dog(name,age){this.name name;this.age age; }let dog1 new Dog("哈士奇",3); let dog2 new Dog("泰迪",2);首先创造空的…

Mybatis-plus逻辑删除

转载自:www.javaman.cn 1、application.yml配置 mybatis-plus: 表示这是 MyBatis-Plus 的配置部分。global-config: 全局配置。db-config: 数据库相关配置。logic-delete-field: 指定逻辑删除的字段名。在这里&#xff0c;指定的字段名是 deleted。这意味着&#xff0c;当你调…

《算法通关村——滑动窗口高频问题》

《算法通关村——滑动窗口高频问题》 239. 滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#…

机械臂运动规划、抓取末端执行器、抓取开源项目

运动规划 1.1已有抓取点 假设抓取点已检测到。这些方法设计了从机器人手到目标物体抓取点的路径。这里运动表示是关键问题。虽然存在从机器人手到目标抓握点的无限数量的轨迹&#xff0c;但是由于机器人臂的限制&#xff0c;许多区域无法到达。因此&#xff0c;需要对轨迹进行…

Hdoop学习笔记(HDP)-Part.01 关于HDP

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

python etree.HTML 以及xpath 解析网页的工具

文章目录 导入模块相关语法实战 导入模块 from lxml import etree相关语法 XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位和选择元素的语言。XPath的主要应用领域是在XML文档中进行导航和查询&#xff0c;通常用于在XML中选择节点或节点集合。以…

js 处理编译器html 包含img的标签并设置width

var imgElements document.getElementsByTagName(img); for (let imgElement of imgElements) { //1.如果有style属性,去掉style属性中的width属性和height属性 if (imgElement.hasAttribute(st…

UiPath学习笔记

文章目录 前言RPA介绍UiPath下载安装组件内容 前言 最近有一个项目的采集调研涉及到了客户端的采集&#xff0c;就取了解了一下RPA和UIPATH&#xff0c;记录一下 RPA介绍 RPA&#xff08;Robotic Process Automation&#xff1a;机器人处理自动化&#xff09;&#xff0c;是…

【影视后期扩展课-01】

影视后期扩展课-01 福利网站 福利网站 【电影下载】 ■皮皮虾资源&#xff1a;https://ppxzy.net/ ■电影港网&#xff1a;https://www.dyg5.com/ ■人人网&#xff1a;https://www.rrdynb.com/index.html ■高清MP4&#xff1a;https://mp4fan.org/member.php?modlogging&am…

使用Zabbix监控openstack的系统资源

1 简介 对于Openstack运维人员来说&#xff0c;需要掌握Openstack云平台系统资源的整体运行情况&#xff0c;包括域(AZ)的cpu/menmory等资源使用情况&#xff1b;本文将介绍使用zabbix结合openstack python-api对openstack系统资源进行监控。 2 使用控制台获取域(AZ)监控信息 …

pta模拟题(7-15 BCD解密、7-16 数列求和-加强版、7-17 出租、7-18 反向数相加、7-19 一帮一、7-20 连续因子)

7-15 BCD解密 BCD数是用一个字节来表达两位十进制的数&#xff0c;每四个比特表示一位。所以如果一个BCD数的十六进制是0x12&#xff0c;它表达的就是十进制的12。但是小明没学过BCD&#xff0c;把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制…

JS 实现一键复制文本内容

1、演示&#xff1a; 2、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一键复制</title&g…

羊大师分析,鲜羊奶对健康的影响与作用

羊大师分析&#xff0c;鲜羊奶对健康的影响与作用 你是否曾经听到过“羊奶比牛奶更健康”的说法&#xff1f;而鲜羊奶作为最纯正的羊奶形式&#xff0c;其营养价值更是不可小觑。除了拥有传统奶类所包含的营养成分外&#xff0c;鲜羊奶还含有更多人体必需的氨基酸和微量元素&a…

更有效的问卷发布方法与必备问卷工具推荐

问卷怎么发&#xff1f;通过哪些渠道发&#xff1f;怎么发收集的数量更多&#xff1f;怎么获得有效数据&#xff1f;这些是做问卷的调查人员经常会遇到的问题。的确&#xff0c;问卷的发放是否有效不仅会影响到收集数据的体量&#xff0c;更会影响到最终结论的真实性。所以&…

centos7 yum安装mysql5.7

1.获取源 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 2.安装源 yum -y install mysql57-community-release-el7-11.noarch.rpm 3.安装mysql yum -y install mysql-server 4.如果出现下面错误&#xff0c;没有错误就忽略 使用以下命令解决…

Mysql 中日期比较大小的方法有哪些?

在 MySQL 中&#xff0c;你可以使用多种方法来比较日期的大小。以下是一些常用的方式&#xff1a; 使用比较运算符&#xff1a; SELECT * FROM your_table WHERE your_date_column > 2023-01-01; 这将选择日期列值大于 2023-01-01 的所有记录。 使用比较运算符和 NOW() …

数据结构-带头双向循环链表

文章目录 一.头结点二.双链表1双链表的概念与结构2.与单链表相比 三.循环链表1.关于循环链表2.循环链表的优点 四.带头双向循环链表1.带头双向循环链表2.结构图3.实现 五.代码一览 一.头结点 在链表中设置头结点的作用是什么 标识链表:头结点是链表的特殊节点,它的存在能够明确…