Главная » Статьи » Программирование » Программирование в 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) | | |
Просмотров: 3563 | Комментарии: 1 | |
Всего комментариев: 1 | |
|