hugo
Joined: 01 Jan 1970 Posts: 286 Helped: 27 Location: canada
|
08 May 2009 12:45 ds1820 pic |
|
|
|
|
Hi,
Here's an example :
/*
* Project name:
Onewire_Test (Interfacing the DS18x20 temperature sensor - all versions)
* Copyright:
(c) MikroElektronika, 2005-2008.
* Description:
After reset, PIC reads temperature from the sensor and prints it on the Lcd.
The display format of the temperature is 'xxx.xxxx°C'. To obtain correct
results, the 18x20's temperature resolution has to be adjusted (constant
TEMP_RESOLUTION)
* Test configuration:
MCU: PIC16F877A
Dev.Board: EasyPIC4
Oscillator: HS, 08.0000 MHz
Ext. Modules: DS18x20 connected to RE2 pin, LCD_2x16
SW: mikroC v8.0.0.0
* NOTES:
- Pull up and turning off diode on pin used for one wire bus may be required (in this example PORTE)
*/
// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12
const unsigned short TEMP_RESOLUTION = 9;
char *text = "000.0000";
unsigned temp;
void Display_Temperature(unsigned int temp2write)
{
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;
// check if temperature is negative
if (temp2write & 0x8000)
{
text[0] = '-';
temp2write = ~temp2write + 1;
}
// extract temp_whole
temp_whole = temp2write >> RES_SHIFT ;
// convert temp_whole to characters
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
text[1] = (temp_whole/10)%10 + 48; // extract tens digit
text[2] = temp_whole%10 + 48; // extract ones digit
// extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
// convert temp_fraction to characters
text[4] = temp_fraction/1000 + 48; // extract thousands digit
text[5] = (temp_fraction/100)%10 + 48; // extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; // extract tens digit
text[7] = temp_fraction%10 + 48; // extract ones digit
// print temperature on LCD
Lcd_Out(2, 5, text);
}//~
void main()
{
ADCON1 = 7; // Configure AN pins as digital I/O
Lcd_Init(&PORTD); // Lcd_Init_EP4, see Autocomplete
Lcd_Cmd(LCD_CURSOR_OFF);
Lcd_Out(1, 1, " Temperature: ");
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,13,223);
Lcd_Chr(2,14,'C');
//--- main loop
while (1)
{
//--- perform temperature reading
Ow_Reset(&PORTE,2); // Onewire reset signal
Ow_Write(&PORTE,2,0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE,2,0x44); // Issue command CONVERT_T
Delay_ms(750);
Ow_Reset(&PORTE,2);
Ow_Write(&PORTE,2,0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE,2,0xBE); // Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTE,2);
temp = (Ow_Read(&PORTE,2) << + temp;
//--- Format and display result on Lcd
Display_Temperature(temp);
}
}
|
|