关于SHT10求助

[复制链接]
5030|4
 楼主| 王人言 发表于 2008-8-11 17:23 | 显示全部楼层 |阅读模式
最近在工作中用到SHT10,下了一个别人的没有调试的程序,我在调试的过程序,输出的温度值不对,哪位可以帮助&nbsp;一下吗?以下是我的程序:<br /><br />#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ltpic.h&gt;//定义头文件<br />#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ltmath.h&gt;<br /><br />#define&nbsp;DATA&nbsp;&nbsp;&nbsp;&nbsp;RC7&nbsp;//定义通讯数据端口<br />#define&nbsp;DATA_IO&nbsp;TRISC7&nbsp;//用于设置IO状态<br />#define&nbsp;SCK&nbsp;&nbsp;&nbsp;&nbsp;RC6&nbsp;//定义通讯时钟端口<br />#define&nbsp;noACK&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//继续传输数据,用于判断是否结束通讯<br />#define&nbsp;ACK&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束数据传输;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//地址&nbsp;&nbsp;命令<br />#define&nbsp;MEASURE_TEMP&nbsp;0x03&nbsp;&nbsp;&nbsp;//000&nbsp;&nbsp;&nbsp;00011<br />#define&nbsp;MEASURE_HUMI&nbsp;0x05&nbsp;&nbsp;&nbsp;//000&nbsp;&nbsp;&nbsp;00101<br />void&nbsp;init_uart(void);<br />void&nbsp;s_connectionreset(void);<br />void&nbsp;s_transstart(void);<br />char&nbsp;s_measure(unsigned&nbsp;char&nbsp;*p_value,&nbsp;unsigned&nbsp;char&nbsp;*p_checksum,&nbsp;unsigned&nbsp;char&nbsp;mode);<br />char&nbsp;s_write_byte(unsigned&nbsp;char&nbsp;value);<br />char&nbsp;s_read_byte(unsigned&nbsp;char&nbsp;ack);<br />void&nbsp;calc_sth11(float&nbsp;*p_humidity&nbsp;,float&nbsp;*p_temperature);<br />float&nbsp;calc_dewpoint(float&nbsp;h,float&nbsp;t);<br />void&nbsp;delay1&nbsp;(unsigned&nbsp;int&nbsp;time);<br />&nbsp;union<br />{&nbsp;unsigned&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;float&nbsp;f;<br />}humi_val,temp_val;&nbsp;//定义两个共同体,一个用于湿度,一个用于温度<br /><br /><br />/*延时&nbsp;1MS&nbsp;带参数(int)子程序<br />*******************************************************************************/<br />void&nbsp;delay1&nbsp;(unsigned&nbsp;int&nbsp;time){<br />&nbsp;unsigned&nbsp;int&nbsp;a,b;<br />&nbsp;for(a=0;a&lttime;a++){<br />&nbsp;&nbsp;for(b=0;b&lt88;b++);<br />&nbsp;}<br />}<br />//----------------------------------------------------------------------------------<br />void&nbsp;init_uart(void)<br />//----------------------------------------------------------------------------------<br />//&nbsp;端口初始化<br />{<br />&nbsp;TRISC7=0;<br />&nbsp;TRISC6=0;<br />}<br />//----------------------------------------------------------------------------------<br />void&nbsp;s_connectionreset(void)<br />//----------------------------------------------------------------------------------<br />//&nbsp;连接复位;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_____________________________________________________&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;________<br />//&nbsp;DATA:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|_______|<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;___&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;___<br />//&nbsp;SCK&nbsp;:&nbsp;__|&nbsp;|__|&nbsp;|__|&nbsp;|__|&nbsp;|__|&nbsp;|__|&nbsp;|__|&nbsp;|__|&nbsp;|__|&nbsp;|______|&nbsp;&nbsp;&nbsp;|___|&nbsp;&nbsp;&nbsp;|______<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;&nbsp;<br />&nbsp;&nbsp;DATA=1;&nbsp;SCK=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//准备<br />&nbsp;&nbsp;for(i=0;i&lt9;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位<br />&nbsp;&nbsp;{&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;s_transstart();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动传输<br />}<br />//----------------------------------------------------------------------------------<br />void&nbsp;s_transstart(void)<br />//----------------------------------------------------------------------------------<br />//&nbsp;启动传输<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_____&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;________<br />//&nbsp;DATA:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|_______|<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;___&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;___<br />//&nbsp;SCK&nbsp;:&nbsp;___|&nbsp;&nbsp;&nbsp;|___|&nbsp;&nbsp;&nbsp;|______<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;DATA=1;&nbsp;SCK=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;DATA=0;<br />&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;SCK=0;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;NOP();NOP();NOP();<br />&nbsp;&nbsp;&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;DATA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;SCK=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />//----------------------------------------------------------------------------------<br />char&nbsp;s_measure(unsigned&nbsp;char&nbsp;*p_value,&nbsp;unsigned&nbsp;char&nbsp;*p_checksum,&nbsp;unsigned&nbsp;char&nbsp;mode)<br />//----------------------------------------------------------------------------------<br />//&nbsp;进行温度或者湿度转换,由参数mode决定转换内容;<br />{&nbsp;<br />&nbsp;&nbsp;unsigned&nbsp;error=0;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;s_transstart();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动传输<br />&nbsp;&nbsp;switch(mode){<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;02&nbsp;:&nbsp;error+=s_write_byte(MEASURE_TEMP);&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;01&nbsp;:&nbsp;error+=s_write_byte(MEASURE_HUMI);&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;:&nbsp;break;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;for&nbsp;(i=0;i&lt110;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay1(2);<br />&nbsp;&nbsp;if(DATA==0)&nbsp;break;&nbsp;//等待测量结束;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if(DATA)&nbsp;error+=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果长时间数据线没有拉低,说明测量错误<br />&nbsp;&nbsp;*(p_value)&nbsp;&nbsp;=s_read_byte(ACK);&nbsp;&nbsp;&nbsp;&nbsp;//读第一个字节,高字节&nbsp;(MSB)<br />&nbsp;&nbsp;*(p_value+1)=s_read_byte(ACK);&nbsp;&nbsp;&nbsp;&nbsp;//读第二个字节,低字节&nbsp;(LSB)<br />&nbsp;&nbsp;*p_checksum&nbsp;=s_read_byte(noACK);&nbsp;&nbsp;//read&nbsp;CRC校验码<br />&nbsp;&nbsp;return&nbsp;error;<br />}<br />//----------------------------------------------------------------------------------<br />char&nbsp;s_write_byte(unsigned&nbsp;char&nbsp;value)<br />//----------------------------------------------------------------------------------<br />//&nbsp;写字节函数&nbsp;<br />{&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,error=0;&nbsp;<br />&nbsp;&nbsp;for&nbsp;(i=0x80;i&gt0;i/=2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//高位为1,循环右移<br />&nbsp;&nbsp;{&nbsp;if&nbsp;(i&nbsp;&&nbsp;value)&nbsp;DATA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//和要发送的数相与,结果为发送的位<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;DATA=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;//&nbsp;unsigned&nbsp;char&nbsp;i,error=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCK=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP();NOP();NOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;DATA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//释放数据线<br />&nbsp;&nbsp;DATA_IO=1;<br />&nbsp;&nbsp;SCK=1;<br />&nbsp;&nbsp;error=DATA;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//检查应答信号,确认通讯正常<br />&nbsp;&nbsp;SCK=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;return&nbsp;error;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//error=1&nbsp;通讯错误<br />}<br />//----------------------------------------------------------------------------------<br />char&nbsp;s_read_byte(unsigned&nbsp;char&nbsp;ack)<br />//----------------------------------------------------------------------------------<br />//&nbsp;读数据;<br />{&nbsp;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,val=0;<br />&nbsp;&nbsp;DATA_IO=0;<br />&nbsp;&nbsp;DATA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据线为高<br />&nbsp;&nbsp;DATA_IO=1;<br />&nbsp;&nbsp;for&nbsp;(i=0x80;i&gt0;i/=2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//右移位<br />&nbsp;&nbsp;{&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(DATA)&nbsp;val=(val&nbsp;|&nbsp;i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读数据线的值<br />&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;DATA_IO=0;<br />&nbsp;&nbsp;DATA=!ack;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果是校验,读取完后结束通讯;<br />&nbsp;&nbsp;SCK=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;NOP();NOP();NOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;SCK=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;DATA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//释放数据线<br />&nbsp;&nbsp;return&nbsp;va<br />}<br />//----------------------------------------------------------------------------------------<br />void&nbsp;calc_sth11(float&nbsp;*p_humidity&nbsp;,float&nbsp;*p_temperature)<br />//----------------------------------------------------------------------------------------<br />//&nbsp;补偿及输出温度和相对湿度<br />{&nbsp;const&nbsp;float&nbsp;C1=-4.0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;12&nbsp;Bit&nbsp;湿度修正公式<br />&nbsp;&nbsp;const&nbsp;float&nbsp;C2=+0.0405;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;12&nbsp;Bit&nbsp;湿度修正公式<br />&nbsp;&nbsp;const&nbsp;float&nbsp;C3=-0.0000028;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;12&nbsp;Bit&nbsp;湿度修正公式<br />&nbsp;&nbsp;const&nbsp;float&nbsp;T1=+0.01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;14&nbsp;Bit&nbsp;@&nbsp;5V&nbsp;温度修正公式<br />&nbsp;&nbsp;const&nbsp;float&nbsp;T2=+0.00008;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;14&nbsp;Bit&nbsp;@&nbsp;5V&nbsp;&nbsp;温度修正公式<br />&nbsp;&nbsp;float&nbsp;rh=*p_humidity;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;float&nbsp;t=*p_temperature;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;float&nbsp;rh_lin;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;float&nbsp;rh_true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;float&nbsp;t_C;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;t_C=t*0.01&nbsp;-&nbsp;40;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//补偿温度<br />&nbsp;&nbsp;rh_lin=C3*rh*rh&nbsp;+&nbsp;C2*rh&nbsp;+&nbsp;C1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//相对湿度非线性补偿<br />&nbsp;&nbsp;rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;&nbsp;&nbsp;&nbsp;//相对湿度对于温度依赖性补偿<br />&nbsp;&nbsp;if(rh_true&gt100)rh_true=100;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//湿度最大修正<br />&nbsp;&nbsp;if(rh_true&lt0.1)rh_true=0.1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//湿度最小修正<br />&nbsp;&nbsp;*p_temperature=t_C;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回温度结果<br />&nbsp;&nbsp;*p_humidity=rh_true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回湿度结果<br />}<br />//--------------------------------------------------------------------<br />float&nbsp;calc_dewpoint(float&nbsp;h,float&nbsp;t)<br />//--------------------------------------------------------------------<br />//&nbsp;计算绝对湿度值<br />{&nbsp;float&nbsp;logEx,dew_point;<br />&nbsp;&nbsp;logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);<br />&nbsp;&nbsp;dew_point&nbsp;=&nbsp;(logEx&nbsp;-&nbsp;0.66077)*237.3/(0.66077+7.5-logEx);<br />&nbsp;&nbsp;return&nbsp;dew_point;<br />}<br />//----------------------------------------------------------------------------------<br />&nbsp;void&nbsp;main()<br />//----------------------------------------------------------------------------------<br />//&nbsp;示例程序,完成如下功能<br />//&nbsp;1.&nbsp;复位&nbsp;<br />//&nbsp;2.&nbsp;湿度的12测量以及温度的14位精度测量<br />//&nbsp;3.&nbsp;补偿及修正温湿度<br />//&nbsp;4.&nbsp;计数并得出绝对湿度<br />{&nbsp;float&nbsp;dew_point;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;error,checksum;<br />&nbsp;unsigned&nbsp;char&nbsp;HUMI,TEMP;<br />&nbsp;HUMI=0X01;<br />&nbsp;TEMP=0X02;<br />&nbsp;<br />&nbsp;&nbsp;init_uart();<br />&nbsp;&nbsp;s_connectionreset();<br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{&nbsp;error=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;error+=s_measure((unsigned&nbsp;char*)&nbsp;&humi_val.i,&checksum,HUMI);&nbsp;&nbsp;//湿度测量<br />&nbsp;&nbsp;&nbsp;&nbsp;error+=s_measure((unsigned&nbsp;char*)&nbsp;&temp_val.i,&checksum,TEMP);&nbsp;&nbsp;//温度测量<br />&nbsp;&nbsp;&nbsp;&nbsp;if(error!=0)&nbsp;s_connectionreset();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果发生错误,系统复位<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;humi_val.f=(float)humi_val.i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//转换为浮点数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_val.f=(float)temp_val.i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//转换为浮点数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calc_sth11(&humi_val.f,&temp_val.f);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//修正相对湿度及温度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dew_point=calc_dewpoint(humi_val.f,temp_val.f);&nbsp;//计算绝对湿度值<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;temp:%5.1fC&nbsp;humi:%5.1f%%&nbsp;dew&nbsp;point:%5.1fC
&quot;,temp_val.f,humi_val.f,dew_point);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;delay1(800);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待足够长的时间,以现行下一次转换<br />&nbsp;&nbsp;}<br />}&nbsp;<br /><br />
兰天白云 发表于 2008-8-12 21:18 | 显示全部楼层

老兄,硬件设计有没有错?

  
 楼主| 王人言 发表于 2008-8-13 07:34 | 显示全部楼层

回2楼

硬件应该是没有错的,我是按照说明书的来接线的,可能是程序哪里有错,但是我自己又找不出来.
hclwj181 发表于 2013-4-3 15:16 | 显示全部楼层
应该是延时问题,我也碰到了,不知道怎么解决啊
wzx2088 发表于 2014-10-3 15:07 | 显示全部楼层
对于PIC单片机

*(p_value)  =s_read_byte(ACK);    //读第一个字节,高字节 (MSB)
*(p_value+1)=s_read_byte(ACK);    //读第二个字节,低字节 (LSB)
改为
*(p_value+1)=s_read_byte(ACK);    //读第一个字节,高字节 (MSB)
*(p_value)  =s_read_byte(ACK);    //读第二个字节,低字节 (LSB)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

22

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部