您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页SHT11驱动程序

SHT11驱动程序

来源:尚车旅游网


SHT11驱动程序 D

====== 字节传送函数

=========================================*/

uchar write_byte(uchar value) {

uchar i,error=0;

for(i=0x80;i>0;i/=2) //高位先传送 {

if(i & value)DQ=1; //循环相与,结果即为要发送的位 else DQ=0; SCK=1; NOP(); NOP(); NOP(); SCK=0; }

DQ=1; //释放总线 SCK=1;

if(DQ==1) error=1; //检查应答,确认通讯正常 SCK=0;

return error; //error=1,通讯有误 }

/*========================================= 读数据函数

=========================================*/

uchar read_byte(uchar dat) {

uchar i,val=0; DQ=1;

for(i=0x80;i>0;i/=2) { SCK=1;

if(DQ) val=(val | i); SCK=0; } DQ=dat; SCK=1; NOP(); NOP(); NOP();

SCK=0; DQ=1; return val; }

/*========================================= 复位函数

=========================================*/ void reset_SHT() { uchar i; DQ=1; SCK=0;

for(i=0;i<9;i++) //DATA保持高电平,SCK时钟出发9次复位 { SCK=1; NOP(); SCK=0; }

init_SHT();

}

/*=========================================

发送指令到SHT11执行温度和湿度的测量转换 =========================================*/

convert_SHT(SHT_dat *s,uchar mode) {

uchar i,ack=0;

uchar valueM,valueL,checksum; float com; do{reset_SHT(); switch(mode){

case TEMP: ack=write_byte(0x03);break; case HUMI: ack=write_byte(0x05);break; default: break;} }while(ack==1);

for(i=0;i<65535;i++) //等待测量结束 {

if(DQ==0)break;

} //若长时间数据线DQ没拉低,则说明测量有错误

valueM=read_byte(0); //数据的高字节 valueL=read_byte(0); //数据的低字节 checksum=read_byte(1); //CRC校验码 com=(float)valueM*256+(float)valueL; if(mode==TEMP) {

s->temperature=com; s->crc_temp=(float)checksum; }

if(mode==HUMI) {

s->humidity=com;

s->crc_humi=(float)checksum; } }

/*=========================================

温度和湿度补偿及输出温度值和相对湿度值 =========================================*/

void caculation_SHT(SHT_dat *s) {

const float c1=-4.0; const float c2=+0.0405;

const float c3=-0.0000028; //以上为12位湿度修正公示取值 const float t1=+0.01;

const float t2=+0.00008; //以上为14位温度修正公示取值

float t=s->temperature; float rh=s->humidity; float rh_lin; float rh_ture; float t_c;

t_c=t * 0.01 - 40; //温度的补偿

rh_lin=c3*rh*rh + c2*rh + c1; //相对湿度非线性补偿

rh_ture=( t_c - 25 ) * ( t1 + t2*rh ) + rh_lin; //相对湿度对于温度依赖性补偿

if( rh_ture > 100 ) rh_ture=100; //相对湿度最大值修正

if( rh_ture < 0.1 ) rh_ture=0.1; //相对湿度最小值修正 if(t_c<0)t_c=0;

s->temperature=t_c; //保存温度补偿后的结果 s->humidity=rh_ture; //保存相对湿度补偿后的结果 }

/*========================================= 计算绝对湿度值

=========================================

float calc_dewpoint(float h,float t) {

float logEx,dew_point;

logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2); dew_point return dew_point; }

/*========================================= 浮点数数据处理

=========================================*/

=

(logEx

-

0.66077)*237.3/(0.66077+7.5-logEx);

void float_convert(SHT_dat *s) { float com; uint dat;

com=s->temperature; com*=100; dat=(uint)com;

s->num_temp[0]=dat/1000+0x30; //十位 s->num_temp[1]=dat%1000/100+0x30; //个位 s->num_temp[2]=0x2e;

s->num_temp[3]=dat%100/10+0x30; //小数点第一位

s->num_temp[4]=dat%10+0x30; //小数点第二位 com=s->humidity; com*=100; dat=(uint)com;

s->num_humi[0]=dat/1000+0x30; //十位 s->num_humi[1]=dat%1000/100+0x30; //个位 s->num_humi[2]=0x2e;

s->num_humi[3]=dat%100/10+0x30; //小数点第一位

s->num_humi[4]=dat%10+0x30; //小数点第二

位 } #endif

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sceh.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务