'**************************************************************** '* Name : DS18B20.BAS * '* Author : =MiX@$= * '* Notice : =MiX@$= * '* : All Rights Reserved * '* Date : 10.01.2013 * '* Version : 2.0 * '* Notes : Добавлено CRC8 * '* : * '**************************************************************** ' Данный пример можно использовать как с проверкой контрольной суммы, так и без проверки. ' Данные принятые с датчика хранятся в буфере. Clear Device 16F877A ' Использовать микроконтроллер 16F876A Xtal 20 ' Использовать кварцевый генератор на 4 МГц '---------------------------------Настройки подключения ЖКИ--------------------------------- Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно-цифровой Declare LCD_DTPin PORTB.4 ' Порт данных ЖКИ Declare LCD_ENPin PORTB.2 ' Управление цепью E Declare LCD_RSPin PORTB.3 ' Управление цепью RS Declare LCD_Interface 4 ' 4-х битная разрядность шины данных Declare LCD_CommandUs 2000 ' Задержка перед посылкой команды Declare LCD_DataUs 50 ' Задержка перед посылкой данных Declare LCD_Lines 2 ' Количество строк ЖКИ '------------------------------------Настройки портов--------------------------------------- TRISB = %00000110 '======================================Объяление переменных================================= Symbol DQ = PORTB.0 ' Подключить DS18S20 к выводу PORTB.1 Dim Temp As Word ' Переменная для хранения значения температуры Dim rew As Float ' Температура в преобразованном виде Dim Sign As Byte ' Переменная хранит знак температуры "+" или "-" Dim Deg As 223 ' Константа для отображения значка градуса Dim NO_PRES_bit As Bit ' БИТ для определения есть ли датчик на линии '--------------------------------- Переменные для Расчета CRC------------------------------ Dim CRC_DS As Byte ' Расченая контрольная сумма Dim Polynomial As 24 ' Константа полинома Dim i As Byte ' Переменная для цикла Dim f As Byte ' Переменная для цикла Dim Length_DS_Frame As Byte ' Длина фрэйма. Для чтения температуры =8, для id =7 Dim FDback As Byte ' Переменная для расчета CRC Dim DS_temp As Byte ' Промежуточная переменная для ля расчета CRC Dim Buffer_DS[10] As Byte ' Буфер для приема данных от датчика Length_DS_Frame = 8 ' Длина фрэйма. При чтении Темпер = 8, для ID = 7 '------------------------------------------------------------------------------------------ Cls ' Очистить дисплей ЖКИ DelayMS 200 '---------------------------------------Главная программа ----------------------------------- Again: ' Метка начала главной программа '----------------------------Подготовка DS18S20 к измерениям-------------------------- OWrite DQ, 1, NO_PRES, [$CC, $44] ' Послать датчику DS18S20 команду старта измерения температуры ORead DQ, 4, NO_PRES, [NO_PRES_bit] ' Если сигнал присутствия не получен перейти к метке NO_PRES: If NO_PRES_bit=1 Then NO_PRES ' проверяем, есть ли связь с датчиком, если нет, то перезапрос OWrite DQ, 1, NO_PRES, [$CC, $BE] ' Послать датчику DS18S20 команду чтения из ОЗУ датчика значения температуры ORead DQ, 2, NO_PRES, [ Str Buffer_DS \9 ] ' Читать значение температуры и записываем в буфер 9 байт '-----------------------Модуль проверки CRC----------------------------------------------------- 'Данный модуль написан для того, чтобы зрительно определить работает модуль или нет 'для нормальной работы PORTB.1 = 0 If PORTB.1 = 1 Then Length_DS_Frame = 7 ' Просто меняем длину посылки на любое число, после чего CRC расчетное не Else ' совпадает с CRC? которое прилетело от датчика Length_DS_Frame = 8 EndIf GoSub CRC8 ' Отправляемся в метку расчета CRC If CRC_DS <> Buffer_DS[8] Then ' если CRC не совпадает, то читать заново Cls Print At 1,1, "BAD CRC!!!" DelayMS 1000 GoTo Again EndIf '----------------------------------------------------------------------------------------------- '-----------------------Расчет температуры и её индикация на дисплее------------------------ Sign="+" If Temp.15=1 Then minus Temp.LowByte = Buffer_DS[0] Temp.HighByte = Buffer_DS[1] rew=Temp * 0.0625 ' один бит равен 0,0625 гр С GoSub lcd GoTo Again lcd: Print At 1,1, Hex2 CRC_DS, ":", Hex2 Buffer_DS[8],":", Hex2 Temp.HighByte, ":", Hex2 Temp.LowByte Print At 2,1, Sign,Dec rew, Deg, " C " Return minus: Sign="-" rew=$ffff-Temp +1 rew=rew*0.0625 GoSub lcd GoTo Again NO_PRES: Cls Print At 2, 1, "No Device" DelayMS 500 GoTo Again ' Блок расчета циклицески избыточного кода(CRC) CRC8: CRC_DS = 0 For i = 0 To Length_DS_Frame - 1 DS_temp = Buffer_DS[i] For f = 1 To 8 FDback = (CRC_DS ^ DS_temp) & $01 If FDback = $01 Then CRC_DS = CRC_DS ^ Polynomial EndIf CRC_DS = (CRC_DS >> 1) & $7F If FDback = $01 Then CRC_DS = CRC_DS | $80 EndIf DS_temp = DS_temp >> 1 Next Next Return End