版主
主题
回帖0
积分39546
阅读权限200
注册时间2011-5-6
最后登录1970-1-1
在线时间 小时
|
本帖最后由 sdf15937 于 2012-3-20 22:07 编辑
关于SHT11湿度计的51程序
keil提示是warningL16:uncaller segment ,ignored for overlay process
segment:?PR?_WRITE_SHT11?WENJ
仿真的结果是有规律的乱跳
读数都是不准确的
/*******************温湿度计驱动***************/
void Start_SHT11(uchar com)
{
uchar i;
SHT_DAT=1;
SHT_SCK=0;
for(i=0;i<12;i++)
{
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
SHT_DAT=1;
SHT_SCK=1;
_nop_();
SHT_DAT=0;
_nop_();
SHT_SCK=0;
_nop_();
SHT_SCK=1;
_nop_();
SHT_DAT=1;
_nop_();
SHT_SCK=0;
for(i=0;i<8;i++)
{
SHT_DAT=(bit)(com&0x80);
com<<=1;
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
SHT_DAT=1;
_nop_();
_nop_();
i=200;
do{
_nop_();
_nop_();
i-=1;
}while((SHT_DAT==1)&&(i!=0));
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
void Write_SHT11(uchar com)
{
uchar i,j;
SHT_DAT=1;
SHT_SCK=0;
for(i=0;i<12;i++)
{
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
SHT_DAT=1;
SHT_SCK=1;
_nop_();
SHT_DAT=0;
_nop_();
SHT_SCK=0;
_nop_();
SHT_SCK=1;
_nop_();
SHT_DAT=1;
_nop_();
SHT_SCK=0;
j=0x06;
for(i=0;i<8;i++)
{
SHT_DAT=(bit)(j&0x80);
com<<=1;
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
SHT_DAT=1;
_nop_();
_nop_();
i=200;
do{
_nop_();
_nop_();
i-=1;
}while((SHT_DAT==1)&&(i!=0));
SHT_SCK=1;
_nop_();
SHT_SCK=0;
for(i=0;i<8;i++)
{
SHT_DAT=(bit)(com&0x80);
com<<=1;
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
SHT_DAT=1;
_nop_();
_nop_();
i=200;
do{
_nop_();
_nop_();
i-=1;
}while((SHT_DAT==1)&&(i!=0));
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
uint Read_SHT11(void)
{
uchar i;
uchar j;
uint k;
if(SHT_DAT==0)
{
k=0;
j=0;
for(i=0;i<8;i++)
{
j<<=1;
j|=(uchar)SHT_DAT;
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
SHT_DAT=0;
_nop_();
SHT_SCK=1;
_nop_();
SHT_SCK=0;
k=j;
k*=256;
j=0;
for(i=0;i<8;i++)
{
j<<=1;
j|=(uchar)SHT_DAT;
SHT_SCK=1;
_nop_();
SHT_SCK=0;
}
SHT_DAT=1;
_nop_();
SHT_SCK=1;
_nop_();
SHT_SCK=0;
k|=j;
return(k);
}
else
{
return(0xf000);
}
}
温湿度计算与显示
old_sec=Read1302(0x81)%16; //湿度显示
if((old_sec&0x01)==0)
{
flag=0x03; //偶数秒启动温度采集转换
}
else
{
flag=0x05; //奇数秒启动湿度采集转换
}
Start_SHT11(flag);
temp=Read_SHT11();
if(tempsht!=0xf000)
{ //采集成功,可以读
if(flag==0x03)
{ //如下进行温度计算,并显示XX.X
f_temp=0.01;
f_temp*=tempsht;
f_temp-=40;
f_temp*=10;
tempsht=(uint)f_temp;
LCD1602_write_char(20,0,tempsht/100+0x30); //温度显示10位
LCD1602_write_data((tempsht%100)/10+0x30);
LCD1602_write_data(0x2E);
LCD1602_write_data((tempsht%100)%10+0x30);
LCD1602_write_data(3);
}
else
{ //如下进行湿度计算,并显示XX.X
f_temp=(float)tempsht;
f_temp*=(float)tempsht;
f_temp*=-2.8e-6;
f_temp+=((float)tempsht*0.045);
f_temp-=4;
f_temp*=10;
tempsht=(uint)f_temp;
LCD1602_write_char(28,0,tempsht/100+0x30); //湿度显示 1
LCD1602_write_data((tempsht%100)/10+0x30);
LCD1602_write_data(0x2E);
LCD1602_write_data((tempsht%100)%10+0x30);
LCD1602_write_data('%');
}
} |
|