Главная » Статьи » Proton PICBasic |
Работа с датчиком DS18S20 Существует три типа цифровых температурных датчиков, поэтому обратите внимание на то, о каком датчике здесь идет речь. Это датчики DS1820, DS18S20 и DS18B20. DS18S20 - это преемник DS1820 и отличается отсутствием длительного дрейфа. DS18B20 более совершенен, но учитывая то, что о нем достаточно информации, мы рассмотрим именно DS18S20. В общем случае схема подключения будет выглядеть так: Нижеприведенный код демонстрирует работу с датчиком. Убедитесь в наличии подтягивающего резистора. Допускается подключение нескольких датчиков к одной шине, поскольку каждый датчик имеет уникальный код, по которому он идентифицируется в системе. Для более глубокого понимания процедуры считывания кода обратитесь к документации на датчик. Device 16F877 XTAL 4 Declare LCD_TYPE ALPHA ' Тип ЖКИ Declare LCD_DTPIN PORTB.4 ' Подключение шины данных Declare LCD_RSPIN PORTB.2 ' RS - > PORTB.4 Declare LCD_ENPIN PORTB.3 ' E -> PORTB.5 Declare LCD_LINES 2 ' Число строк ЖКИ Declare LCD_INTERFACE 4 ' Интерфейс передачи - 4-проводный PORTB_PULLUPS = true ALL_DIGITAL = TRUE SYMBOL DQ = Portb.0 'Подключим датчик на PORTA.1 Dim Sign as Byte Dim Cnt as Byte Dim Count_Per_Deg as Byte Dim Temp as Word Dim Temp_Dec as Byte Delayms 150 ' "Прогреем" ЖКИ Cls ' Пошлем команду создания знака градуса Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00 ' на ЖКИ, чтобы можно было при печати 0 видеть символ градуса: ' Print At 1, 1, Value, 0, "Degrees" Again: 'Пошлем команду преобразования температуры OWRITE DQ, 1,[$55,$10,$31,$C5,$C8,$00,$00,$00,$F4,$44] ' FF I1 I2 I3 I4 I5 I6 CRC ' FF - Семейство, Ix - Адрес, ' CRC - Контрольная сумма REPEAT DELAYMS 25 ' Ждем окончания преобразования OREAD DQ,4,[Cnt] ' пока не придет импульс, сигнализирующий UNTIL Cnt <> 0 ' об окончании преобразования 'Посылаем команду начала считывания OWRITE DQ,1,[$55,$10,$31,$C5,$C8,$00,$00,$00,$F4,$BE] ' FF I1 I2 I3 I4 I5 I6 CRC ' FF - Семейство, Ix - Адрес, ' CRC - Контрольная сумма OREAD DQ,2,[Temp.LOWBYTE,Temp.HIGHBYTE,Cnt,Cnt,Cnt,Cnt,Cnt,Count_Per_Deg] 'Каждая переменная Cnt содержит сотые доли градуса, поэтому 100/16 = 6.25: Temp_Dec = (6.25 * Cnt) ' Если 8 бит = 1, то температура отрицательная If Temp.8=1 Then ' Если отрицательная, то пропускаем первый бит и инвертируем значение Temp=(Temp.LowByte ^ $FF) >> 1 ' Если Cnt = 0, то увеличиваем на 1 переменную Temp, поскольку DS18S20 этого не делает If Cnt = 0 then Temp = Temp + 1 ' Изменим признак температуры Sign = "-" Else ' Если положительная, то просто убираем первый бит Temp=(Temp >> 1) ' И устанавливаем признак Sign = "+" ' Инвертируем десятичное значение Temp_Dec = 100 - Temp_Dec Endif ' Отображаем измеренную температуру Print At 1,1, Sign, Dec Temp, ".", Dec DIG Temp_Dec, 1, 0,"C " Goto Again | |
Просмотров: 13604 | | |
Всего комментариев: 0 | |