51温度湿度c语言代码解读Word文档下载推荐.docx
《51温度湿度c语言代码解读Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《51温度湿度c语言代码解读Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
![51温度湿度c语言代码解读Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/22/e81ac9f3-f0cb-4814-84f5-a2d3621feed8/e81ac9f3-f0cb-4814-84f5-a2d3621feed81.gif)
00:
00"
;
ucharcodetable2[]="
00RH:
00.0"
sbitshui1=P1^0;
sbitshui2=P1^1;
sbitshi_s1=P1^2;
sbitshi_s2=P1^3;
sbitshi_s3=P1^4;
sbitled=P1^6;
sbitsound=P1^7;
sbitlcden=P2^2;
sbitlcdrw=P2^1;
sbitlcdrs=P2^0;
sbitrelay=P2^3;
sbits1=P2^7;
uchardatadisdata[4];
ucharnum,count,s1num;
charshi,fen,miao,shi1,fen1,miao1;
uintbian,i,j;
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
//SHT11程序(SHT11.c):
#definenoACK0//继续传输数据,用于判断是否结束通讯
#defineACK1//结束数据传输;
//地址命令读/写
#defineSTATUS_REG_W0x06//00000110
#defineSTATUS_REG_R0x07//00000111
#defineMEASURE_TEMP0x03//00000011
#defineMEASURE_HUMI0x05//00000101
#defineRESET0x1e//00011110
//写字节程序
chars_write_byte(unsignedcharvalue)
{
unsignedchari,error=0;
for(i=0x80;
i>
>
=1)//高位为1,循环右移
{
if(i&
value)DATA=1;
//和要发送的数相与,结果为发送的位
elseDATA=0;
SCK=1;
_nop_();
_nop_();
//延时3us
SCK=0;
}
DATA=1;
//释放数据线
SCK=1;
error=DATA;
//检查应答信号,确认通讯正常
_nop_();
SCK=0;
returnerror;
//error=1通讯错误
//读字节程序
chars_read_byte(unsignedcharack)
unsignedchari,val=0;
for(i=0x80;
if(DATA)val=(val|i);
//读一位数据线的值
DATA=!
ack;
//如果是校验,读取完后结束通讯;
returnval;
//启动传输
voids_transstart(void)
DATA=1;
DATA=0;
voids_connectionreset(void)
unsignedchari;
//准备
for(i=0;
i<
9;
i++)//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
s_transstart();
//启动传输
}
//温湿度测量
chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode)
//进行温度或者湿度转换,由参数mode决定转换内容;
unsignederror=0;
unsignedinti;
switch(mode)//选择发送命令
caseTEMP:
error+=s_write_byte(MEASURE_TEMP);
break;
//测量温度
caseHUMI:
error+=s_write_byte(MEASURE_HUMI);
//测量湿度
default:
for(i=0;
65535;
i++)if(DATA==0)break;
//等待测量结束
if(DATA)error+=1;
//如果长时间数据线没有拉低,说明测量错误
*(p_value)=s_read_byte(ACK);
//读第一个字节,高字节(MSB)
*(p_value+1)=s_read_byte(ACK);
//读第二个字节,低字节(LSB)
*p_checksum=s_read_byte(noACK);
//readCRC校验码
//error=1通讯错误
//温湿度值标度变换及温度补偿
voidcalc_sth10(float*p_humidity,float*p_temperature)
constfloatC1=-4.0;
//12位湿度精度修正公式
constfloatC2=+0.0405;
constfloatC3=-0.0000028;
constfloatT1=0.46;
//14位温度精度5V条件修正公式
constfloatT2=+0.00008;
floatrh=*p_humidity;
//rh:
12位湿度
floatt=*p_temperature;
//t:
14位温度
floatrh_lin;
//rh_lin:
湿度linear值
floatrh_true;
//rh_true:
湿度ture值
floatt_C;
//t_C:
温度℃
t_C=t*0.01-40;
//补偿温度
rh_lin=C3*rh*rh+C2*rh+C1;
//相对湿度非线性补偿
rh_true=(t_C-33)*(T1+T2*rh)+rh_lin;
//相对湿度对于温度依赖性补偿
if(rh_true>
100)rh_true=100;
//湿度最大修正
if(rh_true<
0.1)rh_true=0.1;
//湿度最小修正
*p_temperature=t_C;
//返回温度结果
*p_humidity=rh_true;
//返回湿度结果
//从相对温度和湿度计算露点
floatcalc_dewpoint(floath,floatt)
floatlogEx,dew_point;
logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
dew_point=(0.66077-logEx)*237.3/(logEx-8.16077);
returndew_point;
}
typedefunion//定义共用同类型
{
floatf;
}value;
voidwrite_com(ucharcom)//lcd部分
lcdrs=0;
lcdrw=0;
delay(5);
lcden=1;
P0=com;
lcden=0;
voidwrite_data(uchardate)
lcdrs=1;
P0=date;
voidlcd_init()
delay(15);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
write_com(0x80+1);
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
for(num=0;
num<
8;
num++)
{
write_data(table1[num]);
delay(20);
write_com(0x80+0x40+1);
16;
write_data(table2[num]);
}
voidwrite_sfm(ucharadd,uchardate)
ucharshi,ge;
shi=date/1