SHT3X 温湿度模块 C51驱动
SHT3X 温湿度模块图示
基于蓝桥C51开发板
驱动使用方法
由于驱动整体上看起来是比较麻烦的,这里我先结合自己的例程给出调用方法,最后面再给出具体的驱动程序。
首先,该模块有四个引脚,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;
//}
版权声明:本文为weixin_45607920原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。