SHT3X 温湿度模块 C51驱动 ——简单调用获取温湿度信息

SHT3X 温湿度模块图示

在这里插入图片描述

基于蓝桥C51开发板

CT107D单片机综合训练平台

驱动使用方法

由于驱动整体上看起来是比较麻烦的,这里我先结合自己的例程给出调用方法,最后面再给出具体的驱动程序。

首先,该模块有四个引脚,VCC、GND、SDA、SCL,如下图所示:
芯片引脚示例
于是,在SHT3X.h文件 9、10行找到

sbit SDA = P2^3;  /* 数据线 */
sbit SCL = P2^2;  /* 时钟线 */

在这里更改你的iic引脚,再接上VCC、GND,芯片的引脚就接好了啦。

将驱动放进工程后,主函数声明 SHT3X.h 文件,然后直接用 初始化函数 和 获得信息函数 就可以实现基本的功能啦。

SHT3XInit();  // 初始化 SHT3X芯片
SHT3X_XHGetTempAndHumi(int        *temp, int         *humi);  //获得信息函数

再加上显示功能,就大功告成!

#include "main.h"   //开发板头文件
#include "nixie.h"  //数码管函数
#include "SHT3X.H"   //SHT3X 头文件


int x = 0,y = 0;

int *wendu;   //温度
int *shidu;   //湿度

uchar temp;

void main()
{
	Init_common();   //开发板初始化
	SHT3XInit();   // 初始化 SHT3X芯片
	
	wendu = &x;
	shidu = &y;
	while(1)
	{
		
		SHT3X_XHGetTempAndHumi(wendu,shidu);   //获得信息函数
		nixie(x/100,x%100/10 + 12,x%10,11,11,y/100,y%100/10 + 12,y%10);   //温度 -- 湿度
		
	}
}

最后贴图一张:

最后贴图温度 25.4℃ ,湿度 44.8%RH ,OK,【剪刀手】!!!

—— 注意由函数直接获取的数据要除以10把小数分出来哟!
以下是nixie数码管显示函数

#ifndef _NIXIE_H
#define _NIXIE_H

//* 数码管显示函数

#include "common.h"

void nixie(uchar d0,d1,d2,d3,d4,d5,d6,d7);   //数码管函数

//void Delay1ms();

#endif
#include "nixie.h"  //数码管函数


uchar code w[22]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf, //0,1,2,3,4,5,6,7,8,9,熄灭,-
                   0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  //   小数点+12,即0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
