请高手帮我看看关于SHT10的这段程序,谢谢啦,我急需用的

[复制链接]
3623|1
 楼主| razu_521 发表于 2008-5-26 21:20 | 显示全部楼层 |阅读模式
下面的是我的一个程序,可温湿度的值出来的是乱码,不知道哪儿有错误,请高手们帮我指点一下了!!谢谢!<br /><br />//12864并行接口参考程序,控制器st7920<br />#include&nbsp;&ltreg51.h&gt<br />#include&nbsp;&ltintrins.h&gt<br />#include&nbsp;&ltmath.h&gt&nbsp;&nbsp;&nbsp;&nbsp;<br />#include&nbsp;&ltstdio.h&gt&nbsp;<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int<br />#define&nbsp;LcdData&nbsp;P0<br />//12864&nbsp;汉字显示模块&nbsp;与MCU连接<br />sbit&nbsp;RS&nbsp;=&nbsp;P2^0;//&nbsp;1:输入数据&nbsp;;0:输入命令<br />sbit&nbsp;RW&nbsp;=&nbsp;P2^1;//1:读数据&nbsp;0:写数据<br />sbit&nbsp;E&nbsp;=&nbsp;P2^2;<br /><br /><br />typedef&nbsp;union<br />{&nbsp;unsigned&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;float&nbsp;f;<br />}&nbsp;value;<br /><br />//----------------------------------------------------------------------------------<br />//&nbsp;modul-var<br />//----------------------------------------------------------------------------------<br />enum&nbsp;{TEMP,HUMI};<br /><br /><br />sbit&nbsp;DATA&nbsp;=&nbsp;P1^0;<br />sbit&nbsp;SCK&nbsp;=&nbsp;P1^1;<br /><br />#define&nbsp;noACK&nbsp;0<br />#define&nbsp;ACK&nbsp;&nbsp;&nbsp;1<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;//adr&nbsp;&nbsp;command&nbsp;&nbsp;r/w<br />#define&nbsp;STATUS_REG_W&nbsp;0x06&nbsp;&nbsp;&nbsp;//000&nbsp;&nbsp;&nbsp;0011&nbsp;&nbsp;&nbsp;&nbsp;0<br />#define&nbsp;STATUS_REG_R&nbsp;0x07&nbsp;&nbsp;&nbsp;//000&nbsp;&nbsp;&nbsp;0011&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;MEASURE_TEMP&nbsp;0x03&nbsp;&nbsp;&nbsp;//000&nbsp;&nbsp;&nbsp;0001&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;MEASURE_HUMI&nbsp;0x05&nbsp;&nbsp;&nbsp;//000&nbsp;&nbsp;&nbsp;0010&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;RESET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x1e&nbsp;&nbsp;&nbsp;//000&nbsp;&nbsp;&nbsp;1111&nbsp;&nbsp;&nbsp;&nbsp;0<br /><br /><br />//延时子程序<br />void&nbsp;delay(unsigned&nbsp;int&nbsp;t)<br />{<br />unsigned&nbsp;int&nbsp;i,j;<br />for(i=0;i&ltt;i++)<br />for(j=0;j&lt100;j++);<br />}<br />///========================12864显示部分============================<br />//测试LCD忙<br />bit&nbsp;Check_Busy()<br />{<br />bit&nbsp;busy;<br />RS&nbsp;=&nbsp;0;<br />RW&nbsp;=&nbsp;1;<br />E&nbsp;=&nbsp;1;<br />_nop_();<br />busy&nbsp;=&nbsp;(bit)(LcdData&0x80);<br />E&nbsp;=&nbsp;0;<br />return&nbsp;0;<br />}<br />//等待LCD到空闲<br />void&nbsp;wait()<br />{<br />while(Check_Busy());<br />}<br />//写数据<br />void&nbsp;Lcd_Writedata(unsigned&nbsp;char&nbsp;dispdata)<br />{&nbsp;wait();<br />RS=1;<br />RW=0;<br />E=0;<br />_nop_();&nbsp;_nop_();<br />LcdData=dispdata;<br />E=1;<br />_nop_();&nbsp;_nop_();<br />E=0;<br />}<br />//写指令代码<br />void&nbsp;Lcd_WriteCmd(unsigned&nbsp;char&nbsp;cmdcode)<br />{&nbsp;wait();<br />RS=0;<br />RW=0;<br /><br />E=0;<br />_nop_();&nbsp;_nop_();<br />LcdData=cmdcode;<br />_nop_();&nbsp;_nop_();<br />E=1;<br />_nop_();&nbsp;_nop_();<br />E=0;<br />}<br />/*****************初始化LCD*******************************/<br />void&nbsp;Lcd_Init(void)<br />{<br />uchar&nbsp;cmd;<br />&nbsp;&nbsp;cmd=0x30;&nbsp;&nbsp;&nbsp;//功能设置&nbsp;8位数据,基本指令<br />Lcd_WriteCmd(cmd);&nbsp;&nbsp;//写指令<br />cmd=0x0C;&nbsp;&nbsp;&nbsp;//显示状态&nbsp;ON,游标OFF,反白OFF<br />Lcd_WriteCmd(cmd);&nbsp;&nbsp;//写指令<br />cmd=0x02;&nbsp;&nbsp;&nbsp;//地址归位<br />Lcd_WriteCmd(cmd);&nbsp;&nbsp;//写指令<br />cmd=0x80;&nbsp;&nbsp;&nbsp;//设置DDRAM地址<br />Lcd_WriteCmd(cmd);&nbsp;&nbsp;//写指令<br />cmd=0x06;<br />Lcd_WriteCmd(cmd);&nbsp;//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位<br />delay(100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时<br />}<br />/*****************清屏LCD&nbsp;*******************************/<br />void&nbsp;Lcd_Clr(void)<br />{<br />Lcd_WriteCmd(0x01);&nbsp;&nbsp;//清除显示<br />delay(100);<br />&nbsp;&nbsp;delay(100);<br />&nbsp;&nbsp;&nbsp;delay(100);<br />}<br /><br /><br /><br /><br />/*****************设置汉字位置********************************/<br />void&nbsp;Char_Set_XY(uchar&nbsp;x,&nbsp;uchar&nbsp;y,&nbsp;uchar&nbsp;*p)<br />{<br />&nbsp;&nbsp;&nbsp;if(y&nbsp;==&nbsp;0)<br />{<br /><br />Lcd_WriteCmd((0x80+x));<br />}<br />if(y&nbsp;==&nbsp;1)<br />{<br />Lcd_WriteCmd((0x90+x));<br />}<br />if(y&nbsp;==&nbsp;2)<br />{<br /><br />Lcd_WriteCmd((0x88+x));<br />}<br />if(y&nbsp;==&nbsp;3)<br />{<br /><br />Lcd_WriteCmd((0x98+x));<br />}<br />while(*p&nbsp;!=&nbsp;0)<br />{<br />Lcd_Writedata(*p++);<br /><br />&nbsp;&nbsp;}<br />}&nbsp;&nbsp;<br /><br />//字符串显示<br />void&nbsp;WriteStr(unsigned&nbsp;char&nbsp;code&nbsp;*s)<br />{<br />while(*s&gt0)<br />{&nbsp;Lcd_Writedata(*s);<br />s++;<br />}<br />}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;void&nbsp;disp2()<br />{&nbsp;Char_Set_XY(0,0,&quot;温度上限:&quot;);<br /><br />Char_Set_XY(0,1,&quot;温度下限:&quot;);<br /><br />&nbsp;&nbsp;Char_Set_XY(0,2,&quot;湿度上限:&quot;);<br /><br />&nbsp;&nbsp;Char_Set_XY(0,3,&quot;湿度下限:&quot;);<br />&nbsp;&nbsp;}<br /><br />//----------------------------------------------------------------------------------<br />char&nbsp;s_write_byte(unsigned&nbsp;char&nbsp;value)<br />//----------------------------------------------------------------------------------<br />//&nbsp;writes&nbsp;a&nbsp;byte&nbsp;on&nbsp;the&nbsp;Sensibus&nbsp;and&nbsp;checks&nbsp;the&nbsp;acknowledge<br />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,&nbsp;&nbsp;error=0;<br /><br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;n;<br /><br />&nbsp;&nbsp;for&nbsp;(i=0x80;i&gt0;i/=2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//shift&nbsp;bit&nbsp;for&nbsp;masking<br />&nbsp;&nbsp;{&nbsp;if&nbsp;(i&nbsp;&&nbsp;value)&nbsp;DATA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//masking&nbsp;value&nbsp;with&nbsp;i&nbsp;,&nbsp;write&nbsp;to&nbsp;SENSI-BUS<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;DATA=0;<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;//clk&nbsp;for&nbsp;SENSI-BUS<br />&nbsp;&nbsp;&nbsp;&nbsp;for(n=0;n&lt10;n++)&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;//pulswith&nbsp;approx.&nbsp;5&nbsp;us<br />&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;<br />for(n=0;n&lt7;n++)&nbsp;_nop_();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;DATA=1;&nbsp;&nbsp;//release&nbsp;DATA-line<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(n=0;n&lt3;n++)&nbsp;_nop_();<br />&nbsp;&nbsp;&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;&nbsp;&nbsp;//clk&nbsp;#9&nbsp;for&nbsp;ack<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;&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;//check&nbsp;ack&nbsp;(DATA&nbsp;will&nbsp;be&nbsp;pulled&nbsp;down&nbsp;by&nbsp;SHT11)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;<br /><br /><br /><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;in&nbsp;case&nbsp;of&nbsp;no&nbsp;acknowledge<br />}<br /><br />//----------------------------------------------------------------------------------<br />char&nbsp;s_read_byte(unsigned&nbsp;char&nbsp;ack)<br />//----------------------------------------------------------------------------------<br />//&nbsp;reads&nbsp;a&nbsp;byte&nbsp;form&nbsp;the&nbsp;Sensibus&nbsp;and&nbsp;gives&nbsp;an&nbsp;acknowledge&nbsp;in&nbsp;case&nbsp;of&nbsp;&quot;ack=1&quot;<br />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,val=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;//release&nbsp;DATA-line<br />&nbsp;&nbsp;for&nbsp;(i=0x80;i&gt0;i/=2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//shift&nbsp;bit&nbsp;for&nbsp;masking<br />&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;//clk&nbsp;for&nbsp;SENSI-BUS<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(DATA)&nbsp;val=(val&nbsp;|&nbsp;i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;<br />&nbsp;&nbsp;}<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;//in&nbsp;case&nbsp;of&nbsp;&quot;ack==1&quot;&nbsp;pull&nbsp;down&nbsp;DATA-Line<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;&nbsp;//clk&nbsp;#9&nbsp;for&nbsp;ack<br />&nbsp;&nbsp;_nop_();_nop_();_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//pulswith&nbsp;approx.&nbsp;5&nbsp;us<br />&nbsp;&nbsp;SCK=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;//release&nbsp;DATA-line<br />&nbsp;&nbsp;return&nbsp;val;<br />}<br /><br />//----------------------------------------------------------------------------------<br />void&nbsp;s_transstart(void)<br />//----------------------------------------------------------------------------------<br />//&nbsp;generates&nbsp;a&nbsp;transmission&nbsp;start<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 />{<br />int&nbsp;n;<br /><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;//Initial&nbsp;state<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)_nop_();<br />&nbsp;&nbsp;&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)_nop_();<br />&nbsp;&nbsp;&nbsp;DATA=0;<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)_nop_();<br />&nbsp;&nbsp;&nbsp;SCK=0;<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)_nop_();_nop_();_nop_();<br />&nbsp;&nbsp;&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)_nop_();<br />&nbsp;&nbsp;&nbsp;DATA=1;<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)_nop_();<br />&nbsp;&nbsp;&nbsp;SCK=0;<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)_nop_();<br />}<br /><br />//----------------------------------------------------------------------------------<br />void&nbsp;s_connectionreset(void)<br />//----------------------------------------------------------------------------------<br />//&nbsp;communication&nbsp;reset:&nbsp;DATA-line=1&nbsp;and&nbsp;at&nbsp;least&nbsp;9&nbsp;SCK&nbsp;cycles&nbsp;followed&nbsp;by&nbsp;transstart<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 />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;int&nbsp;n;<br /><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;//Initial&nbsp;state<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;//9&nbsp;SCK&nbsp;cycles<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SCK=1;<br />for(n=0;n&lt10;n++)_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;<br />for(n=0;n&lt5;n++)_nop_();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt5;n++)_nop_();<br />&nbsp;&nbsp;s_transstart();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//transmission&nbsp;start<br />}<br /><br />//----------------------------------------------------------------------------------<br />char&nbsp;s_softreset(void)<br />//----------------------------------------------------------------------------------<br />//&nbsp;resets&nbsp;the&nbsp;sensor&nbsp;by&nbsp;a&nbsp;softreset<br />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;error=0;<br />&nbsp;&nbsp;s_connectionreset();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//reset&nbsp;communication<br />&nbsp;&nbsp;error+=s_write_byte(RESET);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;RESET-command&nbsp;to&nbsp;sensor<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;in&nbsp;case&nbsp;of&nbsp;no&nbsp;response&nbsp;form&nbsp;the&nbsp;sensor<br />}<br /><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;makes&nbsp;a&nbsp;measurement&nbsp;(humidity/temperature)&nbsp;with&nbsp;checksum<br />{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;error=0;<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i;<br /><br />&nbsp;&nbsp;s_transstart();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//transmission&nbsp;start<br />&nbsp;&nbsp;switch(mode){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;command&nbsp;to&nbsp;sensor<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TEMP&nbsp;:&nbsp;error+=s_write_byte(MEASURE_TEMP);&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;HUMI&nbsp;:&nbsp;error+=s_write_byte(MEASURE_HUMI);&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;break;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;for&nbsp;(i=0;i&lt65535;i++)&nbsp;if(DATA==0)&nbsp;break;&nbsp;//wait&nbsp;until&nbsp;sensor&nbsp;has&nbsp;finished&nbsp;the&nbsp;measurement<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;or&nbsp;timeout&nbsp;(~2&nbsp;sec.)&nbsp;is&nbsp;reached<br />&nbsp;&nbsp;*(p_value)&nbsp;&nbsp;=s_read_byte(ACK);&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;the&nbsp;first&nbsp;byte&nbsp;(MSB)<br />&nbsp;&nbsp;*(p_value+1)=s_read_byte(ACK);&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;the&nbsp;second&nbsp;byte&nbsp;(LSB)<br /><br />//&nbsp;&nbsp;printf(&quot;\ndata1=%x,&nbsp;data2=%x\n&quot;,&nbsp;*(p_value),&nbsp;*(p_value+1));<br /><br />&nbsp;&nbsp;*p_checksum&nbsp;=s_read_byte(noACK);&nbsp;&nbsp;//read&nbsp;checksum<br />&nbsp;&nbsp;return&nbsp;error;<br />}<br /><br />//----------------------------------------------------------------------------------<br />void&nbsp;init_uart()<br />//----------------------------------------------------------------------------------<br />//9600&nbsp;bps&nbsp;@&nbsp;11.059&nbsp;MHz<br />{SCON&nbsp;&nbsp;=&nbsp;0x52;<br />TMOD&nbsp;&nbsp;=&nbsp;0x20;<br />TCON&nbsp;&nbsp;=&nbsp;0x69;<br />TH1&nbsp;&nbsp;&nbsp;=&nbsp;0xfd;<br />}<br /><br />//----------------------------------------------------------------------------------------<br />void&nbsp;calc_sth11(float&nbsp;*p_humidity&nbsp;,float&nbsp;*p_temperature)<br />//----------------------------------------------------------------------------------------<br />//&nbsp;calculates&nbsp;temperature&nbsp;[癈]&nbsp;and&nbsp;humidity&nbsp;[%RH]<br />//&nbsp;input&nbsp;:&nbsp;&nbsp;humi&nbsp;[Ticks]&nbsp;(12&nbsp;bit)<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;[Ticks]&nbsp;(14&nbsp;bit)<br />//&nbsp;output:&nbsp;&nbsp;humi&nbsp;[%RH]<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&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<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<br />&nbsp;&nbsp;const&nbsp;float&nbsp;C3=-0.0000028;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;12&nbsp;Bit<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<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<br /><br />&nbsp;&nbsp;float&nbsp;rh=*p_humidity;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;rh:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Humidity&nbsp;[Ticks]&nbsp;12&nbsp;Bit<br />&nbsp;&nbsp;float&nbsp;t=*p_temperature;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;t:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Temperature&nbsp;[Ticks]&nbsp;14&nbsp;Bit<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;//&nbsp;rh_lin:&nbsp;&nbsp;Humidity&nbsp;linear<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;//&nbsp;rh_true:&nbsp;Temperature&nbsp;compensated&nbsp;humidity<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;//&nbsp;t_C&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;Temperature&nbsp;[癈]<br /><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;//calc.&nbsp;temperature&nbsp;from&nbsp;ticks&nbsp;to&nbsp;[癈]<br />&nbsp;&nbsp;rh_lin=C3*rh*rh&nbsp;+&nbsp;C2*rh&nbsp;+&nbsp;C1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//calc.&nbsp;humidity&nbsp;from&nbsp;ticks&nbsp;to&nbsp;[%RH]<br />&nbsp;&nbsp;rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;&nbsp;&nbsp;&nbsp;//calc.&nbsp;temperature&nbsp;compensated&nbsp;humidity&nbsp;[%RH]<br />&nbsp;&nbsp;if(rh_true&gt100)rh_true=100;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//cut&nbsp;if&nbsp;the&nbsp;value&nbsp;is&nbsp;outside&nbsp;of<br />&nbsp;&nbsp;if(rh_true&lt0.1)rh_true=0.1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//the&nbsp;physical&nbsp;possible&nbsp;range<br /><br />&nbsp;&nbsp;*p_temperature=t_C;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;temperature&nbsp;[癈]<br />&nbsp;&nbsp;*p_humidity=rh_true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;humidity[%RH]<br />}<br /><br /><br /><br />//----------------------------------------------------------------------------------<br />void&nbsp;main()<br />//----------------------------------------------------------------------------------<br />//&nbsp;sample&nbsp;program&nbsp;that&nbsp;shows&nbsp;how&nbsp;to&nbsp;use&nbsp;SHT11&nbsp;functions<br />//&nbsp;1.&nbsp;connection&nbsp;reset<br />//&nbsp;2.&nbsp;measure&nbsp;humidity&nbsp;[ticks](12&nbsp;bit)&nbsp;and&nbsp;temperature&nbsp;[ticks](14&nbsp;bit)<br />//&nbsp;3.&nbsp;calculate&nbsp;humidity&nbsp;[%RH]&nbsp;and&nbsp;temperature&nbsp;[癈]<br />//&nbsp;4.&nbsp;calculate&nbsp;dew&nbsp;point&nbsp;[癈]<br />//&nbsp;5.&nbsp;print&nbsp;temperature,&nbsp;humidity,&nbsp;dew&nbsp;point<br /><br />{<br />&nbsp;&nbsp;value&nbsp;humi_val,temp_val;<br />&nbsp;&nbsp;float&nbsp;dew_point;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;error,checksum;<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i;<br /><br />init_uart();<br /><br />&nbsp;&nbsp;s_connectionreset();<br />Lcd_Clr();<br />Lcd_Init();&nbsp;//初始化LCD<br />//Char_Set_XY(2,&nbsp;1,&nbsp;&quot;初始化成功&quot;);<br />delay(1000);<br /><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;//measure&nbsp;humidity<br /><br />//printf(&quot;humi:%dC&nbsp;\n&quot;,humi_val.i);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;error+=s_measure((unsigned&nbsp;char*)&nbsp;&temp_val.i,&checksum,TEMP);&nbsp;&nbsp;//measure&nbsp;temperature<br /><br />//&nbsp;printf(&quot;temp:%dC&nbsp;\n&quot;,temp_val.i);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(error!=0)&nbsp;s_connectionreset();&nbsp;&nbsp;&nbsp;&nbsp;//in&nbsp;case&nbsp;of&nbsp;an&nbsp;error:&nbsp;connection&nbsp;reset<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;//converts&nbsp;integer&nbsp;to&nbsp;float<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;//converts&nbsp;integer&nbsp;to&nbsp;float<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;//calculate&nbsp;humidity,&nbsp;temperature<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;dew_point=calc_dewpoint(humi_val.f,temp_val.f);&nbsp;//calculate&nbsp;dew&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;temp:%5.1fC&nbsp;\n&quot;,temp_val.f);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />Lcd_WriteCmd(0x98);<br />Lcd_WriteDat(*temp_va1.f)&nbsp;;<br />//&nbsp;Char_Set_XY(1,2,&temp_val.f&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//----------wait&nbsp;approx.&nbsp;0.8s&nbsp;to&nbsp;avoid&nbsp;heating&nbsp;up&nbsp;SHTxx------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt40000;i++);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//(be&nbsp;sure&nbsp;that&nbsp;the&nbsp;compiler&nbsp;doesn't&nbsp;eliminate&nbsp;this&nbsp;line!)<br />&nbsp;&nbsp;&nbsp;&nbsp;//-----------------------------------------------------------------------------------<br />&nbsp;&nbsp;}<br />}<br />&nbsp;<br />
 楼主| razu_521 发表于 2008-5-26 21:22 | 显示全部楼层

