DS18B20 — это цифровой датчик температуры, который использует единую шину синхронизации для связи с хостом.. Только 1 Провод необходим для завершения считывания данных о температуре.;
DS18B20 имеет встроенный 64-битный серийный номер продукта для легкой идентификации.. К нескольким датчикам DS18B20 можно подключить 1 Проволока, и через 64-битную аутентификацию личности, информацию о температуре, собранную с разных датчиков, можно считывать отдельно.
Знакомство с DS18B20
2.1 Основные характеристики DS18B20
1. Полностью цифровое преобразование температуры и выходной сигнал.
2. Усовершенствованная передача данных по одной шине.
3. Разрешение до 12 бит, с точностью до ±0,5 градуса Цельсия.
4. Максимальный рабочий цикл при разрешении 12 бит составляет 750 миллисекунды.
5. Можно выбрать паразитный режим работы.
6. Диапазон температур обнаружения –55°C ~+125°C. (–67°F ~+257°F).
7. Встроенный ЭСППЗУ, функция сигнализации ограничения температуры.
8. 64-битовая фотолитография ПЗУ, встроенный серийный номер продукта, удобен для подключения нескольких машин.
9. Различные формы упаковки, адаптироваться к различным аппаратным системам.
2.2 Функция контакта DS18B20
Земля напряжения GND;
Одиночная шина данных DQ;
Напряжение питания VDD;
Пустой контакт NC;
2.3 Принцип работы и применение DS18B20
Обнаружение температуры DS18B20 и вывод цифровых данных полностью интегрированы в один чип., поэтому он имеет более сильную способность защиты от помех. Его один рабочий цикл можно разделить на две части., а именно определение температуры и обработка данных.
18B20 имеет три формы ресурсов памяти.. Они есть: ПЗУ, постоянное запоминающее устройство, используется для хранения кода DS18B20ID; первый 8 биты представляют собой однострочный код серии (Код DS18B20 — 19H.), следующее 48 биты — это уникальный серийный номер чипа; последний 8 биты — это код CRC (проверка резервирования) из вышеперечисленного 56 биты. Данные задаются на производстве и не могут быть изменены пользователем.. DS18B20 имеет в общей сложности 64 биты ПЗУ.
Регистр данных ОЗУ, используется для внутренних расчетов и доступа к данным, данные теряются после сбоя питания, DS18B20 имеет в общей сложности 9 байты оперативной памяти, каждый байт 8 биты. Первый и второй байты представляют собой информацию о значении данных после преобразования температуры.; третий и четвертый байты являются зеркальным отображением EEPROM пользователя. (обычно используется для хранения значений температурных сигналов тревоги). Его значение будет обновлено при перезагрузке питания.. Пятый байт является зеркальным отображением третьей EEPROM пользователя.. 6-й, 7й, и 8-й байт — регистры счета., которые предназначены для того, чтобы пользователи могли получить более высокое температурное разрешение.. Они также являются временными хранилищами для внутреннего преобразования и расчета температуры.. 9-й байт — это CRC-код первого 8 байты. EEPROM — это энергонезависимая память, используемая для хранения данных, которые необходимо сохранять в течение длительного времени., верхние и нижние значения сигнализации температуры, и данные проверки. DS18B20 имеет в общей сложности 3 биты ЭСППЗУ, и в оперативной памяти имеются зеркальные изображения для облегчения работы пользователя.
По умолчанию DS18B20 работает в режиме разрешения 12 бит.. Полученные после преобразования 12-битные данные сохраняются в двух 8-битных ОЗУ DS18B20. (первые два байта). Первый 5 биты в двоичном формате являются знаковыми битами. Если измеренная температура превышает 0, эти 5 биты 0. Просто умножьте измеренное значение на 0.0625 чтобы получить реальную температуру. Если температура ниже 0, эти 5 биты 1. Измеренное значение необходимо инвертировать, добавлено 1, а затем умножить на 0.0625 чтобы получить реальную температуру. Или используйте битовую операцию для извлечения температуры: десятичные знаки занимают нижний 4 биты, а старшие биты являются целочисленными битами (отрицательные числа не учитываются).
2.4 Таблица инструкций ПЗУ чипа DS18B20
1. Чтение ПЗУ [33ЧАС] (шестнадцатеричное командное слово заключено в квадратные скобки).
Эта команда позволяет контроллеру шины читать 64-битное ПЗУ DS18B20.. Эту инструкцию можно использовать только тогда, когда на шине имеется только один DS18B20.. Если подключено более одного, конфликты данных будут возникать во время связи.
2. фиксировать ПЗУ [55ЧАС]
За этой инструкцией следует 64-битный серийный номер, выдаваемый контроллером.. Когда на шине несколько DS18B20, ответить может только чип с тем же серийным номером, что и выданный контроллером, а остальные чипы будут ждать следующего сброса. Данная инструкция подходит для одночипового и многочипового подключения..
3. Пропустить ПЗУ [КСН]
Эта инструкция заставляет чип не реагировать на код ПЗУ.. В случае одного автобуса, эту инструкцию можно использовать для экономии времени. Если эта инструкция используется при подключении нескольких чипов, возникнут конфликты данных, приводящие к ошибкам.
4. Поиск ПЗУ [F0H]
После инициализации чипа, инструкция поиска позволяет идентифицировать 64-битное ПЗУ всех устройств методом исключения при подключении к шине нескольких микросхем.
5. Поиск сигналов тревоги [КАЖДЫЙ]
В случае нескольких чипов, команда поиска сигнального чипа реагирует только на чипы, которые соответствуют условию аварийного сигнала: температура выше TH или ниже TL. Пока чип не выключен, состояние тревоги будет сохраняться до тех пор, пока температура не будет измерена снова и состояние тревоги не будет достигнуто.
6. Написать блокнот [4ЭХ]
Это инструкция для записи данных в ОЗУ.. Два байта данных, записанные впоследствии, будут сохранены по адресу 2 (TH тревожного ОЗУ) и адрес 3 (TL аварийного ОЗУ). Процесс записи может быть прерван сигналом сброса..
7. Читать блокнот (прочитать данные из оперативной памяти) [БЭХ]
Эта инструкция будет читать данные из ОЗУ., начиная с адреса 0 и до адреса 9, завершение чтения всех данных оперативной памяти. Чип позволяет сигналу сброса завершить процесс чтения., то есть, последующие ненужные байты можно игнорировать, чтобы сократить время чтения.
8. Копировать блокнот (скопировать данные RAM в EEPROM) [48ЧАС]
Эта инструкция сохраняет данные в ОЗУ в EEPROM, чтобы данные не были потеряны при отключении питания.. Поскольку чип занят обработкой памяти EEPROM, когда контроллер отправляет временной интервал чтения, выходы шины “0”, и когда работа по хранению будет завершена, автобус выведет “1”.
В паразитном режиме работы, сразу же после выдачи этой инструкции необходимо использовать сильное подтягивание и поддерживать его в течение как минимум 10 мс для поддержания работы чипа..
9. Преобразовать Т (преобразование температуры) [44ЧАС]
После получения этой инструкции, чип выполнит преобразование температуры и сохранит преобразованное значение температуры в 1-м и 2-м адресах ОЗУ.. Поскольку чип занят обработкой преобразования температуры, когда контроллер отправляет временной интервал чтения, выходы шины “0”, и когда работа по хранению будет завершена, автобус выведет “1”. В паразитном режиме работы, сразу же после выдачи этой инструкции необходимо использовать сильное подтягивание и поддерживать его в течение как минимум 500 мс для поддержания работы чипа..
10. Вспомнить EEPROM (Скопируйте значение сигнала тревоги из EEPROM в ОЗУ.) [Б8Х]
Эта инструкция копирует значение сигнала тревоги из EEPROM в 3-й и 4-й байты ОЗУ.. Так как чип занят обработкой копирования, когда контроллер отправляет временной интервал чтения, выходы шины “0”, и когда работа по хранению будет завершена, выходы шины “1”. Кроме того, эта инструкция будет автоматически выполнена при включении чипа и его сбросе.. Таким образом, два бита байта сигнализации в ОЗУ всегда будут зеркальным отображением данных в EEPROM..
11. Прочтите источник питания (Переключатель рабочего режима) [B4H]
После издания этого поручения, выдается разрыв во времени чтения, и чип вернет слово состояния питания. “0” является паразитическим государством власти и “1” это состояние внешней мощности.
2.5 Временная диаграмма DS18B20
2.5.1 Диаграмма взаимосвязи сброса и реакции DS18B20
Сброс необходимо выполнять перед каждым сеансом связи.. Время сброса, время ожидания, и время отклика должно быть строго запрограммировано по таймингу.
Разрыв во времени чтения и записи DS18B20: Чтение и запись данных DS18B20 подтверждается битом обработки временного интервала и командным словом для обмена информацией..
2.5.2 Запись данных 0 и данные 1 к DS18B20
В первые 15 мкс временного интервала записи данных, шина должна быть опущена контроллером, и тогда это будет время выборки чипа для данных шины. Время выборки составляет 15 ~ 60 мкс.. Если контроллер поднимает шину на высокий уровень во время выборки, это значит писать “1”, и если контроллер понизит уровень шины, это значит писать “0”.
Каждый бит передачи должен иметь стартовый бит низкого уровня длительностью не менее 15 мкс., и последующие данные “0” или “1” должно быть завершено в течение 45 мкс.
Время передачи всего бита должно поддерживаться на уровне 60–120 мкс., в противном случае нормальная связь не может быть гарантирована.
Примечание: DS18B20 считывает и записывает данные из младшего бита..
2.5.3 Чтение данных 0 и данные 1 от DS18B20
Время выборки элемента управления во время промежутка времени чтения должно быть более точным.. Во время перерыва во времени чтения, хост также должен генерировать низкий уровень не менее 1 мкс, чтобы указать начало времени чтения.. Затем, через 15 мс после освобождения шины, DS18B20 отправит бит внутренних данных. В это время, если система управления обнаружит, что шина находится на высоком уровне, это значит читать “1”, и если автобус низкий, это означает чтение данных “0”. Прежде чем читать каждый бит, контроллер добавляет сигнал запуска.
Примечание: Бит данных должен быть прочитан в течение 15 мкс после начала перерыва чтения, чтобы обеспечить правильную связь..
Во время общения, 8 кусочки “0” или “1” используются как байт, и чтение или запись байта начинается с младшего бита.
2.5.4 Порядок считывания температуры один раз (на шине только один DS18B20)
1. Отправить сигнал сброса
2. Обнаружить ответный сигнал
3. Отправить 0xCC
4. Отправить 0x44
5. Отправить сигнал сброса
6. Обнаружить ответный сигнал
7. Напишите 0xcc
8. Напишите 0xbe
9. Петля 8 раз, чтобы прочитать младший байт температуры
10. Петля 8 раз, чтобы прочитать старший байт температуры
11. Синтезируйте 16-битные данные о температуре и обрабатывайте их.
3. Код драйвера
3.1 DS18B20.c
#включать “ds18b20.h”
/*
Функция: Инициализация DS18B20
Аппаратное подключение: ПБ15
*/
недействительный DS18B20_Init(пустота)
{
ПКР->APB2ENR|=1<<3; //ПБ
ГПИОБ->ЦРБ&=0x0FFFFFFFF;
ГПИОБ->ЦРБ|=0x30000000;
ГПИОБ->ОДР|=1<<15; //Остановить
}
/*
Функция: Проверьте, существует ли устройство DS18B20.
Возвращаемое значение: 1 означает, что устройства не существует 0 значит устройство нормальное
*/
u8 DS18B20_CheckDevice(пустота) //Содержит импульс сброса, импульс обнаружения
{
DS18B20_OUTPUT_MODE();//Инициализируйте режим вывода
DS18B20_OUT=0; //Генерация импульса сброса
DelayUs(750); //Генерация низкого уровня 750 мкс
DS18B20_OUT=1; //Выпустить автобус
DelayUs(15); //Дождитесь ответа DS18B20.
если(DS18B20_CleckAck())//Обнаружить импульс существования
{
возвращаться 1;
}
возвращаться 0;
}
/*
Функция: Обнаружение импульса существования устройства DS18B20
Возвращаемое значение: 1 указывает на ошибку 0 указывает на нормальный
*/
u8 DS18B20_CleckAck(пустота)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//Инициализируйте режим ввода
пока(DS18B20_IN&&не<200) //Дождитесь импульса существования ответа DS18B20.
{
DelayUs(1);
cnt++;
}
если(не>=200)возвращаться 1; //ошибка
cnt=0;
пока((!DS18B20_IN)&&не<240) //дождитесь, пока DS18B20 освободит шину
{
DelayUs(1);
cnt++;
}
если(не>=240)возвращаться 1; //ошибка
возвращаться 0;
}
/*
Функция: Записать байт
Сначала научись немного писать.
*/
недействительный DS18B20_WriteByte(u8 cmd)
{
ты8 я;
DS18B20_OUTPUT_MODE(); //Инициализируйте режим вывода
для(я = 0;я<8;я++)
{
DS18B20_OUT=0; //Создать разрыв во времени записи (начать запись)
DelayUs(2);
DS18B20_OUT=коммд&0х01; //Отправить фактический бит данных
DelayUs(60); //Дождитесь завершения записи
DS18B20_OUT=1; //Освободите автобус и приготовьтесь к следующей передаче.
cmd>>=1; //Продолжайте отправлять следующий бит данных
}
}
/*
Функция: Прочитать байт
Сначала научись немного читать.
*/
u8 DS18B20_ReadByte(пустота)
{
ты8 я,данные=0;
для(я = 0;я<8;я++)
{
DS18B20_OUTPUT_MODE(); //Инициализируйте режим вывода
DS18B20_OUT=0; //Создать разрыв во времени чтения (начало чтения)
DelayUs(2);
DS18B20_OUT=1; //Выпустить автобус
DS18B20_INPUT_MODE(); //Инициализируйте режим ввода
DelayUs(8); //Дождитесь вывода данных DS18B20.
данные>>=1; //Заполните старший бит 0, по умолчанию 0
если(DS18B20_IN) данные|=0x80;
DelayUs(60);
DS18B20_OUT=1; //Выпустить автобус, дождитесь чтения следующего бита данных
}
возвращать данные;
}
/*
Функция: Прочитайте данные о температуре DS18B20 один раз.
Возвращаемое значение: считываются данные о температуре
Рассмотренная ситуация: К шине подключен только один DS18B20.
*/
u16 DS18B20_ReadTemp(пустота)
{
u16 температура=0;
u8 temp_H,temp_L;
DS18B20_CheckDevice(); //Отправить импульс сброса, обнаружить пульс
DS18B20_WriteByte(0хСС); //Пропустить обнаружение последовательности ПЗУ
DS18B20_WriteByte(0х44); //Запустить преобразование температуры
//Дождитесь завершения преобразования температуры.
пока(DS18B20_ReadByte()!=0xFF){}
DS18B20_CheckDevice(); //Отправить импульс сброса, обнаружить пульс
DS18B20_WriteByte(0хСС); //Пропустить обнаружение последовательности ПЗУ
DS18B20_WriteByte(0xBE); //Считайте температуру
temp_L=DS18B20_ReadByte(); //Чтение данных о низкой температуре
temp_H=DS18B20_ReadByte(); //Чтение данных о высокой температуре
температура = temp_L|(temp_H<<8); //Синтезированная температура
температура возврата;
}
3.2 DS18B20.h
#ifndef DS18B20_H
#определить DS18B20_H
#включать “stm32f10x.h”
#включать “sys.h”
#включать “задержка.ч”
#включать “ds18b20.h”
#включать “usart.h”
/*Интерфейс пакета*/
//Инициализируйте DS18B20 в режиме ввода
#определить DS18B20_INPUT_MODE() {ГПИОБ->ЦРБ&=0x0FFFFFFFF;ГПИОБ->ЦРБ|=0x80000000;}
//Инициализируйте DS18B20 в режиме вывода.
#определить DS18B20_OUTPUT_MODE(){ГПИОБ->ЦРБ&=0x0FFFFFFFF;ГПИОБ->ЦРБ|=0x30000000;}
//Выход порта ввода-вывода DS18B20
#определить DS18B20_OUT PBout(15)
//Входной порт ввода-вывода DS18B20
#определить DS18B20_IN PBin(15)
//Объявление функции
u8 DS18B20_CleckAck(пустота);
u8 DS18B20_CheckDevice(пустота);
недействительный DS18B20_Init(пустота);
u16 DS18B20_ReadTemp(пустота);
u8 DS18B20_ReadByte(пустота);
недействительный DS18B20_WriteByte(u8 cmd);
#конец
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Функция задержки
/*
Функция: Задержка в нас
*/
void DelayUs(в нас)
{
#ifdef _SYSTICK_IRQ_
интервал я,дж;
для(я = 0;iVAL=0; //Значение счетчика CNT
SysTick->НАГРУЗКА=9*нас; //9 значит 1нас
SysTick->CTRL|=1<<0; //Запустить таймер
делать
{
tmp=SysTick->CTRL; //Чтение статуса
}пока((!(tmp&1<<16))&&(tmp&1<<0));
SysTick->ВАЛ=0; //Значение счетчика CNT
SysTick->CTRL&=~(1<<0); //Выключить таймер
#конец
};я++)>
3.4 main.c Вызовите DS18B20, чтобы прочитать температуру и распечатать ее в последовательный порт.
#включать “stm32f10x.h”
#включать “ds18b20.h”
u8 DS18B20_ROM[8]; //Сохраните 64-битный код ПЗУ DS18B20.
int главный(пустота)
{
температура u16;
USARTx_Heat(СШААРТ1,72,115200);//Инициализация последовательного порта 1
DS18B20_Heat(); //Инициализация DS18B20
/*1. Прочтите 64-битный код ПЗУ DS18B20*/.
//Отправить импульс сброса, обнаружить импульс существования
пока(DS18B20_CheckDevice())
{
printf(“Устройство DS18B20 не существует!\н”);
ЗадержкаMs(500);
}
//Отправьте команду для чтения 64-битного кода ПЗУ
DS18B20_WriteByte(0х33);
//Цикл чтения 64-битного кода ПЗУ
для(я = 0;я<8;я++)
{
DS18B20_ROM[я]= DS18B20_ReadByte();
printf(“DS18B20_ROM[%д]=0x%X\n”,я,DS18B20_ROM[я]);
}
пока(1)
{
/*2. Одновременно включите все DS18B20 на шине, чтобы начать преобразование температуры*/
DS18B20_CheckDevice(); //Отправить импульс сброса, обнаружить пульс
DS18B20_WriteByte(0хСС); //Пропустить обнаружение последовательности ПЗУ
DS18B20_WriteByte(0х44); //Запустить преобразование температуры (пусть все DS18B20 на шине преобразуют температуру)
ЗадержкаMs(500); //Дождитесь завершения всех преобразований температуры DS18B20 на линии.
/*3. Единое целевое считывание температуры каждого DS18B20*/
DS18B20_CheckDevice(); //Отправить импульс сброса, обнаружить пульс
DS18B20_WriteByte(0х55); //Отправить команду для соответствия ПЗУ
для(я = 0;я<8;я++) //Отправить 64-битный код
{
DS18B20_WriteByte(DS18B20_ROM[я]);
}
DS18B20_WriteByte(0xBE); //Считайте температуру
темп = DS18B20_ReadByte(); //Чтение данных о температуре низкого порядка
температура|=DS18B20_ReadByte()<<8; //Чтение данных о температуре высокого порядка
printf(“temp1=%d.%d\n”,температура>>4,температура&0xF);
printf(“temp2=%f\n”,температура*0,0625);
ЗадержкаMs(500);
}
}
English
Afrikaans
العربية
বাংলা
bosanski jezik
Български
Català
粤语
中文(简体)
中文(漢字)
Hrvatski
Čeština
Nederlands
Eesti keel
Suomi
Français
Deutsch
Ελληνικά
हिन्दी; हिंदी
Magyar
Bahasa Indonesia
Italiano
日本語
한국어
Latviešu valoda
Lietuvių kalba
македонски јазик
Bahasa Melayu
Norsk
پارسی
Polski
Português
Română
Русский
Cрпски језик
Slovenčina
Slovenščina
Español
Svenska
ภาษาไทย
Türkçe
Українська
اردو
Tiếng Việt







