Главная » Статьи » Программирование » Программирование в BascomAVR

Подключение датчика температуры DS18B20
DS18B20 - Калиброванный цифровой термометр с однопроводным 1-Wire-интерфейсом и перестраиваемой разрядностью преобразования. Диапазон измеряемых температур от -55°C до +125°C. Считываемый с микросхемы цифровой код является результатом непосредственного прямого измерения температуры и не нуждается в дополнительных преобразованиях. Программируемая пользователем разрешающая способность встроенного АЦП может быть изменена в диапазоне от 9 до 12 разрядов выходного кода. Абсолютная погрешность преобразования меньше 0,5°C в диапазоне контролируемых температур -10°C до +85°C. Максимальное время полного 12-ти разрядного преобразования ~750 мс. Энергонезависимая память температурных уставок микросхемы обеспечивает запись произвольных значений верхнего и нижнего контрольных порогов. Кроме того, термометр содержит встроенный логический механизм приоритетной сигнализации в 1-Wire-линию о факте выхода контролируемой им температуры за один из выбранных порогов. Узел 1-Wire-интерфейса компонента организован таким образом, что существует теоретическая возможность адресации неограниченного количества подобных устройств на одной 1-Wire-линии. Термометр имеет индивидуальный 64-разрядный регистрационный номер (групповой код 028Н) и обеспечивает возможность работы без внешнего источника энергии, только за счет паразитного питания 1-Wire-линии. Питание микросхемы через отдельный внешний вывод производится напряжением от 3,0 В до 5,5 В. Термометр размещается в транзисторном корпусе TO-92, или в 8-контактном корпусе SO для поверхностного монтажа (DS18B20Z), или 8-контактном корпусе микро-SOP для поверхностного монтажа (DS18B20U). 
   Выпускается специальная модификация цифрового термометра, предназначенная только для работы в режиме паразитного питания DS18B20-PAR. Она размещается в транзисторном корпусе TO-92, один из выводов которого не используется.

   На плате модуля универсального контроллера есть место под аналоговый датчик TMP36, но туда можно впаять и Ds18b20, впаять как на фото, плоской стороной в сторону светодиодов.


   Выход датчика выведен на штырьевой разъём Jmp16 его проводом соединяем с PORTD.0 и прошиваем мк программой, которая ниже. Все результаты будут выводится на дисплей.

Code
'*******************************************************************************
' Автор: Кирилл (Space)
' Сайт: www.enore.ucoz.ru
' CPU:  ATmega16
' Тактовая частота:  16000000  Hz
' Компилятор: BASCOM-AVR 1.11.9.0
'*******************************************************************************
' Программируемые Fuse:
' SUT0
' BOOTSZ0, BOOTSZ1
' CKORT
' SPIEN
'*******************************************************************************

'***************************Тип_микроконтроллера********************************
$regfile = "m16def.dat"
$crystal = 16000000

'************************Дополнительные библиотеки******************************
$lib "lcd4.lbx"                                             'используем 4-битное подключение дисплея с помощью альтернативной библиотеки

'***********************************Порты***************************************

Config 1wire = Portd.0                                      'Пин, на который повешан DS18B20

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 20 * 4                                         'используем дисплей на 20 символ и 4 строки

Cursor Off                                                  'отключаем курсор
Cls                                                         'очищаем экран дисплея

'****************************Задаём перемнные***********************************

Dim Signtemperatura As String * 1 , Celsium As String * 5 , Fahrenhei As String * 5
Dim Byte0 As Byte , Byte1 As Byte , T As Byte
Dim Temp As Byte , Faren As Byte
Dim Faren0 As Single

'***************************Назначаем процедуры*********************************

Declare Sub Gettemp

'*************************Основной цикл программы*******************************

Do

Call Gettemp                                                'Вызываем процедуру Gettemp

Locate 1 , 1
Lcd "Ёo бe»ДcёЖ******" ; Celsium                            'выводим результат преобразвания Celsium
Locate 2 , 1
Lcd "********************"
Locate 3 , 1
Lcd "********************"
Locate 4 , 1
Lcd "Ёo ЄapeЅґe№їy***" ; Fahrenhei                          'выводим результат преобразвания Fahrenhei
Loop
End



Sub Gettemp                                                 'процедура Gettemp
1wreset
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Waitms 750                                                  ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
Temp = Byte0 / 16                                           ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T = Byte1 * 16                                              ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
Temp = Temp + T                                            ' Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
Faren0 = Temp * 1.8
Faren = Faren0 + 32
Celsium = Signtemperatura + Str(temp) + "C"
Fahrenhei = Signtemperatura + Str(faren) + "F "
End Sub


И следом программа в которой подключается сразу два датчика на один порт.

Code
'*******************************************************************************
' Автор: Кирилл (Space)
' Сайт: www.enore.ucoz.ru
' CPU:  ATmega16
' Тактовая частота:  16000000  Hz
' Компилятор: BASCOM-AVR 1.11.9.0
'*******************************************************************************
' Программируемые Fuse:
' SUT0
' BOOTSZ0, BOOTSZ1
' CKORT
' SPIEN
'*******************************************************************************

'***************************Тип_микроконтроллера********************************
$regfile = "m16def.dat"
$crystal = 16000000

'************************Дополнительные библиотеки******************************

$lib "lcd4.lbx"                                             'используем 4-битное подключение дисплея с помощью альтернативной библиотеки

'***********************************Порты***************************************

Config 1wire = Portd.0                                      'Пин, на который повешан DS18B20

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 20 * 4                                         'используем дисплей на 20 символ и 4 строки

Cursor Off                                                  'отключаем курсор
Cls                                                         'очищаем экран дисплея

'****************************Задаём перемнные***********************************

Dim Signtemperatura As String * 1 , Celsium As String * 5
Dim Byte0 As Byte , Byte1 As Byte , T As Byte
Dim Dsid1(8) As Byte , Dsid2(8) As Byte
Dim Temp As Byte , X As Byte
Dim W As Word

'*******************************************************************************

W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Do
Dsid2(1) = 1wsearchnext()
Loop Until Err = 1

'*******************************************************************************

Do
Gosub Convallt                                              'переходим на подпрограмму подачи запросов в датчик температуры
1wverify Dsid1(1) : X = 1 : Gosub Temperature               '1 ds18b20 выводим на первой(Х=1) строчке дисплея
1wverify Dsid2(1) : X = 2 : Gosub Temperature               '2 ds18b20 выводим на второй(Х=2) строчке дисплея
Loop
End

'*******************************************************************************

Convallt:
1wreset
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Waitms 750                                                  ' Ждем окончания преобразования
Return

'*******************************************************************************

Temperature:
If Err = 0 Then
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
Temp = Byte0 / 16                                           ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T = Byte1 * 16                                              ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
Temp = Temp + T                                             ' Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
Celsium = Signtemperatura + Str(temp) + "C"
Locate X , 1                                                'указываем куда вывести на дисплей
Lcd Celsium
End If
Return

'*******************************************************************************



Здесь можно скачать архив с двумя программами.




Источник: http://enore.ucoz.ru/
Категория: Программирование в BascomAVR | Добавил: Space (16.04.2011) | Автор: Space E W
Просмотров: 3479 | Комментарии: 1 | Теги: подключаем два датчика ds18b20, ds18b20, bascomavr ds18b20, как подключить ds18b20
Всего комментариев: 1
1 Kirill7   (19.12.2023 12:54) [Материал]
Все это конечно очень здорово. Вот только почему то показания термодатчика, +77 градусов при комнатной температуре. Что за шутки?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]