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