这个是SHT10的资料

硬件电路设计<br /><br />本设计的硬件部分主要由温湿度传感器SHT10,AT89S51单片机和LED数码管构成。<br /><br /><br /><br /><br />2.1&nbsp;&nbsp;SHT10数字式温湿度传感器<br /><br />SHT10传感器由相对湿度传感器,温度传感器,校准存储器,14位A/D转换器,信号放大器和I2C总线接口构成。SHT10具备卓越的长期稳定性,露点值计算输出功能,全较准、数字输出功能,免外围电路,完全低功耗,采用表面贴片封装或四脚互换封装,体积微小,全自动降能功能。<br /><br />2.2&nbsp;&nbsp;单片机和SHT10接口电路<br />由于AT89S51不具备I2C总线接口,故使用单片机通用I/O口线来虚拟I2C总线[9],利用P1.6来虚拟时钟线,利用P1.5口线来虚拟数据线DATA,并在DATA端接入一个4.7K的上拉电阻,同时在VCC及GND端接入一个0.1UF的去耦电容,AT89S51单片机与SHT10的接口电路如图2所示。&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 /><br /><br /><br /> 软件程序设计<br />首先,单片机将温度数据(SOT)从SHT10读入,然后根据公式1计算温度,再判断标志位TEMP_SORH的状态(初始化标志位TEMP_SORH为高),分别进行显示温度和读取湿度数据(SORH)、计算湿度、显示湿度。系统主程序流程图见图3。测量温湿度子程序主要包括以下三个部分:<br />3.1&nbsp;&nbsp;传输开始<br />初始化传输时,单片机发出&quot;传输开始&quot;命令,具体为当SCK为高时,将DATA由高电平变为低电平,并在下一个SCK为高时将DATA升高。接下来一个命令包含三个地址位(目前只支持&quot;000&quot;)和5个命令位,当上述命令发送给SHT10之后,单片机通过检测DATA脚的ACK位是否处于低电位确认SHT10是否正确收到命令。SHT10命令编码表见表2。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;表2 SHT10命令编码表&nbsp;&nbsp;&nbsp;&nbsp;<br />命令&nbsp;&nbsp;&nbsp;&nbsp;编码&nbsp;&nbsp;&nbsp;&nbsp;说明<br />保存&nbsp;&nbsp;&nbsp;&nbsp;0000X&nbsp;&nbsp;&nbsp;&nbsp;保存<br />测量温度&nbsp;&nbsp;&nbsp;&nbsp;00011&nbsp;&nbsp;&nbsp;&nbsp;温度测量<br />测量湿度&nbsp;&nbsp;&nbsp;&nbsp;00101&nbsp;&nbsp;&nbsp;&nbsp;湿度测量<br />读状态寄存器&nbsp;&nbsp;&nbsp;&nbsp;00111&nbsp;&nbsp;&nbsp;&nbsp;读状态寄存器<br />写状态寄存器&nbsp;&nbsp;&nbsp;&nbsp;00110&nbsp;&nbsp;&nbsp;&nbsp;写状态寄存器<br />保存&nbsp;&nbsp;&nbsp;&nbsp;0101X-1110X&nbsp;&nbsp;&nbsp;&nbsp;保存<br />软启动&nbsp;&nbsp;&nbsp;&nbsp;11110&nbsp;&nbsp;&nbsp;&nbsp;重启芯片,清除状态寄存器的错误值,等待11毫秒后进入下一个命令<br />3.2&nbsp;&nbsp;连接复位时序<br />如果单片机与SHT10传感器的通讯中断(SHT10没有正确收到命令),则需要重新发出传输开始命令。下列信号顺序会使串口复位:当使DATA线处于高电平时,触发SCK&nbsp;9次以上(含9次),并随后发一个前述的&quot;传输开始&quot;命令。<br />3.3&nbsp;&nbsp;温湿度测量时序<br />当单片机发出了传输开始命令,且SHT10正确接收到温(湿)度测量命令后,单片机就要等到测量完成。使用8/12/14位的分辨率测量分别需要大约11/55/210毫秒。为表明测量完成,SHT10会使数据线为低,此时单片机必须重新启动SCK。然后传送两字节测量数据与1字节CRC校验和。在传输过程中控制器必须通过使DATA为低来确认每一字节,所有的测量值从右算MSB列于第一位。通讯在确认CRC数据位后停止。如果没有用CRC-8校验和,则单片机需要在测量数据LSB后,保持ACK为高来停止通讯,SHT10在测量和通讯完成之后会自动返回睡眠模式。需要注意的是,为使SHT10温升低于0.1℃,则此时工作频率不能大于15%(如:12位精确度时,每秒最多进行3次测量)。<br />测量温度子程序流程图见图4,测量湿度子程序流程图见图5。<br /><br />&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

29

帖子

0

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