




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
温湿度传感器SHT7X和SHT2X系列的个人笔记:官方资料下载:/download_sd.aspx1:使用时硬件部分注意: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秒钟13次的测量为宜,具体测量上限频率按照手册和根据实际要求情况而定。网站资料有C历程,但过于庞杂,特别是SHT2X系列,没必要每句都读到,大家可以挑着重点分析,主要是通讯过程细节实现和CRC校验。3:关于CRC校验:具体原理大家看相应文献,这里主要强调以下:A:SHTXX使用CRC8校验,沉余多项式:P(x)=x8+x5+x4+1=100110001=0x131;(手册中多项式不包括最末位1)B:校验原始数据:SHT7X系列需从开始的地址到命令符直至测量数据全部进行CRC沉余运算;而SHT2X系列只需对测量结果:CRC码前16位温湿度二进制数据进行CRC沉余运算。C:CRC添加到信息帧中顺序:SHT7X系列需高低位翻转后即MSB变为LSBLSB变为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 charuchar 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=P20; /MAX7219接口定义,数据总线sbit LOAD=P21; /MAX7219接口定义,片选位sbit CLK=P22; /MAX7219接口定义,时钟信号端sbit SCL_sht=P00; /SHT21接口定义,时钟信号端sbit SDA_sht=P01; /SHT21接口定义,数据总线sbit TES=P26; /正常一次测量完成信号,低电平有效,外接一LEDsbit ERR=P27; /故障位定义,低电平有效,外接一LED;void MAX7219_init(); /MAX7219初始void LEE(uint e); /MAX7219子函数,SPI方式void MM(); /显示数据送往MAX7219void EEi_sht(); /SHT2x主函数void SHT2x(uchar yi); /SHT2x子函数void write_sht(uchar yii); /IIC_WRITEvoid read_sht(bit x_ack); void SAT_sht(); void SOP_sht(); void soft_rest_sht();void crc_8(); /CRC校验;生成多项式:P(x)=x8+x5+x4+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;zz0;zz=1) if(zz&e) DIN=1; else DIN=0; _nop_(); CLK=1; CLK=0; LOAD=1; void MM() uint TEMP_,HUMI_; uchar sign_; TEMP_=fabs(TEMP)*10; HUMI_=HUMI*10; if(TEMP=0) sign_=1; else sign_=0; if(!error) if(TEMP=100) LEE(tableTEMP_%10000/1000+0xf100); else LEE(table10+sign_+0xf100); LEE(tableTEMP_%1000/100+0xf200); LEE(tableTEMP_%100/10+0xf300+0x80); /加小数点位 LEE(tableTEMP_%10+0xf400); LEE(tableHUMI_%10000/1000+0xf500); LEE(tableHUMI_%1000/100+0xf600); LEE(tableHUMI_%100/10+0xf700+0x80); /加小数点位 LEE(tableHUMI_%10+0xf800); else LEE(0xf14f); LEE(0xf277); LEE(0xf377); LEE(0xf47e); LEE(0xf501); LEE(0xf601); LEE(0xf701); LEE(0xf801); void EEi_sht() SHT2x(0xe3); /测温 if(crc1!=crc0) if(!(error&0x02) error+=0x01; else yyi&=0xfffc; TEMP=yyi*175.72/0x10000-46.85; SHT2x(0xe5); /测湿 if(crc1!=crc0|!yyi) if(!(error&0x02) error+=0x01; else error&=0x0c; TES=0; yyi&=0xfffc; HUMI=yyi*125.0/0x10000-6; TES=1; void SHT2x(uchar yi) if(error&0x03) /若有错误重新唤醒IIC或软启动SHT21 soft_rest_sht(); else SAT_sht(); write_sht(0x80); write_sht(yi); SAT_sht(); write_sht(0x81); SCL_sht=1; for(ii=0;ii65532;ii+)/限时等待测量完成 delay(); if(SCL_sht) break; if(SCL_sht) yyi=0; read_sht(1); yyi=vv; yyi0;ii=1) if(yii&ii) SDA_sht=1; else SDA_sht=0; delay(); SCL_sht=1; delay(); SCL_sht=0; delay(); SDA_sht=1; delay(); SCL_sht=1; delay(); if(SDA_sht) if(!(error&0x02) error+=0x01; SCL_sht=0;void read_sht(bit x_ack) vv=0; SDA_sht=1; delay(); for(ii=0;ii8;ii+) SCL_sht=1; delay(); vv=1; if(SDA_sht) vv|=1; delay(); SCL_sht=0; delay(); SDA_sht=!x_ack; delay(); SCL_sht=1; delay(); SCL_sht=0; delay(); SDA_sht=1;void SAT_sht() SCL_sht=0; delay(); SDA_sht=1; SCL_sht=1; delay(); SDA_sht=0; delay(); SCL_sht=0; delay();void SOP_sht() SCL_sht=0; delay(); SDA_sht=0; delay(); SCL_sht=1; delay(); SDA_sht=1; delay();void soft_rest_sht() SAT_sht(); SDA_sht=1; SCL_sht=0; delay(); for(ii=0;ii20;ii+) SCL_sht=1; delay(); SCL_sht=0; delay(); if(error&0x02) write_sht(0x80); write_sht(0xfe); SOP_sht(); for(ii=0;ii1000;ii+) delay(); SAT_sht(); error&=0x0c; void crc_8() for(ii=0;ii16;ii+) if(crc1&0x8000) crc1=1; crc1=0x3100; else crc1=8; void delay() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); void E0() interrupt 1 TH0=0xa2;TL0=0;i+;if(i62)/定时12s周期启动SHT21测量“”“”晶振12MHz i=0; EEi_sht();MM();if(!error)ERR=1;else ERR=0; imm+; if(imm200) imm=0; error=0; SHT71:#include#include#include#include#include#define uint unsigned int #define uchar unsigned charuchar 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,any;uchar vv,crc0,crc1,imm,error=0;float TEMP=0,HUMI=0;sbit DIN=P20; /MAX7219接口定义,数据总线sbit LOAD=P21; /MAX7219接口定义,片选位sbit CLK=P22; /MAX7219接口定义,时钟信号端sbit SCL_sht=P00; /SHT21接口定义,时钟信号端sbit SDA_sht=P01; /SHT21接口定义,数据总线sbit TES=P26; /正常一次测量完成信号,低电平有效,外接一LEDsbit ERR=P27; /故障位定义,低电平有效,外接一LED;void MAX7219_init(); /MAX7219初始void LEE(uint e); /MAX7219子函数,SPI方式void MM(); /显示数据送往MAX7219void EEi_sht7x(); /SHT7x主函数void SHT7x(uchar yi); /SHT7x子函数void write_sht7x(uchar y); void read_sht7x(bit x_ack); void SAT_sht7x(); void soft_rest_sht7x();void crc_8(); /CRC校验;生成多项式:P(x)=x8+x5+x4+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;zz0;zz=1) if(zz&e) DIN=1; else DIN=0; _nop_(); CLK=1; CLK=0; LOAD=1; void MM() uint TEMP_,HUMI_; uchar sign_; TEMP_=fabs(TEMP)*10; HUMI_=HUMI*10; if(TEMP=0) sign_=1; else sign_=0; if(!error) if(TEMP=100) LEE(tableTEMP_%10000/1000+0xf100); else LEE(table10+sign_+0xf100); LEE(tableTEMP_%1000/100+0xf200); LEE(tableTEMP_%100/10+0xf300+0x80); /加小数点位 LEE(tableTEMP_%10+0xf400); LEE(tableHUMI_%10000/1000+0xf500); LEE(tableHUMI_%1000/100+0xf600); LEE(tableHUMI_%100/10+0xf700+0x80); /加小数点位 LEE(tableHUMI_%10+0xf800); else LEE(0xf14f); LEE(0xf277); LEE(0xf377); LEE(0xf47e); LEE(0xf501); LEE(0xf601); LEE(0xf701); LEE(0xf801); void EEi_sht7x() SHT7x(0x03); /测温 if(crc1!=crc0) if(!(error&0x08) error+=0x04; else any&=0x3fff; TEMP=any*0.01-39.65; /*/ SHT7x(0x05); /测湿 if(crc1!=crc0|!any) if(!(error&0x08) error+=0x04; else error&=0x03; TES=0; any&=0x0fff; HUMI=0.0367*any-2.0468-0.0000015955*any*any; HUMI+=(TEMP-25)*(0.01+0.00008*any); if(HUMI99.90|HUMI0) /相对湿度大于99.9%或为负数,需将其强制为100% HUMI=100.00; TES=1; void SHT7x(uchar yi) if(error&0x0c) soft_rest_sht7x(); else SAT_sht7x(); write_sht7x(yi); for(ii=0;ii65532;ii+) delay(); if(!SDA_sht) break; if(!SDA_sht) any=0; read_sht7x(1); any=vv; any=8; crc1=0; crc1=yi; crc_8(); crc1=vv; crc_8(); read_sht7x(1); any+=vv; crc1=vv; crc_8(); read_sht7x(0); crc0=0; for(ii=1;ii0xe0;ii=1) /crc校验值高低位翻转 crc00;ii=1) if(y&ii) SDA_sht=1; else SDA_sht=0; delay(); SCL_sht=1; delay(); SCL_sht=0; delay(); SDA_sht=1; delay(); SCL_sht=1; delay(); if(SDA_sht) if(!(error&0x08) error+=0x04; SCL_sht=0;void read_sht7x(bit x_ack) vv=0; SDA_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省清远市连州市2023-2024学年五年级下学期数学期末监测试卷(含答案)
- 仲秋促销活动方案
- 企业之星活动方案
- 企业传承活动方案
- 企业公司员工活动方案
- 企业参展活动方案
- 企业回访活动方案
- 企业外联活动方案
- 企业宣讲双选会活动方案
- 企业年末贺岁活动方案
- 血液透析患者饮食指导
- 脱硫塔玻璃鳞片胶泥衬里施工组织设计
- XB/T 505-2011汽油车排气净化催化剂载体
- GB/T 3672.2-2002橡胶制品的公差第2部分:几何公差
- GB/T 27744-2021异步起动永磁同步电动机技术条件及能效分级(机座号80~355)
- GB 8076-2008混凝土外加剂
- 宝盾转门故障代码
- 【课件】草原上的小木屋
- DB63-T 241-2021草地毒害草综合治理技术规范
- 高层建筑施工基坑工程勘察及支护结构选型培训
- 四年级上册音乐课件-活动 欢腾的那达慕 人教版(简谱) (共17张PPT)
评论
0/150
提交评论