这与数学运算没多大的关系。前天正好弄了个,你看看能用不,里面有你要的读温度函数!那个函数不难的,就是有个把补码回来的算法。就这吧,应该对你有用
#include
#include
#define FALSE 0
#define TRUE 1
sbit DS18S20_DQ=P1^7;
/*#define bit char */
void Delay( unsigned char useconds )
{
for( ; useconds>0; useconds--) ;
}
bit Readbit( void )
{
char i ;
DS18S20_DQ = 0 ;
DS18S20_DQ = 1 ; for( i=0; i<3; i++) ;
return DS18S20_DQ;
}
char Reset( void )
{
char PresenceSignal;
Delay(30);
DS18S20_DQ = 1;
Delay( 3 );
PresenceSignal = DS18S20_DQ;
Delay( 30 );
return PresenceSignal;
}
char Readbyte( void )
{
char i;
char value = 0;
for ( i=0; i<8; i++ )
{
if( Readbit( ) )
value |= (0x01< Delay( 7 );
}
return ( value );
}
void Writebit( bit val)
{
DS18S20_DQ = 0;
if( val == 1 )
DS18S20_DQ = 1;
else
DS18S20_DQ = 0;
Delay( 5 );
DS18S20_DQ = 1;
}
void Writebyte( char val )
{
char i;
bit temp;
for( i=0; i<8; i-- )
{
temp = val>>i ;
temp &=0x01 ;
Writebit( temp );
}
Delay( 5 );
}
void Readtemperature( void )//读温度的
{
char get [10];
char temp_lsb,temp_msb;
int k;
unsigned char Ftemperature,Ctemperature;
Reset( );
Writebyte( 0XCC );
Writebyte( 0X44 );
Delay( 5 );
Reset( );
Writebyte( 0xCC );
Writebyte( 0xBE );
for ( k=0; k<9; k++ )
{
get[k] = Readbyte( );
}
printf("\nScratch DATA = %X%X%X%X\n",get[8], get[7], get[6], get[5], get[4], get[3], get[2], get[1], get[0]);
temp_msb = get[1];
temp_lsb = get[0];
if ( temp_msb <= 0x80 )
{
temp_lsb = (temp_lsb/2);
}
temp_msb = temp_msb&0x80; //屏蔽符号位之外的所有数据位
if ( temp_msb >= 0x80 )
{
temp_lsb = (~temp_lsb)+1;
}
if( temp_lsb >= 0x80 )
{
temp_lsb = (temp_lsb/2);
}
if ( temp_msb >= 0x80 )
{
temp_lsb = ((-1)*temp_lsb);
}
Ctemperature = temp_lsb;
Ftemperature = (((int) Ctemperature)*9)/5 +32;
printf("\nTempC= %d degrees C\n",(int)temp_lsb);
printf("\nTempF= %d degrees F\n",(int)Ftemperature);
}
void main ( void )
{
SCON = 0X50 ;
TMOD = 0X20 ;
TL1 = 0XF4 ;
TH1 = 0XF4 ;
TR1 = 1 ;
TI = 1 ;
Readtemperature( );
for(;1;);
}
传感器每个对应的数据都对应一个温度值,时间看你的算法了,一般对单片机来说温度算法是小CASE。
帮你编写个程序,我慢慢教会你!!