Вот на Си (статьи обновлять не имею возможности, там на asm): //----------------------------------------------------------------------------
//Модуль обслуживания термометра DS18B20
//----------------------------------------------------------------------------
#include <Main.h>
#include <DS18B20.h>
//----------------- Используемые модулем аппаратные ресурсы: -----------------
//1-проводной интерфейс использует порт OWP.
//Порт должен быть настроен на ввод,
//внутренний подтягивающий резистор должен быть отключен,
//используется внешний подтягивающий резистор 4.7 кОм.
//Должны быть определены следующие макросы:
//#define OWP (1 << Pxn)
//#define Port_OWP_OUT (DDRx |= OWP)
//#define Port_OWP_IN (DDRx &= ~OWP)
//#define Pin_OWP (PINx & OWP)
//Термометр должен быть запрограммирован в 12-разрядный режим
//(биты R0, R1 в регистре конфигурации равны единице).
//Считываются только 2 байта темпертуры без проверки CRC.
//----------------------------- Константы: -----------------------------------
#define TCONV 1000 //время преобразования температуры, мс
//---------------------------- Переменные: -----------------------------------
bool Presence; //флаг присутствия термометра
int Temperature; //текущая температура
int TTimer; //таймер термометра
//----------------------------- Функции: -------------------------------------
bool TReset(void); //формирование импульса сброса
char TByte(char dat); //запись/чтение байта
bool TBit(bool b); //запись/чтение бита
bool Start(void); //запуск преобразования
int Read_T(void); //чтение температуры
//--------------------- Генерация импульса сброса: ---------------------------
bool TReset(void)
{
char si;
Port_OWP_0;
Port_OWP_OUT; //OWP <- 0
Delay_us(500); //delay 500 uS
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_IN; //OWP <- 1
Delay_us(14); //delay 14 uS
if(Pin_OWP) //если OWP = 0, то ошибка
{
Delay_us(52); //delay 52 uS
if(!Pin_OWP) //если OWP = 1, то ошибка
{
__restore_interrupt(si); //восстанавление прерываний
Delay_us(250); //delay 250 uS
if(Pin_OWP) //если OWP = 0, то ошибка
{
return(1); //если ошибок нет, термометр присутствует
}
}
}
__restore_interrupt(si); //восстанавление прерываний в случае ошибки
return(0);
}
//-------------- Запись/чтение байта по однопроводной шине: ------------------
char TByte(char dat)
{
char res;
for(char i = 0; i < 8; i++)
{
res = res >> 1;
if(TBit(dat & 1)) res |= 0x80;
else res &= ~0x80;
dat = dat >> 1;
}
return(res);
}
//--------------- Запись/чтение бита по однопроводной шине: ------------------
bool TBit(bool b)
{
char si;
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_0;
Port_OWP_OUT; //OWP <- 0
Delay_us(2); //delay 2 uS
if(b) Port_OWP_IN; //bit = 1, OWP <- 1
Delay_us(13); //delay 13 uS
bool owp = Pin_OWP; //чтение порта
Delay_us(45); //delay 45 uS
Port_OWP_1; //force pullup
Port_OWP_OUT;
__restore_interrupt(si); //восстанавление прерываний
Delay_us(2); //delay 2 uS
return(owp);
}
//----------------------- Запуск преобразования: -----------------------------
bool Start(void)
{
if(TReset())
{
TByte(0xCC); //skip ROM
TByte(0x44); //start conversion
return(1);
}
return(0);
}
//-------------------------- Чтение термометра: ------------------------------
int Read_T(void)
{
if(TReset())
{
TByte(0xCC); //skip ROM
TByte(0xBE); //read scratchpad
char l = TByte(0xFF); //чтение младшего байта
char h = TByte(0xFF); //чтение старшего байта
return(WORD(h, l));
}
return(0); //ошибка
}
//--------------------- Инициализация термометра: ----------------------------
void DS18B20_Init(void)
{
Presence = Start();
TTimer = ms2sys(TCONV);
}
//----------------------- Измерение температуры: -----------------------------
void DS18B20_Exe(bool t)
{
if(t)
{
if(TTimer) TTimer--;
if(!TTimer)
{
if(Presence) Temperature = Read_T();
Presence = Start();
TTimer = ms2sys(TCONV);
}
}
}
//------------------------- Чтение температуры: ------------------------------
int DS18B20_GetT(void)
{
return(Temperature);
}
//----------------------------------------------------------------------------
-
- Где там? mazur(81 знак., 05.12.2010 10:02)
- Там - это в статьях, которые разбросаны в Сети. Например, в статье "Цифровой термометр с датчиками DS1820 или DS1821". - Лeoнид Ивaнoвич(05.12.2010 12:17)
- Где там? mazur(81 знак., 05.12.2010 10:02)