📄 ds18b20.c
字号:
if (DS18B20_Master_Reset () != 1) // Master reset
{
Exit_Critical ();
return 0;
}
DS18B20_Write_Byte (0xCC); // Skip ROM command
DS18B20_Write_Byte (0x44); // Convert temperature command
Exit_Critical ();
Soft_Delay_ms (751); // Wait for convert complete
Enter_Critical ();
// Cycle end
// Start read SCT cycle
if (DS18B20_Master_Reset () != 1) // Master reset
{
Exit_Critical ();
return 0;
}
DS18B20_Write_Byte (0xCC); // Skip ROM command
DS18B20_Write_Byte (0xBE); // Read SCT
DS18B20_Multi_Read_Byte (sct, 9); // Read scratchpad data, 8 Bytes + 1 Byte CRC
// Cycle end
if (DS18B20_SCT_Check (sct) != 1) // Check scratchpad with CRC and CONFIG register
{
Exit_Critical ();
return 0;
}
DS18B20_Temperature_Format_Transfer (sct, Value);
Exit_Critical ();
return 1;
}
//--------------------------------------------------------------------------------------------------
////////// Read the Laser ROM from from DS18B20 // Notice: Only for single device on 1-Wire Bus
// Input:
// * Value: the point for UID data storage. LSB first, MSB last
// Return:
// 0: Opt. false
// 1: Opt. OK
__monitor unsigned char DS18B20_Single_Read_ROM (unsigned char * Value)
{
unsigned char i;
unsigned char rom_temp[8];
if (DS18B20_Master_Reset () != 1) // Master reset and check, error to return 0
{
return 0;
}
DS18B20_Write_Byte (0x33); // 0x33 is Read ROM command
DS18B20_Multi_Read_Byte (rom_temp, 8);
if ( DS18B20_UID_Check (rom_temp) != 1)
{
return 0;
}
for (i = 0; i < 8; i++)
{
* (Value + i) = rom_temp[i]; // CRC OK, Write back result
}
return 1;
}
//--------------------------------------------------------------------------------------------------
////////// Only convert temperature without delay. Single
// Input:
// None
// Return:
// 0: Opt. false
// 1: Opt. OK
unsigned char DS18B20_Single_Only_Convert_Temperature (void)
{
unsigned char cpu_sr;
Enter_Critical ();
// Start convert cycle
if (DS18B20_Master_Reset () != 1) // Master reset
{
Exit_Critical ();
return 0;
}
DS18B20_Write_Byte (0xCC); // Skip ROM command
DS18B20_Write_Byte (0x44); // Convert temperature command
Exit_Critical ();
return 1;
}
//--------------------------------------------------------------------------------------------------
////////// Only read SCT data from DS18B20. Single
// Input:
//
// * Value: will storage temperature.
// * (Value + 0): = 0x00 is above 0, = 0xFF is lower 0
// * (Value + 1): Int. of temperature value
// * (Value + 2): dot. of temperature value, 0x00 to 0x63 (0.00 to 0.99)
// Return:
// 0: Opt. false
// 1: Opt. OK
unsigned char DS18B20_Single_Only_Read_Temperature (unsigned char * Value)
{
unsigned char cpu_sr;
unsigned char sct[9]; // For temp storage scratchpad data
Enter_Critical ();
// Start read SCT cycle
if (DS18B20_Master_Reset () != 1) // Master reset
{
Exit_Critical ();
return 0;
}
DS18B20_Write_Byte (0xCC); // Skip ROM command
DS18B20_Write_Byte (0xBE); // Read SCT
DS18B20_Multi_Read_Byte (sct, 9); // Read scratchpad data, 8 Bytes + 1 Byte CRC
// Cycle end
if (DS18B20_SCT_Check (sct) != 1) // Check scratchpad with CRC and CONFIG register
{
Exit_Critical ();
return 0;
}
DS18B20_Temperature_Format_Transfer (sct, Value);
Exit_Critical ();
return 1;
}
//--------------------------------------------------------------------------------------------------
////////// 以指定的ROM去读温度
// Input:
//
// * UID: ROM (8 bytes)
// * Value: will storage temperature.
// * (Value + 0): = 0x00 is above 0, = 0xFF is lower 0
// * (Value + 1): Int. of temperature value
// * (Value + 2): dot. of temperature value, 0x00 to 0x63 (0.00 to 0.99)
// Return:
// 0: Opt. false
// 1: Opt. OK
unsigned char DS18B20_UID_Read_Temperature (unsigned char * Value, unsigned char * UID)
{
unsigned char cpu_sr;
unsigned char sct[9]; // For temp storage scratchpad data
Enter_Critical ();
if (DS18B20_UID_Check (UID) != 1)
{
Exit_Critical ();
return 0;
}
// Start convert cycle
if (DS18B20_Master_Reset () != 1) // Master reset
{
Exit_Critical ();
return 0;
}
DS18B20_Write_Byte (0x55); // Match ROM command
DS18B20_Multi_Write_Byte (UID, 8);
DS18B20_Write_Byte (0x44); // Convert temperature command
Exit_Critical ();
Soft_Delay_ms (751); // Wait for convert complete
Enter_Critical ();
// Cycle end
// Start read SCT cycle
if (DS18B20_Master_Reset () != 1) // Master reset
{
Exit_Critical ();
return 0;
}
DS18B20_Write_Byte (0x55); // Skip ROM command
DS18B20_Multi_Write_Byte (UID, 8);
DS18B20_Write_Byte (0xBE); // Read SCT
DS18B20_Multi_Read_Byte (sct, 9); // Read scratchpad data, 8 Bytes + 1 Byte CRC
// Cycle end
if (DS18B20_SCT_Check (sct) != 1) // Check scratchpad with CRC and CONFIG register
{
Exit_Critical ();
return 0;
}
DS18B20_Temperature_Format_Transfer (sct, Value);
Exit_Critical ();
return 1;
}
//--------------------------------------------------------------------------------------------------
ds18b20.h
/*
****************************************************************************************************
* SSAC_A1
* Main Controller Board
* File name : ds18b20.h
* Version : 1.0
* Use for : To detect temperature
* Summary : The include file
* Author : Shensong (E_mail:webmaster@shensong.com / QQ:2939603 / Mob:13016461980)
* Date : 2005-05-21
****************************************************************************************************
*/
#ifndef __DS18B20_H
#define __DS18B20_H
////////// Read the Laser ROM from from DS18b20 // Notice: Only for single device on 1-Wire Bus
// Input:
// * Value: the point for UID data storage
// Return:
// 0: Opt. false
// 1: Opt. OK
__monitor extern unsigned char DS18B20_Single_Read_ROM (unsigned char * Value);
//--------------------------------------------------------------------------------------------------
////////// Read the value of temperature from DS18b20
// Input:
// // * UID: which device with the UID will be read out
// * Value: will storage temperature.
// * (Value + 0): = 0x00 is above 0, = 0xFF is lower 0
// * (Value + 1): Int. of temperature value
// * (Value + 2): dot. of temperature value, 0x00 to 0x63 (0.00 to 0.99)
// Return:
// 0: Opt. false
// 1: Opt. OK
extern unsigned char DS18B20_Single_Read_Temperature (unsigned char * Value);
//--------------------------------------------------------------------------------------------------
////////// Only convert temperature without delay. Single
// Input:
// None
// Return:
// 0: Opt. false
// 1: Opt. OK
extern unsigned char DS18B20_Single_Only_Convert_Temperature (void);
//--------------------------------------------------------------------------------------------------
////////// Only read SCT data from DS18B20. Single
// Input:
//
// * Value: will storage temperature.
// * (Value + 0): = 0x00 is above 0, = 0xFF is lower 0
// * (Value + 1): Int. of temperature value
// * (Value + 2): dot. of temperature value, 0x00 to 0x63 (0.00 to 0.99)
// Return:
// 0: Opt. false
// 1: Opt. OK
extern unsigned char DS18B20_Single_Only_Read_Temperature (unsigned char * Value);
//--------------------------------------------------------------------------------------------------
////////// 以指定的ROM去读温度
// Input:
//
// * UID: ROM (8 bytes)
// * Value: will storage temperature.
// * (Value + 0): = 0x00 is above 0, = 0xFF is lower 0
// * (Value + 1): Int. of temperature value
// * (Value + 2): dot. of temperature value, 0x00 to 0x63 (0.00 to 0.99)
// Return:
// 0: Opt. false
// 1: Opt. OK
extern unsigned char DS18B20_UID_Read_Temperature (unsigned char * Value, unsigned char * UID);
#endif /* __DS18B20_H */
ds18b20_ports.h
/*****************************************************************************************************
* SSAC_A1
* Main Controller Board
* File name : ds18b20_ports.h
* Version : 1.0
* Use for : To detect temperature
* Summary : The include file for ports
* Author : Shensong (E_mail:webmaster@shensong.com / QQ:2939603 / Mob:13016461980)
* Date : 2005-05-25
*****************************************************************************************************/
#ifndef __DS18B20_PORTS_H
#define __DS18B20_PORTS_H
#define MCU_XTAL 11.0592 // The unit is MHz, for main MCU
#define MCU_TYPE ATmega128
#define COMPLIER_TYPE IAR
#if (MCU_TYPE == ATmega128) && (COMPLIER_TYPE == IAR)
#include <iom128.h> /* Only for "SREG" */
#include <ina90.h> /* Only for "__disable_interrupt() */
#endif /* (MCU_TYPE == ATmega128) && (COMPLIER_TYPE == IAR) */
/* The realization: program critical area ----------------------------------------------------*/
#if (MCU_TYPE == ATmega128) && (COMPLIER_TYPE == IAR)
#define Enter_Critical() cpu_sr = SREG; __disable_interrupt();
#define Exit_Critical() if (cpu_sr & 0x80) __enable_interrupt();
#endif /* (MCU_TYPE == ATmega128) && (COMPLIER_TYPE == IAR) */
/**************************************************************************************************/
/* The realization: Software delay -------------------------------------------------------------*/
#if (MCU_TYPE == ATmega128) && (COMPLIER_TYPE == IAR)
#define Soft_Delay_us(x) __delay_cycles (x * MCU_XTAL)
#define Soft_Delay_ms(x) __delay_cycles (x * MCU_XTAL * 1000)
#define Soft_Delay_s(x) __delay_cycles (x * MCU_XTAL * 1000000)
#endif /* (MCU_TYPE == ATmega128) && (COMPLIER_TYPE == IAR) */
/**************************************************************************************************/
#define DS18B20_Tx_Release() DDRB_DDB7 = 0
#define DS18B20_Tx_Obtain() DDRB_DDB7 = 1
#define DS18B20_Rx() PINE_PINE7
#endif /* __DS18B20_PORTS_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -