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
因篇幅问题不能全部显示,请点此查看更多更全内容