uchar code q[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选
uchar nixie_read[8]={0,1,2,3,4,5,6,7};
uchar nixie_i;




void nixie(uchar d0,d1,d2,d3,d4,d5,d6,d7)
{
	nixie_read[0]=d0;
	nixie_read[1]=d1;
	nixie_read[2]=d2;
	nixie_read[3]=d3;
	nixie_read[4]=d4;
	nixie_read[5]=d5;
	nixie_read[6]=d6;
	nixie_read[7]=d7;
	
	for(nixie_i=0;nixie_i<8;nixie_i++)
	{
		Y6;P0=q[nixie_i];
		Y7;P0=w[nixie_read[nixie_i]];
		Delay1ms();
		P0=0xff;
	}
}

以下是驱动文件,直接拷贝即可使用。

不要看他多,按我说的调用就贼容易。我看CSDN上这样类似的芯片51驱动资源不好找,网上找资源做出来后特意发一个出来,补全一下哈哈哈。

C51驱动

SHT3X.h 文件

#ifndef __SHT3X_H_
#define __SHT3X_H_

#include "STC15F2K60S2.H"


sbit SDA = P2^3;  /* 数据线 */
sbit SCL = P2^2;  /* 时钟线 */


// Error codes
typedef enum{
  NO_ERROR       = 0x00, // no error
  ACK_ERROR      = 0x01, // no acknowledgment error
  CHECKSUM_ERROR = 0x02, // checksum mismatch error
  TIMEOUT_ERROR  = 0x04, // timeout error
  PARM_ERROR     = 0x80, // parameter out of range error
}etError;

//-- Enumerations --------------------------------------------------------------
// Sensor Commands
typedef enum{
  CMD_READ_SERIALNBR  = 0x3780, // read serial number
  CMD_READ_STATUS     = 0xF32D, // read status register
	CMD_CLEAR_STATUS    = 0x3041, // clear status register
	CMD_HEATER_ENABLE   = 0x306D, // enabled heater
	CMD_HEATER_DISABLE  = 0x3066, // disable heater
  CMD_SOFT_RESET      = 0x30A2, // soft reset
	CMD_MEAS_CLOCKSTR_H = 0x2C06, // meas. clock stretching, high rep.
	CMD_MEAS_CLOCKSTR_M = 0x2C0D, // meas. clock stretching, medium rep.
	CMD_MEAS_CLOCKSTR_L = 0x2C10, // meas. clock stretching, low rep.
	CMD_MEAS_POLLING_H  = 0x2400, // meas. no clock stretching, high rep.
	CMD_MEAS_POLLING_M  = 0x240B, // meas. no clock stretching, medium rep.
	CMD_MEAS_POLLING_L  = 0x2416, // meas. no clock stretching, low rep.
	CMD_MEAS_PERI_05_H  = 0x2032, // meas. periodic 0.5 mps, high rep.
	CMD_MEAS_PERI_05_M  = 0x2024, // meas. periodic 0.5 mps, medium rep.
	CMD_MEAS_PERI_05_L  = 0x202F, // meas. periodic 0.5 mps, low rep.
	CMD_MEAS_PERI_1_H   = 0x2130, // meas. periodic 1 mps, high rep.
	CMD_MEAS_PERI_1_M   = 0x2126, // meas. periodic 1 mps, medium rep.
	CMD_MEAS_PERI_1_L   = 0x212D, // meas. periodic 1 mps, low rep.
	CMD_MEAS_PERI_2_H   = 0x2236, // meas. periodic 2 mps, high rep.
	CMD_MEAS_PERI_2_M   = 0x2220, // meas. periodic 2 mps, medium rep.
	CMD_MEAS_PERI_2_L   = 0x222B, // meas. periodic 2 mps, low rep.
	CMD_MEAS_PERI_4_H   = 0x2334, // meas. periodic 4 mps, high rep.
	CMD_MEAS_PERI_4_M   = 0x2322, // meas. periodic 4 mps, medium rep.
	CMD_MEAS_PERI_4_L   = 0x2329, // meas. periodic 4 mps, low rep.
	CMD_MEAS_PERI_10_H  = 0x2737, // meas. periodic 10 mps, high rep.
	CMD_MEAS_PERI_10_M  = 0x2721, // meas. periodic 10 mps, medium rep.
	CMD_MEAS_PERI_10_L  = 0x272A, // meas. periodic 10 mps, low rep.
	CMD_FETCH_DATA      = 0xE000, // readout measurements for periodic mode
	CMD_R_AL_LIM_LS     = 0xE102, // read alert limits, low set
	CMD_R_AL_LIM_LC     = 0xE109, // read alert limits, low clear
	CMD_R_AL_LIM_HS     = 0xE11F, // read alert limits, high set
	CMD_R_AL_LIM_HC     = 0xE114, // read alert limits, high clear
	CMD_W_AL_LIM_LS     = 0x6100, // write alert limits, low set
	CMD_W_AL_LIM_LC     = 0x610B, // write alert limits, low clear
	CMD_W_AL_LIM_HS     = 0x611D, // write alert limits, high set
	CMD_W_AL_LIM_HC     = 0x6116, // write alert limits, high clear
  CMD_NO_SLEEP        = 0x303E,
}etCommands;

typedef enum{
	REPEATAB_HIGH,   // high repeatability
	REPEATAB_MEDIUM, // medium repeatability
	REPEATAB_LOW,    // low repeatability
}etRepeatab;

typedef enum{
	MODE_CLKSTRETCH, // clock stretching
	MODE_POLLING,    // polling
}etMode;

typedef enum{
	FREQUENCY_HZ5,  //  0.5 measurements per seconds
	FREQUENCY_1HZ,  //  1.0 measurements per seconds
	FREQUENCY_2HZ,  //  2.0 measurements per seconds
	FREQUENCY_4HZ,  //  4.0 measurements per seconds
	FREQUENCY_10HZ, // 10.0 measurements per seconds
}etFrequency;
/*================================================================*/
#define SHT3XADDR 0x44                 //SHT3X的I2C地址
#define SHT3XWriteHeader SHT3XADDR<<1
#define SHT3XReadHeader  SHT3XWriteHeader|0x01

/*================================================================
【名 称】
【功 能】应答位电平定义
【备 注】
【作 者】
【时 间】2010年8月18日11:24:09
================================================================*/
#define ACK	0
#define NACK	1 


extern void SHT3XInit(void);
//extern etError SHT3X_GetTempAndHumi(int        *temp,
//                                     int         *humi,
//                                     etRepeatab repeatab,
//                                     unsigned char        timeout);
extern etError SHT3X_XHGetTempAndHumi(int        *temp,
                                       int         *humi);
#endif

SHT3X.c 文件

#include "SHT3X.H"

/*================================================================
【名 称】
【功 能】模拟IIC使用的引脚定义,注意要上拉电阻
【备 注】
【作 者】
【时 间】
================================================================*/
//sbit SDA=P3^3;  //大板子引脚定义
//sbit SCL=P5^4;

#define POLYNOMIAL  0x31 // P(x) = x^8 + x^5 + x^4 + 1 = 00110001

//==============================================================================
unsigned char SHT3X_CalcCrc(unsigned char *crcdata, unsigned char nbrOfBytes){
//==============================================================================
	unsigned char Bit;        // bit mask
  unsigned char crc = 0xFF; // calculated checksum
  unsigned char byteCtr;    // byte counter
  
  // calculates 8-Bit checksum with given polynomial 
  for(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++)
  {
    crc ^= (crcdata[byteCtr]);
    for(Bit = 8; Bit > 0; --Bit)
    {
      if(crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
      else           crc = (crc << 1);
    }
  }
	return crc;
}
///*================================================================
//【名 称】void Delay(unsigned int t)
//【功 能】延时长
//【备 注】
//【作 者】
//【时 间】
//================================================================*/
//void Delay(unsigned int t)
//{
//	unsigned char i;
//	while(t--)
//	{
//		for(i=0;i<200;i++);
//	}					   
//}
//void Delay1ms()		//@24.000MHz
//{
//	unsigned char i, j;

//	i = 24;
//	j = 85;
//	do
//	{
//		while (--j);
//	} while (--i);
//}

//***********************以下是模拟I2C函数****************************//
/*================================================================
【名 称】void I2CDelay (unsigned char t)
【功 能】模拟IIC用的短延时
【备 注】
【作 者】
【时 间】
================================================================*/
void I2CDelay (unsigned char t)
{
	while(t--);
}
/*================================================================
【名 称】void I2CInit(void)
【功 能】I2C初始化,空闲状态
【备 注】
【作 者】
【时 间】
================================================================*/
void I2CInit(void)
{
	SDA = 1; 
	SCL = 1;
}
/*================================================================
【名 称】void I2CStart(void)
【功 能】I2C起始信号
【备 注】SCL、SDA同为高,SDA跳变成低之后,SCL跳变成低
【作 者】
【时 间】
================================================================*/
void I2CStart(void)
{
  	SDA = 1;
  	SCL = 1;
  	I2CDelay(10);
  	SDA = 0;
  	I2CDelay(20);
  	SCL = 0;
  	I2CDelay(20);
}
/*================================================================
【名 称】void I2CStop(void)
【功 能】I2C停止信号
【备 注】SCL、SDA同为低,SCL跳变成高之后,SDA跳变成高
【作 者】
【时 间】
================================================================*/
void I2CStop(void)
{
  	SDA = 0;
  	SCL = 0;
	  I2CDelay(10);
  	SCL = 1;
  	I2CDelay(10);
  	SDA = 1;
  	I2CDelay(10);
}
/*================================================================
【名 称】unsigned char I2CWRByte(unsigned char WRByte)
【功 能】I2C写一个字节数据,返回ACK或者NACK
【备 注】从高到低,依次发送
【作 者】
【时 间】
================================================================*/
etError I2CWRByte(unsigned char WRByte)
{
	unsigned char i;
	SCL = 0;
	for(i=0;i<8;i++)
	{
		if(WRByte&0x80)
		{
			SDA = 1;	
		}
		else
		{
			SDA = 0;
		}
		I2CDelay(10);
		SCL=1;			//输出SDA稳定后,拉高SCL给出上升沿,从机检测到后进行数据采样
		I2CDelay(50);
		SCL=0;
		I2CDelay(10);
		WRByte <<= 1;
	} 
	SDA = 1;
	SCL = 1;
	I2CDelay(20);
	if(SDA==1)			//SDA为高,收到NACK
	{
		SCL=0;
		I2CDelay(50);
		return ACK_ERROR;	
	}
	else 				//SDA为低,收到ACK
	{
		SCL=0;
		I2CDelay(50);
		return NO_ERROR;
	}
}
/*================================================================
【名 称】unsigned char I2CRDByte(unsigned char AckValue)
【功 能】I2C读一个字节数据,入口参数用于控制应答状态,ACK或者NACK
【备 注】从高到低,依次接收
【作 者】
【时 间】
================================================================*/
unsigned char I2CRDByte(unsigned char AckValue)
{
	unsigned char i,RDByte=0;
	SCL = 0;
	SDA = 1;			//释放总线	
	for (i=0;i<8;i++) 
	{
		RDByte <<= 1;	//移位
		SCL = 1;		//给出上升沿
		I2CDelay(30);	//延时等待信号稳定
		if(SDA==1) 		//采样获取数据
		{
			RDByte |= 0x01;
		}
		else
		{
			RDByte &= 0xfe;
		}
		SCL = 0;   		//下降沿,从机给出下一位值
		I2CDelay(10);
	}   
	SDA =  AckValue;	//应答状态
	I2CDelay(10);
	SCL = 1;                         
  	I2CDelay(50);          
  	SCL = 0;
  	SDA = 1;                
  	I2CDelay(1);
	return RDByte;
}
etError SHT3X_WriteCommand(etCommands cmd){
//==============================================================================
  etError error; // error code
  // write the upper 8 bits of the command to the sensor
  error  = I2CWRByte(cmd >> 8);
  // write the lower 8 bits of the command to the sensor
  error |= I2CWRByte(cmd & 0xFF);
	
  return error;
}
/*================================================================
【名 称】void SHT3XInit(void)
【功 能】SHT3X初始化函数,主函数中调用
【备 注】
【作 者】
【时 间】
================================================================*/
void SHT3XInit(void)
{

	I2CInit();//I2C初始化
//	I2CStart();
//  I2CWRByte(SHT3XWriteHeader);
//	SHT3X_WriteCommand(CMD_CLEAR_STATUS); //
//	I2CStop();
//	
	
  I2CStart();
  I2CWRByte(SHT3XWriteHeader);
	SHT3X_WriteCommand(CMD_MEAS_PERI_1_H); //1秒高精度循环测量模式
	I2CStop();
	
	
}




//==============================================================================循环读取模式
etError SHT3X_XHGetTempAndHumi(int        *temp,
                               int        *humi){
//==============================================================================
  etError error;           // error code
  unsigned long int    rawValueTemp;    // temperature raw value from sensor
  unsigned long int    rawValueHumi;    // humidity raw value from sensor
	unsigned char Rdata[6]={0};
  unsigned char i;																			 
  I2CStart();
  error  = I2CWRByte(SHT3XWriteHeader);
  // if no error ...
  if(error == NO_ERROR)
  {
    // start measurement in polling mode
    // use depending on the required repeatability, the corresponding command
     error = SHT3X_WriteCommand(CMD_FETCH_DATA);
  }
  // if no error, wait until measurement ready
  if(error == NO_ERROR)
  {
	 	I2CStart();
     error = I2CWRByte(SHT3XReadHeader);
      // if measurement has finished -> exit loop
  }
	// if no error, read temperature and humidity raw values
  if(error == NO_ERROR)
  {
		for(i=0;i<5;i++)
		{
			Rdata[i] = I2CRDByte(ACK);
		}
    Rdata[i] = I2CRDByte(NACK);
		I2CStop();
		if(Rdata[2]!=SHT3X_CalcCrc(Rdata,2))     error = CHECKSUM_ERROR;
	  if(Rdata[5]!=SHT3X_CalcCrc(&Rdata[3],2)) error = CHECKSUM_ERROR;	
  }
  // if no error, calculate temperature in  and humidity in %RH
  if(error == NO_ERROR)
  {
		rawValueTemp =(Rdata[0] << 8) | Rdata[1];
		rawValueHumi =(Rdata[3] << 8) | Rdata[4];
    *temp =(int)(1750 *rawValueTemp / 65535 - 450);        //  --温度真实值 * 10
    *humi =(int)(1000 *rawValueHumi / 65535);              //  --湿度真实值 * 10
  }
  return error;
}






==============================================================================  单次读取模式
//etError SHT3X_GetTempAndHumi(int        *temp,
//                                     int         *humi,
//                                     etRepeatab repeatab,
//                                     unsigned char   timeout){
==============================================================================
//  etError error;           // error code
//  unsigned long int    rawValueTemp;    // temperature raw value from sensor
//  unsigned long int    rawValueHumi;    // humidity raw value from sensor
//	unsigned char Rdata[6]={0};
//  unsigned char i;																			 
//  I2CStart();
//  error  = I2CWRByte(SHT3XWriteHeader);

//  // if no error ...
//  if(error == NO_ERROR)
//  {
//    // start measurement in polling mode
//    // use depending on the required repeatability, the corresponding command
//    switch(repeatab)
//    {
//      case REPEATAB_LOW:    error = SHT3X_WriteCommand(CMD_MEAS_POLLING_L); break;
//      case REPEATAB_MEDIUM: error = SHT3X_WriteCommand(CMD_MEAS_POLLING_M); break;
//      case REPEATAB_HIGH:		 error = SHT3X_WriteCommand(CMD_MEAS_POLLING_H); break;
//      default:         		 error = PARM_ERROR; break;
//    }
//  }
//	
//	
//  
//  // if no error, wait until measurement ready
//  if(error == NO_ERROR)
//  {
//    // poll every 1ms for measurement ready until timeout
//    while(timeout--)
//    {
//      // check if the measurement has finished
//			I2CStop();
//			
//			I2CStart();
//      error = I2CWRByte(SHT3XReadHeader);

//      // if measurement has finished -> exit loop
//      if(error == NO_ERROR) break;

//      // delay 1ms
//      Delay1ms();
//    }
//		 
//		// check for timeout error
//		if(timeout == 0) error = TIMEOUT_ERROR;
//  }
//	
//	// if no error, read temperature and humidity raw values
//  if(error == NO_ERROR)
//  {
//		for(i=0;i<5;i++)
//		{
//			Rdata[i] = I2CRDByte(ACK);
//		}
//    Rdata[i] = I2CRDByte(NACK);
//		I2CStop();
//		if(Rdata[2]!=SHT3X_CalcCrc(Rdata,2))     error = CHECKSUM_ERROR;
//	  if(Rdata[5]!=SHT3X_CalcCrc(&Rdata[3],2)) error = CHECKSUM_ERROR;	
//  }
//  // if no error, calculate temperature in  and humidity in %RH
//  if(error == NO_ERROR)
//  {
//		rawValueTemp =(Rdata[0] << 8) | Rdata[1];
//		rawValueHumi =(Rdata[3] << 8) | Rdata[4];
//    *temp =(int)( 1750 *rawValueTemp / 65535 - 450);
//    *humi =(int)(1000 *rawValueHumi / 65535);
//  }
//  return error;
//}
  • 18
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
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();

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值