This example demonstrates communications between a MINI-MAX/51 board and 1-wire temperature sensors such as DS18XX (DS1820,DS18B20,DS18B20X,DS18S20,DS1822) using the 1-wire bus. The example detects the temperature sensor that is connected to the board automatically using Read Family Code command.
Toolkit:Micro C 8051 Development System
Location:C:\bipom\devtools\MicroC\Examples\8051\tiny\OneWire\DS18XX
{
unsigned char TmpL,TmpH,Err,FC;
unsigned int Temp;
char sign;
// Set the serial port to 19200 Baud
serinit(19200>>1);
for(;;)
{
Err =Reset_Ch0(); // Reset the 1-wire bus
if (!Err) // Error ?
{
WriteByte_Ch0(0xCC); // Skip ROM
WriteByte_Ch0(0x44); // Start Conversion
delay(1); // 500uS delay
Err =Reset_Ch0(); // Reset the 1-wire bus
}
if(Err) {printf("ERROR: 1-wire bus reset\n");}
else
{
// Read Temperature
WriteByte_Ch0(0xCC); // Skip ROM
WriteByte_Ch0(0xBE); // Read Scratch Pad
TmpL=ReadByte_Ch0(); // Read Temperature - Low Byte
TmpH=ReadByte_Ch0(); // Read Temperature - High Byte
// Read Family Code
Err =Reset_Ch0(); // Reset the 1-wire bus
WriteByte_Ch0(0x33); // Read Rom
FC=ReadByte_Ch0(); // Read Family Code
// Temp = {TmpH,TmpL}
Temp = TmpH;
Temp <<= 8;
Temp |= TmpL;
// Detect the sign
sign='+';
if (TmpH>0x7F)
{
sign='-';
Temp=(Temp^0xFFFF)+1; // Temperature - Absolute value
}
// Detect Temperature Sensor and print the current temperature
switch(FC)
{
case 0x10: // DS1820,DS18S20
printf ("\nSensor: DS1820,DS18S20");
printf ("\nTemperature: %c%03d.%01d°C",sign,(Temp*5)10,(Temp*5)%10);
break;
case 0x28: // DS18B20
printf ("\nSensor: DS18B20");
printf ("\nTemperature: %c%03d.%04d°C",sign,Temp>>4,(Temp%16)*625);
break;
case 0x22: // DS1822
printf ("\nSensor: DS1822");
printf ("\nTemperature: %c%03d.%04d°C",sign,Temp>>4,(Temp%16)*625);
break;
default:
printf ("\nERROR: Unknown 1-wire device,FC = %d",FC);
break;
}
}
printf ("\n");
delay(1000);
}
}