SHT7X、2X使用笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
温湿度传感器SHT7X和SHT2X系列的个人笔记:
官方资料下载:
/download_sd.aspx
1:使用时硬件部分注意:
A:电源端需接100nF或以上退偶电容。
B:DATA、SCK需要接上拉电阻到其正电源端。
C:若走线过长,DATA与SCK之间最好加地线或电源线隔离。
D:MCU不能用带+5V输出的I/O口去直接驱动。MCU需用不带内上拉电阻的集电极输出端或外加+3V转换隔离电路去连接SHT,否则出错或损坏SHT。
E:上电后,需等待至少11ms的时间让SHT进入休眠状态(即等待状态)后再驱动SHT。
2:软件:
A:SHT7X系列和SHT2X系列驱动方式或协议有区别,SHT2X 的D系列是IIC方式,而SHT7X并非标准IIC协议,具体看手册。SHT2X还有SDM比特流、PWM的接口系列,这里我们仅讨论常用的IIC系列。
B:SCK时钟线相对其它数字芯片,运行频率过低。驱动时需按手册上做相应延时。
C:测量命令发出,给充足等待时间,实验时设置>200ms,实验通过之后,再进行多次小幅减小等待时间测试,直到稳定、高速。但测量频率不宜过高,随着测量频率增加,其电能损耗会使自身温度有相
应上升,会影响测量精度。在满足产品要求的前提下尽量延长测量周期,当然并非无限延长,一般控制在1秒钟1~3次的测量为宜,具体测量上限频率按照手册和根据实际要求情况而定。
网站资料有C历程,但过于庞杂,特别是SHT2X系列,没必要每句都读到,大家可以挑着重点分析,主要是通讯过程细节实现和CRC 校验。
3:关于CRC校验:
具体原理大家看相应文献,这里主要强调以下:
A:SHTXX使用CRC8校验,沉余多项式:P(x)=x^8+x^5+x^4+1=100110001=0x131;(手册中多项式不包括最末位1)
B:校验原始数据:SHT7X系列需从开始的地址到命令符直至测量数据全部进行CRC沉余运算;而SHT2X系列只需对测量结果:CRC 码前16位温湿度二进制数据进行CRC沉余运算。
C:CRC添加到信息帧中顺序:SHT7X系列需高低位翻转后即MSB 变为LSB```LSB变为MSB,加到信息帧末尾。而SHT2X系列不需高低位翻转,CRC直接加到信息帧末尾。
4:关于PROTEUS仿真:仿真软件中SHT7X系列CRC并未进行翻转,若翻转CRC校验会报错,跟实际使用不符,这里大家要注意;笔者当初卡这老半天,最后才发现。至于SHT2X——完全没响应!仿真时一直有莫名错误,实际已完全正常,包括CRC,但仿真时仍有错误。主要公司需要保留过程全部资料文档,包括仿真历程,
希望有明了SHT2X仿真问题原因的,告知大家,由于工程有限,笔者不能继续仿真测试,此次工程过后再分析。(使用的版本是:PROTEUS7.10破解非正版,貌似此原因跟非正版没多大关系)
其余补充说明:
在KEIL编译时,例如若定义一个整形变量:unsigned int i,进行/求模运算时:例:22000/320,结果不正确,而改为22000.0/320.0时结果正确。恕笔者才疏学浅,学校时没好好听课,不知此现象具体原因。若定义菲整形如float i,怎么都正确。自己找资料看吧。在此对后面计算编写出错时,有类似现象的作下参考。以下附上SHT71和SHT21完整调试程序,全部全局变量:(使用MAX7219驱动共阴数码管显示)(不含寄存器操作,局部注释)SHT21:
#include
#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={ //共阴数码管:0、1、2、3、4、5、6、7、8、9、-、不显示;0x7e,0x30,0x6d,0x79,
0x33,0x5b,0x5f,0x70,
0x7f,0x7b,0x01,0};
uint i,ii,yyi,crc1;
uchar vv,crc0,imm,error=0;
float TEMP=0,HUMI=0;
sbit DIN=P2^0; //MAX7219接口定义,数据总线
sbit LOAD=P2^1; //MAX7219接口定义,片选位
sbit CLK=P2^2; //MAX7219接口定义,时钟信号端
sbit SCL_sht=P0^0; //SHT21接口定义,时钟信号端
sbit SDA_sht=P0^1; //SHT21接口定义,数据总线
sbit TES=P2^6; //正常一次测量完成信号,低电平有效,外接一LED
sbit ERR=P2^7; //故障位定义,低电平有效,外接一LED;
void MAX7219_init(); //MAX7219初始
void LEE(uint e); //MAX7219子函数,SPI方式
void MM(); //显示数据送往MAX7219
void EEi_sht(); //SHT2x主函数
void SHT2x(uchar yi); //SHT2x子函数
void write_sht(uchar yii); //IIC_WRITE
void read_sht(bit x_ack);
void SAT_sht();
void SOP_sht();
void soft_rest_sht();
void crc_8(); //CRC校验;生成多项式:P(x)=x^8+x^5+x^4+1=100110001=0x131; void delay();
void init();
void main()
{
init();
while(1)
{}
}
void init()
{
MAX7219_init(); //MAX7219初始
TMOD=0x01; //定时器0初始,方式1
EA=1;
ET0=1;
TR0=1;
TH0=0;
TL0=0;
}
void MAX7219_init()
{
LEE(0xff01);
LEE(0xf900);
LEE(0xfa0e); //段电流设定
LEE(0xfb07);
LEE(0xfc01);
LEE(0xff00);
}
void LEE(uint e)
{
uint zz;
LOAD=0;
for(zz=0x8000;zz>0;zz>>=1)