SHT30学习记录(51单片机代码)

基本数据:

供电范围:2.4V~5.5V,湿度误差±1.5,温度误差±0.2。

设备地址选择脚,ADDR(PIN2)接GND,设备写地址为0x88(0x44<<1),读地址为0x89(0x45<<1)。

读取的信息顺序是:温度数据(16位)+校验和(8位)+适度数据(16位)+校验和(8位)。

湿度:RH=100*(1.0*SRH / 65535),摄氏温度:T=-45+175*(1.0*ST / 65535);

单次数据采集模式:

可设置重复性和时钟延展。数据采集频率和重复性影响传感器测量时间和功耗。

例如:指令0x2c06,启用高重复性测量和时钟延展。

单次模式读取数据:注意单次下传感器测量时间间隙,

例如:发送0x2c06指令后,传感器工作(大概10ms)→发送“读报头”→传感器响应→SDA被拉低(大概2ms)→读出数据。

备注:时钟延展只适用于单次采集模式。

周期数据采集模式:

采用固定周期测量数据,有0.5mps,1mps,2mps,4mps,10mps。1mps采样频率,即1s采集一次。

循环模式读取数据:读取数据前要开启循环采集(指令0x2130,1mps,高重复性),

再重新发送指令0xE000,每次读完传感器数据寄存器都会清除。

如果传感器处于此模式,且正在采集数据,发送中断指令(0x3903),传感器将完成此次测量,进入单次采集模式。

下面是主要部分代码

#define SHT30_ADDR_WRITE 0x88
#define SHT30_ADDR_READ 0x89

#define ONE_SHOT 0x2c06

/*******************************************************/
#define PERIODIC_MODE_05S 0x2032// 0.5mps
#define PERIODIC_MODE_1S  0x2130// 1mps  
#define PERIODIC_MODE_2S  0x2236// 2mps  
#define PERIODIC_MODE_4S  0x2334// 4mps  
#define PERIODIC_MODE_10S 0x2737// 10mps 
#define FETCH_DATA 0xe000	
/********************************************************/
void sht30_single_mode();
void sht30_periodic_readdata();
void sht30_periodic_init();
void sht30_readdata(uchar msb,uchar lsb);
uint sht30_data[4];
extern uchar flag_1s;

//1s读取一次数据发送到串口
int main()
{
	usart_init();
	sda=1;
	scl=0;
	delayms(10);
	sht30_periodic_init();
	//sht30_single_mode();
	while(1)
	{
		if(flag_1s==1)
		{
			flag_1s=0;
			sht30_readdata(0xe0,0x00);
		}
	}
}

void sht30_periodic_init()
{
	i2c_start();
	i2c_write_byte(SHT30_ADDR_WRITE);
	i2c_write_byte(0x21);
	i2c_write_byte(0x30);
	i2c_stop();	
}

void sht30_readdata(uchar msb,uchar lsb)
{
	float RH,T;
	i2c_start();
	i2c_write_byte(SHT30_ADDR_WRITE);
	i2c_write_byte(msb);
	i2c_write_byte(lsb);
	i2c_stop();

	i2c_start();
	i2c_write_byte(SHT30_ADDR_READ);
	
	sht30_data[0]=i2c_read_byte(1);
	sht30_data[0]<<=8;
	sht30_data[0]|=i2c_read_byte(1);
	sht30_data[1]=i2c_read_byte(1);
	
	sht30_data[2]=i2c_read_byte(1);
	sht30_data[2]<<=8;
	sht30_data[2]|=i2c_read_byte(1);
	sht30_data[3]=i2c_read_byte(0);
	
	i2c_stop();

	T=-45+175*(1.0*sht30_data[0] / 65535);
	RH=100*(1.0*sht30_data[2] / 65535);
	ES=0;
	TI=1;
	printf("温度:%2.2f ℃,湿度:%2.2f %%RH\n",T,RH);
	while(!TI);
	TI=0;
	ES=1;	
}

 

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
sht30的基于c51单片机驱动程序:#include #include #include "I2C.h" #include "SHT30.h" #define uint unsigned int #define uchar unsigned char void display(); unsigned char code tableduan[]= { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; uchar data DIS_ROME[6]= {0,0,0,0,0,0}; //显示缓存区(4) uchar DISP=0;//缓存区指针 uchar SCANF=0xDF;//扫描指针 sbit LED1=P1^0; sbit LED2=P1^1; sbit LED3=P1^2; sbit LED4=P1^3; sbit VOC_A=P3^5; sbit VOC_B=P3^6; sbit dula=P2^6; //IO口定义 sbit wela=P2^7; sbit key=P3^4; sbit beep_dr=P2^3; uint pm1 = 0; uint pm2 = 0; uint pm10 = 0; uchar vr=0; uint intrcnt=0; bit F_1HZ; uint voice_time_cnt; uchar Uart_Buf; uchar Rec_Addr=0; uchar mode=0; uchar Rec_Uart=0; uchar Recive_Buf[30]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; #define key P34 #define const_key_time1 50 unsigned char ucKeySec=0; //被触发的按键编号 unsigned int uiKeyTimeCnt1=0; //按键去抖动延时计数器 unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志 unsigned char displaycnt=0; void keyscan() { if(key==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位 { ucKeyLock1=0; //按键自锁标志清零 uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。 } else if(ucKeyLock1==0)//有按键按下,且是第一次被按下 { uiKeyTimeCnt1++; //累加定时中断次数 if(uiKeyTimeCnt1>const_key_time1) { uiKeyTimeCnt1=0; ucKeyLock1=1; //自锁按键置位,避免一直触发 ucKeySec=1; //触发1号键 } } } void keyservice() { if(ucKeySec) { displaycnt=!displaycnt; } ucKeySec=0; } void UartInit(void) //9600bps@12.000MHz { TMOD=0x01; //设置定时器0为工作方式1 TH0=0xf8; //重装初始值(65535-500)=65035=0xfe0b TL0=0x2f; SCON=0x50; TMOD=0X21; IP =0x10; //把串口中断设置为最高优先级, EA=1; ES=1; ET0=1; TR0=1; } void T0_time(void) interrupt 1 //定时中断 { TF0=0; //清除中断标志 TR0=0; //关中断 keyscan(); keyservice(); display();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值